Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Toggle Sale Enab... | 15360289 | 849 days ago | IN | 0 ETH | 0.00133609 | ||||
Toggle Sale Enab... | 15360283 | 849 days ago | IN | 0 ETH | 0.00125926 | ||||
Withdraw | 15360228 | 849 days ago | IN | 0 ETH | 0.00187595 | ||||
Set Base URI | 15357134 | 849 days ago | IN | 0 ETH | 0.0006777 | ||||
Set Base URI | 15357080 | 849 days ago | IN | 0 ETH | 0.00103923 | ||||
Set Base URI | 15357013 | 849 days ago | IN | 0 ETH | 0.00128455 | ||||
Batch Mint | 15356167 | 849 days ago | IN | 0.15 ETH | 0.0008168 | ||||
Batch Mint | 15356031 | 849 days ago | IN | 0.00015 ETH | 0.00031149 | ||||
Batch Mint | 15355980 | 849 days ago | IN | 0.00015 ETH | 0.000215 | ||||
Batch Mint | 15355825 | 849 days ago | IN | 0.15 ETH | 0.00091341 | ||||
Batch Mint | 15355796 | 849 days ago | IN | 0.15 ETH | 0.00077529 | ||||
Toggle Sale Enab... | 15355578 | 849 days ago | IN | 0 ETH | 0.00035702 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15360228 | 849 days ago | 0.45 ETH |
Loading...
Loading
Contract Name:
OmnihorseNFT
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-17 */ /** * ERC721A Contracts v4.1.0 sourced from Chiru Labs * * This contract is developed in conjunction with: * OmniHorse * * Homepage: https://omnihorse.io * Twitter: https://twitter.com/omnihorse_nft * * ============================================================================ * * This contract is a modified ERC721A contract that receives it's pricing * information from our price controller contract, the address can be found * by querying this contract * * If defaultPrice is enabled than this contract's default sale price will * be used instead. */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.16; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } /** * @dev Interface of an ERC721ABurnable compliant contract. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) public view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } /** * @title ERC721A Burnable Token * @dev ERC721A Token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } contract Ownable { /** * @dev Error constants. */ string public constant NOT_CURRENT_OWNER = '018001'; string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = '018002'; /** * @dev Current owner address. */ address public owner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The constructor sets the original `owner` of the contract to the sender account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, NOT_CURRENT_OWNER); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } interface IGetPrice { function getPrice(address, uint256) external returns (uint256); function getOnlyPrice(address, uint256) external view returns (uint256); function setUsed(uint256[] calldata, address, bool) external; function isUsed(uint256) external view returns (bool); function getData(uint256) external view returns (used memory); function getUser(address) external view returns (user memory); struct used { address user; bool used; uint256 timestamp; } struct user { uint256 discount; uint256 claimed; } } contract OmnihorseNFT is ERC721A, Ownable, ERC721ABurnable, ERC721AQueryable { string private _name; string private _symbol; string private baseURI; bool public saleEnabled; bool private defaultSale; uint256 private defaultPrice; uint256 private maxSupply; uint256 public currentSupply; address paymentReceiver; IGetPrice public priceController; mapping(uint256 => bool) public nftUsed; mapping(address => uint8) public claimed; modifier forSale { require(saleEnabled, "Sale not enabled"); _; } constructor( string memory name_, string memory symbol_, string memory baseURI_, address paymentReceiver_ , uint256 defaultPrice_ ) { _name = name_; _symbol = symbol_; baseURI = baseURI_; maxSupply = 100; paymentReceiver = paymentReceiver_; defaultSale = true; defaultPrice = defaultPrice_; } receive() external payable {} /** * @dev Get name of the contract */ function name() public view override(ERC721A, IERC721A) returns (string memory) { return _name; } /** * @dev Get symbol of the contract */ function symbol() public view override(ERC721A, IERC721A) returns (string memory) { return _symbol; } /** * @dev Set price controller */ function setPriceController(address priceController_) public onlyOwner { priceController = IGetPrice(priceController_); } /** * @dev Get price if price controller is disabled */ function getDefaultPrice(uint256 amount_) public view returns(uint256) { require(amount_ > 0, "Cannot mint zero"); return amount_ * defaultPrice; } /** * @dev Check if default sale is enabled */ function isDefaultPrice() public view returns(bool) { return defaultSale; } /** * @dev Admin set default sale state */ function setDefaultSale(bool defaultSale_) public onlyOwner { require(defaultSale_ != defaultSale, "defaultSale already has that value"); defaultSale = defaultSale_; } /** * @dev Get price from price controller contract, and then save NFT voucher and user states * * @return value in wei for user user_ to buy amount_ of NFTs */ function getPrice(address user_, uint256 amount_) internal returns(uint256) { require(amount_ > 0, "Cannot mint zero"); return priceController.getPrice(user_, amount_); } /** * @dev Get price from controller contract without changing state * * @return value in wei for user user_ to buy amount_ of NFTs */ function getOnlyPrice(address user_, uint256 amount_) public view returns(uint256) { require(amount_ > 0, "Cannot mint zero"); return priceController.getOnlyPrice(user_, amount_); } /** * @dev Set the state of one or many specific NFT vouchers * * @param user_ who claimed the airdrop NFT voucher * @param tokenId_ target address that will receive the tokens * @param state_ new state of airdrop voucher NFT */ function setUsed(address user_, uint256[] calldata tokenId_, bool state_) public onlyOwner { priceController.setUsed(tokenId_, user_, state_); } /** * @dev Check the status of a specific NFT voucher * * @param tokenId_ target airdrop NFT voucher id * @return airdrop NFT voucher state */ function isUsed(uint256 tokenId_) external view returns(bool) { return priceController.isUsed(tokenId_); } /** * @dev Get all Data info about a specific NFT voucher * * @param tokenId_ NFT voucher status recorded by the price controller * @return tuple values of Used token */ function getData(uint256 tokenId_) external view returns(IGetPrice.used memory) { return priceController.getData(tokenId_); } /** * @dev Get all User info about a specific user * * @param user_ account recorded by the price controller * @return tuple values of User account */ function getUser(address user_) external view returns(IGetPrice.user memory) { return priceController.getUser(user_); } /** * @dev Get address who recieves payment from mints */ function getPaymentReceiver() external view returns(address) { return paymentReceiver; } /** * @dev Returns the IPFS URI of a specific NFT */ function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return string(abi.encodePacked(_baseURI(), uint2str(tokenId))); } /** * @dev Returns generic base URI */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @dev Increase the number of tokens avalible to mint */ function setMaxSupply(uint256 maxSupply_) public onlyOwner { require(maxSupply_ > maxSupply, "Cannot lower supply"); maxSupply = maxSupply_; } /** * @dev Set the base price of NFTs for sale */ function setdefaultPrice(uint256 defaultPrice_) public onlyOwner { defaultPrice = defaultPrice_; } /** * @dev Set the base URI of the NFT metadata */ function setBaseURI(string memory baseURI_) public onlyOwner { baseURI = baseURI_; } /** * @dev Set address who recieves payment from mints */ function setPaymentReceiver(address account_) public onlyOwner { require(account_ != address(0), "Cannot set zero address"); paymentReceiver = account_; } /** * @dev Toggle to allow for minting NFTs */ function toggleSaleEnable(bool state_) public onlyOwner { require(saleEnabled != state_, "state already set"); saleEnabled = state_; } /** * @dev Batch mint consecutive NFTs to a the soender wallet * Compiles the price of NFTs to be minted using the price controller contract. * Then saves the number of vouchers claimed by the user and the used NFT voucher. */ function batchMint(uint256 amount_) public payable forSale { require(amount_ > 0, "Cannot mint zero"); require(maxSupply >= currentSupply + amount_, "Insufficent supply"); uint256 price = defaultSale ? getDefaultPrice(amount_) : getPrice(msg.sender, amount_); require(msg.value >= price, "Insufficent input amount"); currentSupply += amount_; _safeMint(msg.sender, amount_); } /** * @dev Batch mint to owner */ function reserveGiveaway(uint256 amount_) public onlyOwner { require(amount_ > 0, "Cannot mint zero"); require(maxSupply >= currentSupply + amount_, "Insufficent supply"); currentSupply += amount_; _safeMint(msg.sender, amount_); } /** * @dev Get the lowest indexed NFT id that a user owns * * @param owner target account to check * @return tokenId The first index of a users owned NFTs */ function firstTokenOfOwner(address owner) internal virtual returns (uint256 tokenId) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenId = i; break; } } if(tokenId == 0 && _ownershipAt(0).addr != msg.sender) revert(); } } /** * @dev Batch transfer using specific NFT ids * * @param _address receiving addresses * @param _id ids of NFTs sent */ function batchTransfer(address[] calldata _address, uint256[] calldata _id) public { require(_address.length == _id.length, "address and id must be equal size"); uint256 length = _address.length; for(uint256 i=0; i<length;) { transferFrom(msg.sender, _address[i], _id[i]); unchecked { ++i; } } } function getBlockTime() public view returns(uint256) { return block.timestamp; } /** * @dev Uint256 to String as documented in EIP * * @param _i integer input value * @return _uintAsString string output equivalent to uint input */ function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } /** * @dev Admin can burn token * * @param _contract address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _amount uint256 ID of the token to be transferred */ function burnTokens(address _contract, address _to, uint256 _amount) external onlyOwner { bytes memory payload = abi.encodeWithSignature("transferFrom(address, address, uint256)", address(this), _to, _amount); (bool success, ) = _contract.call(payload); require(success); } /** * @dev Admin withdraw function */ function withdraw() public onlyOwner { (bool success,) = payable(paymentReceiver).call{value: address(this).balance}(""); require(success, "Receiver rejected ETH transfer"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"paymentReceiver_","type":"address"},{"internalType":"uint256","name":"defaultPrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"used","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct IGetPrice.used","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"getDefaultPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"getOnlyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getUser","outputs":[{"components":[{"internalType":"uint256","name":"discount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"internalType":"struct IGetPrice.user","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDefaultPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"isUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceController","outputs":[{"internalType":"contract IGetPrice","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"reserveGiveaway","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":"saleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"defaultSale_","type":"bool"}],"name":"setDefaultSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"setPaymentReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"priceController_","type":"address"}],"name":"setPriceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256[]","name":"tokenId_","type":"uint256[]"},{"internalType":"bool","name":"state_","type":"bool"}],"name":"setUsed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"defaultPrice_","type":"uint256"}],"name":"setdefaultPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state_","type":"bool"}],"name":"toggleSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620062a7380380620062a7833981810160405281019062000037919062000357565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600990816200008991906200067d565b5083600a90816200009b91906200067d565b5082600b9081620000ad91906200067d565b506064600e8190555081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60016101000a81548160ff02191690831515021790555080600d81905550505050505062000764565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200018d8262000142565b810181811067ffffffffffffffff82111715620001af57620001ae62000153565b5b80604052505050565b6000620001c462000124565b9050620001d2828262000182565b919050565b600067ffffffffffffffff821115620001f557620001f462000153565b5b620002008262000142565b9050602081019050919050565b60005b838110156200022d57808201518184015260208101905062000210565b60008484015250505050565b6000620002506200024a84620001d7565b620001b8565b9050828152602081018484840111156200026f576200026e6200013d565b5b6200027c8482856200020d565b509392505050565b600082601f8301126200029c576200029b62000138565b5b8151620002ae84826020860162000239565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002e482620002b7565b9050919050565b620002f681620002d7565b81146200030257600080fd5b50565b6000815190506200031681620002eb565b92915050565b6000819050919050565b62000331816200031c565b81146200033d57600080fd5b50565b600081519050620003518162000326565b92915050565b600080600080600060a086880312156200037657620003756200012e565b5b600086015167ffffffffffffffff81111562000397576200039662000133565b5b620003a58882890162000284565b955050602086015167ffffffffffffffff811115620003c957620003c862000133565b5b620003d78882890162000284565b945050604086015167ffffffffffffffff811115620003fb57620003fa62000133565b5b620004098882890162000284565b93505060606200041c8882890162000305565b92505060806200042f8882890162000340565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048f57607f821691505b602082108103620004a557620004a462000447565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200050f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d0565b6200051b8683620004d0565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200055e6200055862000552846200031c565b62000533565b6200031c565b9050919050565b6000819050919050565b6200057a836200053d565b62000592620005898262000565565b848454620004dd565b825550505050565b600090565b620005a96200059a565b620005b68184846200056f565b505050565b5b81811015620005de57620005d26000826200059f565b600181019050620005bc565b5050565b601f8211156200062d57620005f781620004ab565b6200060284620004c0565b8101602085101562000612578190505b6200062a6200062185620004c0565b830182620005bb565b50505b505050565b600082821c905092915050565b6000620006526000198460080262000632565b1980831691505092915050565b60006200066d83836200063f565b9150826002028217905092915050565b62000688826200043c565b67ffffffffffffffff811115620006a457620006a362000153565b5b620006b0825462000476565b620006bd828285620005e2565b600060209050601f831160018114620006f55760008415620006e0578287015190505b620006ec85826200065f565b8655506200075c565b601f1984166200070586620004ab565b60005b828110156200072f5784890151825560018201915060208501945060208101905062000708565b868310156200074f57848901516200074b601f8916826200063f565b8355505b6001600288020188555050505b505050505050565b615b3380620007746000396000f3fe6080604052600436106102b25760003560e01c80638467be0d11610175578063a40f1aa5116100dc578063c884ef8311610095578063edae89cb1161006f578063edae89cb14610b2a578063f2fde38b14610b67578063f3fe3bc314610b90578063f4b22a5314610bbb576102b9565b8063c884ef8314610a85578063d07547f514610ac2578063e985e9c514610aed576102b9565b8063a40f1aa514610951578063a622dce21461097a578063b214c989146109a5578063b88d4fde146109e2578063c23dc68f14610a0b578063c87b56dd14610a48576102b9565b8063960ca5981161012e578063960ca5981461084557806399a2557a1461086e5780639cca2766146108ab578063a22cb465146108d4578063a25d122d146108fd578063a2e18cb514610928576102b9565b80638467be0d14610754578063860d248a1461077057806387ceff091461079b57806388d695b2146107c65780638da5cb5b146107ef57806395d89b411461081a576102b9565b806342842e0e116102195780636f77926b116101d25780636f77926b1461061e5780636f8b44b01461065b57806370a082311461068457806371b9b646146106c1578063771282f6146106ec5780638462151c14610717576102b9565b806342842e0e1461050057806342966c681461052957806355f804b3146105525780635bbb21771461057b5780636352211e146105b857806365ebf99a146105f5576102b9565b8063223d65d41161026b578063223d65d4146103f457806323b872dd14610431578063336ccba51461045a5780633ccfd60b146104975780633f849820146104ae578063423c3a48146104d7576102b9565b80630178fe3f146102be57806301ffc9a7146102fb57806306fdde0314610338578063081812fc14610363578063095ea7b3146103a057806318160ddd146103c9576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613f63565b610be4565b6040516102f2919061403d565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d91906140b0565b610c8f565b60405161032f91906140ec565b60405180910390f35b34801561034457600080fd5b5061034d610d21565b60405161035a9190614197565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613f63565b610db3565b60405161039791906141c8565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061420f565b610e2f565b005b3480156103d557600080fd5b506103de610f70565b6040516103eb919061425e565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613f63565b610f87565b60405161042891906140ec565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190614279565b610fa7565b005b34801561046657600080fd5b50610481600480360381019061047c9190613f63565b6112c9565b60405161048e91906140ec565b60405180910390f35b3480156104a357600080fd5b506104ac61136e565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906142cc565b611508565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190614279565b611615565b005b34801561050c57600080fd5b5061052760048036038101906105229190614279565b6117f2565b005b34801561053557600080fd5b50610550600480360381019061054b9190613f63565b611812565b005b34801561055e57600080fd5b506105796004803603810190610574919061442e565b611820565b005b34801561058757600080fd5b506105a2600480360381019061059d919061453f565b6118fc565b6040516105af91906146cd565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da9190613f63565b6119bd565b6040516105ec91906141c8565b60405180910390f35b34801561060157600080fd5b5061061c600480360381019061061791906142cc565b6119cf565b005b34801561062a57600080fd5b50610645600480360381019061064091906142cc565b611b4b565b604051610652919061471e565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613f63565b611bf5565b005b34801561069057600080fd5b506106ab60048036038101906106a691906142cc565b611d0c565b6040516106b8919061425e565b60405180910390f35b3480156106cd57600080fd5b506106d6611dc4565b6040516106e391906140ec565b60405180910390f35b3480156106f857600080fd5b50610701611dd7565b60405161070e919061425e565b60405180910390f35b34801561072357600080fd5b5061073e600480360381019061073991906142cc565b611ddd565b60405161074b91906147e8565b60405180910390f35b61076e60048036038101906107699190613f63565b611f20565b005b34801561077c57600080fd5b5061078561209f565b6040516107929190614197565b60405180910390f35b3480156107a757600080fd5b506107b06120d8565b6040516107bd919061425e565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e891906148bb565b6120e0565b005b3480156107fb57600080fd5b50610804612199565b60405161081191906141c8565b60405180910390f35b34801561082657600080fd5b5061082f6121bf565b60405161083c9190614197565b60405180910390f35b34801561085157600080fd5b5061086c60048036038101906108679190613f63565b612251565b005b34801561087a57600080fd5b506108956004803603810190610890919061493c565b612324565b6040516108a291906147e8565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd91906149bb565b612530565b005b3480156108e057600080fd5b506108fb60048036038101906108f691906149e8565b61266b565b005b34801561090957600080fd5b506109126127e2565b60405161091f9190614a87565b60405180910390f35b34801561093457600080fd5b5061094f600480360381019061094a9190614aa2565b612808565b005b34801561095d57600080fd5b5061097860048036038101906109739190613f63565b61296a565b005b34801561098657600080fd5b5061098f612aee565b60405161099c91906140ec565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190613f63565b612b05565b6040516109d9919061425e565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a049190614bb7565b612b5e565b005b348015610a1757600080fd5b50610a326004803603810190610a2d9190613f63565b612bd1565b604051610a3f9190614c8f565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a9190613f63565b612c3b565b604051610a7c9190614197565b60405180910390f35b348015610a9157600080fd5b50610aac6004803603810190610aa791906142cc565b612cb4565b604051610ab99190614cc6565b60405180910390f35b348015610ace57600080fd5b50610ad7612cd4565b604051610ae491906141c8565b60405180910390f35b348015610af957600080fd5b50610b146004803603810190610b0f9190614ce1565b612cfe565b604051610b2191906140ec565b60405180910390f35b348015610b3657600080fd5b50610b516004803603810190610b4c919061420f565b612d92565b604051610b5e919061425e565b60405180910390f35b348015610b7357600080fd5b50610b8e6004803603810190610b8991906142cc565b612e7c565b005b348015610b9c57600080fd5b50610ba56130ae565b604051610bb29190614197565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd91906149bb565b6130e7565b005b610bec613e77565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178fe3f836040518263ffffffff1660e01b8152600401610c47919061425e565b606060405180830381865afa158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c889190614dc9565b9050919050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060098054610d3090614e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5c90614e25565b8015610da95780601f10610d7e57610100808354040283529160200191610da9565b820191906000526020600020905b815481529060010190602001808311610d8c57829003601f168201915b5050505050905090565b6000610dbe82613222565b610df4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e3a826119bd565b90508073ffffffffffffffffffffffffffffffffffffffff16610e5b613281565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe57610e8781610e82613281565b612cfe565b610ebd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f7a613289565b6001546000540303905090565b60126020528060005260406000206000915054906101000a900460ff1681565b6000610fb28261328e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611019576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110258461335a565b9150915061103b8187611036613281565b61337c565b611087576110508661104b613281565b612cfe565b611086576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110fa86868660016133c0565b801561110557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111d3856111af8888876133c6565b7c0200000000000000000000000000000000000000000000000000000000176133ee565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036112595760006001850190506000600460008381526020019081526020016000205403611257576000548114611256578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112c18686866001613419565b505050505050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663336ccba5836040518263ffffffff1660e01b8152600401611326919061425e565b602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113679190614e56565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d9190614197565b60405180910390fd5b506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161147f90614eb4565b60006040518083038185875af1925050503d80600081146114bc576040519150601f19603f3d011682016040523d82523d6000602084013e6114c1565b606091505b5050905080611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90614f15565b60405180910390fd5b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c79190614197565b60405180910390fd5b5080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49190614197565b60405180910390fd5b5060003083836040516024016116f593929190614f35565b6040516020818303038152906040527fb642fe57000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008473ffffffffffffffffffffffffffffffffffffffff168260405161179b9190614fa8565b6000604051808303816000865af19150503d80600081146117d8576040519150601f19603f3d011682016040523d82523d6000602084013e6117dd565b606091505b50509050806117eb57600080fd5b5050505050565b61180d83838360405180602001604052806000815250612b5e565b505050565b61181d81600161341f565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df9190614197565b60405180910390fd5b5080600b90816118f89190615161565b5050565b606060008251905060008167ffffffffffffffff8111156119205761191f614303565b5b60405190808252806020026020018201604052801561195957816020015b611946613eb0565b81526020019060019003908161193e5790505b50905060005b8281146119b25761198985828151811061197c5761197b615233565b5b6020026020010151612bd1565b82828151811061199c5761199b615233565b5b602002602001018190525080600101905061195f565b508092505050919050565b60006119c88261328e565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e9190614197565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906152ae565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b53613eff565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f77926b836040518263ffffffff1660e01b8152600401611bae91906141c8565b6040805180830381865afa158015611bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bee919061531e565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49190614197565b60405180910390fd5b50600e548111611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990615397565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d73576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600c60009054906101000a900460ff1681565b600f5481565b60606000806000611ded85611d0c565b905060008167ffffffffffffffff811115611e0b57611e0a614303565b5b604051908082528060200260200182016040528015611e395781602001602082028036833780820191505090505b509050611e44613eb0565b6000611e4e613289565b90505b838614611f1257611e6181613671565b91508160400151611f0757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611eac57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f065780838780600101985081518110611ef957611ef8615233565b5b6020026020010181815250505b5b806001019050611e51565b508195505050505050919050565b600c60009054906101000a900460ff16611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690615403565b60405180910390fd5b60008111611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061546f565b60405180910390fd5b80600f54611fc091906154be565b600e541015612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb9061553e565b60405180910390fd5b6000600c60019054906101000a900460ff1661202957612024338361369c565b612033565b61203282612b05565b5b905080341015612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f906155aa565b60405180910390fd5b81600f600082825461208a91906154be565b9250508190555061209b3383613788565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600042905090565b818190508484905014612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061563c565b60405180910390fd5b600084849050905060005b81811015612191576121863387878481811061215257612151615233565b5b905060200201602081019061216791906142cc565b86868581811061217a57612179615233565b5b90506020020135610fa7565b806001019050612133565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546121ce90614e25565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa90614e25565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b5050505050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123109190614197565b60405180910390fd5b5080600d8190555050565b606081831061235f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061236a6137a6565b9050612374613289565b85101561238657612383613289565b94505b80841115612392578093505b600061239d87611d0c565b9050848610156123c05760008686039050818110156123ba578091505b506123c5565b600090505b60008167ffffffffffffffff8111156123e1576123e0614303565b5b60405190808252806020026020018201604052801561240f5781602001602082028036833780820191505090505b509050600082036124265780945050505050612529565b600061243188612bd1565b90506000816040015161244657816000015190505b60008990505b88811415801561245c5750848714155b1561251b5761246a81613671565b9250826040015161251057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146124b557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361250f578084888060010199508151811061250257612501615233565b5b6020026020010181815250505b5b80600101905061244c565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef9190614197565b60405180910390fd5b50801515600c60009054906101000a900460ff1615150361264e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612645906156a8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b612673613281565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006126e4613281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612791613281565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127d691906140ec565b60405180910390a35050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79190614197565b60405180910390fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c376fbfe848487856040518563ffffffff1660e01b81526004016129329493929190615732565b600060405180830381600087803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b5050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a299190614197565b60405180910390fd5b5060008111612a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6d9061546f565b60405180910390fd5b80600f54612a8491906154be565b600e541015612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf9061553e565b60405180910390fd5b80600f6000828254612ada91906154be565b92505081905550612aeb3382613788565b50565b6000600c60019054906101000a900460ff16905090565b6000808211612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b409061546f565b60405180910390fd5b600d5482612b579190615772565b9050919050565b612b69848484610fa7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bcb57612b94848484846137af565b612bca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612bd9613eb0565b612be1613eb0565b612be9613289565b831080612bfd5750612bf96137a6565b8310155b15612c0b5780915050612c36565b612c1483613671565b9050806040015115612c295780915050612c36565b612c32836138ff565b9150505b919050565b6060612c4682613222565b612c7c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c8461391f565b612c8d836139b1565b604051602001612c9e929190615808565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808211612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061546f565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663edae89cb84846040518363ffffffff1660e01b8152600401612e3392919061582c565b602060405180830381865afa158015612e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e749190615855565b905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b9190614197565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe49190614197565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a69190614197565b60405180910390fd5b50600c60019054906101000a900460ff16151581151503613205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fc906158f4565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008161322d613289565b1115801561323c575060005482105b801561327a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061329d613289565b11613323576000548110156133225760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613320575b600081036133165760046000836001900393508381526020019081526020016000205490506132ec565b8092505050613355565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86133dd868684613b39565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600061342a8361328e565b9050600081905060008061343d8661335a565b9150915084156134a6576134598184613454613281565b61337c565b6134a55761346e83613469613281565b612cfe565b6134a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6134b48360008860016133c0565b80156134bf57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061356783613524856000886133c6565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176133ee565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036135ed57600060018701905060006004600083815260200190815260200160002054036135eb5760005481146135ea578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613657836000886001613419565b600160008154809291906001019190505550505050505050565b613679613eb0565b6136956004600084815260200190815260200160002054613b42565b9050919050565b60008082116136e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d79061546f565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449e815d84846040518363ffffffff1660e01b815260040161373d92919061582c565b6020604051808303816000875af115801561375c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137809190615855565b905092915050565b6137a2828260405180602001604052806000815250613bf8565b5050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137d5613281565b8786866040518563ffffffff1660e01b81526004016137f7949392919061595e565b6020604051808303816000875af192505050801561383357506040513d601f19601f8201168201806040525081019061383091906159bf565b60015b6138ac573d8060008114613863576040519150601f19603f3d011682016040523d82523d6000602084013e613868565b606091505b5060008151036138a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b613907613eb0565b6139186139138361328e565b613b42565b9050919050565b6060600b805461392e90614e25565b80601f016020809104026020016040519081016040528092919081815260200182805461395a90614e25565b80156139a75780601f1061397c576101008083540402835291602001916139a7565b820191906000526020600020905b81548152906001019060200180831161398a57829003601f168201915b5050505050905090565b6060600082036139f8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b34565b600082905060005b60008214613a2a578080613a13906159ec565b915050600a82613a239190615a63565b9150613a00565b60008167ffffffffffffffff811115613a4657613a45614303565b5b6040519080825280601f01601f191660200182016040528015613a785781602001600182028036833780820191505090505b50905060008290505b60008614613b2c57600181613a969190615a94565b90506000600a8088613aa89190615a63565b613ab29190615772565b87613abd9190615a94565b6030613ac99190615ac8565b905060008160f81b905080848481518110613ae757613ae6615233565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88613b239190615a63565b97505050613a81565b819450505050505b919050565b60009392505050565b613b4a613eb0565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b613c028383613c95565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613c9057600080549050600083820390505b613c4260008683806001019450866137af565b613c78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613c2f578160005414613c8d57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613d01576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613d3b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d4860008483856133c0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613dbf83613db060008660006133c6565b613db985613e67565b176133ee565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613de357806000819055505050613e626000848385613419565b505050565b60006001821460e11b9050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613f4081613f2d565b8114613f4b57600080fd5b50565b600081359050613f5d81613f37565b92915050565b600060208284031215613f7957613f78613f23565b5b6000613f8784828501613f4e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fbb82613f90565b9050919050565b613fcb81613fb0565b82525050565b60008115159050919050565b613fe681613fd1565b82525050565b613ff581613f2d565b82525050565b6060820160008201516140116000850182613fc2565b5060208201516140246020850182613fdd565b5060408201516140376040850182613fec565b50505050565b60006060820190506140526000830184613ffb565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61408d81614058565b811461409857600080fd5b50565b6000813590506140aa81614084565b92915050565b6000602082840312156140c6576140c5613f23565b5b60006140d48482850161409b565b91505092915050565b6140e681613fd1565b82525050565b600060208201905061410160008301846140dd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614141578082015181840152602081019050614126565b60008484015250505050565b6000601f19601f8301169050919050565b600061416982614107565b6141738185614112565b9350614183818560208601614123565b61418c8161414d565b840191505092915050565b600060208201905081810360008301526141b1818461415e565b905092915050565b6141c281613fb0565b82525050565b60006020820190506141dd60008301846141b9565b92915050565b6141ec81613fb0565b81146141f757600080fd5b50565b600081359050614209816141e3565b92915050565b6000806040838503121561422657614225613f23565b5b6000614234858286016141fa565b925050602061424585828601613f4e565b9150509250929050565b61425881613f2d565b82525050565b6000602082019050614273600083018461424f565b92915050565b60008060006060848603121561429257614291613f23565b5b60006142a0868287016141fa565b93505060206142b1868287016141fa565b92505060406142c286828701613f4e565b9150509250925092565b6000602082840312156142e2576142e1613f23565b5b60006142f0848285016141fa565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61433b8261414d565b810181811067ffffffffffffffff8211171561435a57614359614303565b5b80604052505050565b600061436d613f19565b90506143798282614332565b919050565b600067ffffffffffffffff82111561439957614398614303565b5b6143a28261414d565b9050602081019050919050565b82818337600083830152505050565b60006143d16143cc8461437e565b614363565b9050828152602081018484840111156143ed576143ec6142fe565b5b6143f88482856143af565b509392505050565b600082601f830112614415576144146142f9565b5b81356144258482602086016143be565b91505092915050565b60006020828403121561444457614443613f23565b5b600082013567ffffffffffffffff81111561446257614461613f28565b5b61446e84828501614400565b91505092915050565b600067ffffffffffffffff82111561449257614491614303565b5b602082029050602081019050919050565b600080fd5b60006144bb6144b684614477565b614363565b905080838252602082019050602084028301858111156144de576144dd6144a3565b5b835b8181101561450757806144f38882613f4e565b8452602084019350506020810190506144e0565b5050509392505050565b600082601f830112614526576145256142f9565b5b81356145368482602086016144a8565b91505092915050565b60006020828403121561455557614554613f23565b5b600082013567ffffffffffffffff81111561457357614572613f28565b5b61457f84828501614511565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6145d1816145b4565b82525050565b600062ffffff82169050919050565b6145ef816145d7565b82525050565b60808201600082015161460b6000850182613fc2565b50602082015161461e60208501826145c8565b5060408201516146316040850182613fdd565b50606082015161464460608501826145e6565b50505050565b600061465683836145f5565b60808301905092915050565b6000602082019050919050565b600061467a82614588565b6146848185614593565b935061468f836145a4565b8060005b838110156146c05781516146a7888261464a565b97506146b283614662565b925050600181019050614693565b5085935050505092915050565b600060208201905081810360008301526146e7818461466f565b905092915050565b6040820160008201516147056000850182613fec565b5060208201516147186020850182613fec565b50505050565b600060408201905061473360008301846146ef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006147718383613fec565b60208301905092915050565b6000602082019050919050565b600061479582614739565b61479f8185614744565b93506147aa83614755565b8060005b838110156147db5781516147c28882614765565b97506147cd8361477d565b9250506001810190506147ae565b5085935050505092915050565b60006020820190508181036000830152614802818461478a565b905092915050565b600080fd5b60008083601f840112614825576148246142f9565b5b8235905067ffffffffffffffff8111156148425761484161480a565b5b60208301915083602082028301111561485e5761485d6144a3565b5b9250929050565b60008083601f84011261487b5761487a6142f9565b5b8235905067ffffffffffffffff8111156148985761489761480a565b5b6020830191508360208202830111156148b4576148b36144a3565b5b9250929050565b600080600080604085870312156148d5576148d4613f23565b5b600085013567ffffffffffffffff8111156148f3576148f2613f28565b5b6148ff8782880161480f565b9450945050602085013567ffffffffffffffff81111561492257614921613f28565b5b61492e87828801614865565b925092505092959194509250565b60008060006060848603121561495557614954613f23565b5b6000614963868287016141fa565b935050602061497486828701613f4e565b925050604061498586828701613f4e565b9150509250925092565b61499881613fd1565b81146149a357600080fd5b50565b6000813590506149b58161498f565b92915050565b6000602082840312156149d1576149d0613f23565b5b60006149df848285016149a6565b91505092915050565b600080604083850312156149ff576149fe613f23565b5b6000614a0d858286016141fa565b9250506020614a1e858286016149a6565b9150509250929050565b6000819050919050565b6000614a4d614a48614a4384613f90565b614a28565b613f90565b9050919050565b6000614a5f82614a32565b9050919050565b6000614a7182614a54565b9050919050565b614a8181614a66565b82525050565b6000602082019050614a9c6000830184614a78565b92915050565b60008060008060608587031215614abc57614abb613f23565b5b6000614aca878288016141fa565b945050602085013567ffffffffffffffff811115614aeb57614aea613f28565b5b614af787828801614865565b93509350506040614b0a878288016149a6565b91505092959194509250565b600067ffffffffffffffff821115614b3157614b30614303565b5b614b3a8261414d565b9050602081019050919050565b6000614b5a614b5584614b16565b614363565b905082815260208101848484011115614b7657614b756142fe565b5b614b818482856143af565b509392505050565b600082601f830112614b9e57614b9d6142f9565b5b8135614bae848260208601614b47565b91505092915050565b60008060008060808587031215614bd157614bd0613f23565b5b6000614bdf878288016141fa565b9450506020614bf0878288016141fa565b9350506040614c0187828801613f4e565b925050606085013567ffffffffffffffff811115614c2257614c21613f28565b5b614c2e87828801614b89565b91505092959194509250565b608082016000820151614c506000850182613fc2565b506020820151614c6360208501826145c8565b506040820151614c766040850182613fdd565b506060820151614c8960608501826145e6565b50505050565b6000608082019050614ca46000830184614c3a565b92915050565b600060ff82169050919050565b614cc081614caa565b82525050565b6000602082019050614cdb6000830184614cb7565b92915050565b60008060408385031215614cf857614cf7613f23565b5b6000614d06858286016141fa565b9250506020614d17858286016141fa565b9150509250929050565b600080fd5b600081519050614d35816141e3565b92915050565b600081519050614d4a8161498f565b92915050565b600081519050614d5f81613f37565b92915050565b600060608284031215614d7b57614d7a614d21565b5b614d856060614363565b90506000614d9584828501614d26565b6000830152506020614da984828501614d3b565b6020830152506040614dbd84828501614d50565b60408301525092915050565b600060608284031215614ddf57614dde613f23565b5b6000614ded84828501614d65565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e3d57607f821691505b602082108103614e5057614e4f614df6565b5b50919050565b600060208284031215614e6c57614e6b613f23565b5b6000614e7a84828501614d3b565b91505092915050565b600081905092915050565b50565b6000614e9e600083614e83565b9150614ea982614e8e565b600082019050919050565b6000614ebf82614e91565b9150819050919050565b7f52656365697665722072656a656374656420455448207472616e736665720000600082015250565b6000614eff601e83614112565b9150614f0a82614ec9565b602082019050919050565b60006020820190508181036000830152614f2e81614ef2565b9050919050565b6000606082019050614f4a60008301866141b9565b614f5760208301856141b9565b614f64604083018461424f565b949350505050565b600081519050919050565b6000614f8282614f6c565b614f8c8185614e83565b9350614f9c818560208601614123565b80840191505092915050565b6000614fb48284614f77565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026150217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614fe4565b61502b8683614fe4565b95508019841693508086168417925050509392505050565b600061505e61505961505484613f2d565b614a28565b613f2d565b9050919050565b6000819050919050565b61507883615043565b61508c61508482615065565b848454614ff1565b825550505050565b600090565b6150a1615094565b6150ac81848461506f565b505050565b5b818110156150d0576150c5600082615099565b6001810190506150b2565b5050565b601f821115615115576150e681614fbf565b6150ef84614fd4565b810160208510156150fe578190505b61511261510a85614fd4565b8301826150b1565b50505b505050565b600082821c905092915050565b60006151386000198460080261511a565b1980831691505092915050565b60006151518383615127565b9150826002028217905092915050565b61516a82614107565b67ffffffffffffffff81111561518357615182614303565b5b61518d8254614e25565b6151988282856150d4565b600060209050601f8311600181146151cb57600084156151b9578287015190505b6151c38582615145565b86555061522b565b601f1984166151d986614fbf565b60005b82811015615201578489015182556001820191506020850194506020810190506151dc565b8683101561521e578489015161521a601f891682615127565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f7420736574207a65726f2061646472657373000000000000000000600082015250565b6000615298601783614112565b91506152a382615262565b602082019050919050565b600060208201905081810360008301526152c78161528b565b9050919050565b6000604082840312156152e4576152e3614d21565b5b6152ee6040614363565b905060006152fe84828501614d50565b600083015250602061531284828501614d50565b60208301525092915050565b60006040828403121561533457615333613f23565b5b6000615342848285016152ce565b91505092915050565b7f43616e6e6f74206c6f77657220737570706c7900000000000000000000000000600082015250565b6000615381601383614112565b915061538c8261534b565b602082019050919050565b600060208201905081810360008301526153b081615374565b9050919050565b7f53616c65206e6f7420656e61626c656400000000000000000000000000000000600082015250565b60006153ed601083614112565b91506153f8826153b7565b602082019050919050565b6000602082019050818103600083015261541c816153e0565b9050919050565b7f43616e6e6f74206d696e74207a65726f00000000000000000000000000000000600082015250565b6000615459601083614112565b915061546482615423565b602082019050919050565b600060208201905081810360008301526154888161544c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006154c982613f2d565b91506154d483613f2d565b92508282019050808211156154ec576154eb61548f565b5b92915050565b7f496e737566666963656e7420737570706c790000000000000000000000000000600082015250565b6000615528601283614112565b9150615533826154f2565b602082019050919050565b600060208201905081810360008301526155578161551b565b9050919050565b7f496e737566666963656e7420696e70757420616d6f756e740000000000000000600082015250565b6000615594601883614112565b915061559f8261555e565b602082019050919050565b600060208201905081810360008301526155c381615587565b9050919050565b7f6164647265737320616e64206964206d75737420626520657175616c2073697a60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000615626602183614112565b9150615631826155ca565b604082019050919050565b6000602082019050818103600083015261565581615619565b9050919050565b7f737461746520616c726561647920736574000000000000000000000000000000600082015250565b6000615692601183614112565b915061569d8261565c565b602082019050919050565b600060208201905081810360008301526156c181615685565b9050919050565b600080fd5b82818337505050565b60006156e28385614744565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115615715576157146156c8565b5b6020830292506157268385846156cd565b82840190509392505050565b6000606082019050818103600083015261574d8186886156d6565b905061575c60208301856141b9565b61576960408301846140dd565b95945050505050565b600061577d82613f2d565b915061578883613f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157c1576157c061548f565b5b828202905092915050565b600081905092915050565b60006157e282614107565b6157ec81856157cc565b93506157fc818560208601614123565b80840191505092915050565b600061581482856157d7565b915061582082846157d7565b91508190509392505050565b600060408201905061584160008301856141b9565b61584e602083018461424f565b9392505050565b60006020828403121561586b5761586a613f23565b5b600061587984828501614d50565b91505092915050565b7f64656661756c7453616c6520616c72656164792068617320746861742076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006158de602283614112565b91506158e982615882565b604082019050919050565b6000602082019050818103600083015261590d816158d1565b9050919050565b600082825260208201905092915050565b600061593082614f6c565b61593a8185615914565b935061594a818560208601614123565b6159538161414d565b840191505092915050565b600060808201905061597360008301876141b9565b61598060208301866141b9565b61598d604083018561424f565b818103606083015261599f8184615925565b905095945050505050565b6000815190506159b981614084565b92915050565b6000602082840312156159d5576159d4613f23565b5b60006159e3848285016159aa565b91505092915050565b60006159f782613f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2957615a2861548f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a6e82613f2d565b9150615a7983613f2d565b925082615a8957615a88615a34565b5b828204905092915050565b6000615a9f82613f2d565b9150615aaa83613f2d565b9250828203905081811115615ac257615ac161548f565b5b92915050565b6000615ad382614caa565b9150615ade83614caa565b9250828201905060ff811115615af757615af661548f565b5b9291505056fea26469706673582212209ec1321dafb0fe88f55ab1517915b68fe167a7fd5b5b706f0423e957e16dac0564736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000001f6938319f4873e84842c6f627496ab325b36e8f0000000000000000000000000000000000000000000000000214e8348c4f0000000000000000000000000000000000000000000000000000000000000000000e4f6d6e69686f727365205465737400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056d546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6557627651426b646b426548466477534b5731724a74586263726b70517a4d45526439583748544665706a482f00000000000000000000
Deployed Bytecode
0x6080604052600436106102b25760003560e01c80638467be0d11610175578063a40f1aa5116100dc578063c884ef8311610095578063edae89cb1161006f578063edae89cb14610b2a578063f2fde38b14610b67578063f3fe3bc314610b90578063f4b22a5314610bbb576102b9565b8063c884ef8314610a85578063d07547f514610ac2578063e985e9c514610aed576102b9565b8063a40f1aa514610951578063a622dce21461097a578063b214c989146109a5578063b88d4fde146109e2578063c23dc68f14610a0b578063c87b56dd14610a48576102b9565b8063960ca5981161012e578063960ca5981461084557806399a2557a1461086e5780639cca2766146108ab578063a22cb465146108d4578063a25d122d146108fd578063a2e18cb514610928576102b9565b80638467be0d14610754578063860d248a1461077057806387ceff091461079b57806388d695b2146107c65780638da5cb5b146107ef57806395d89b411461081a576102b9565b806342842e0e116102195780636f77926b116101d25780636f77926b1461061e5780636f8b44b01461065b57806370a082311461068457806371b9b646146106c1578063771282f6146106ec5780638462151c14610717576102b9565b806342842e0e1461050057806342966c681461052957806355f804b3146105525780635bbb21771461057b5780636352211e146105b857806365ebf99a146105f5576102b9565b8063223d65d41161026b578063223d65d4146103f457806323b872dd14610431578063336ccba51461045a5780633ccfd60b146104975780633f849820146104ae578063423c3a48146104d7576102b9565b80630178fe3f146102be57806301ffc9a7146102fb57806306fdde0314610338578063081812fc14610363578063095ea7b3146103a057806318160ddd146103c9576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613f63565b610be4565b6040516102f2919061403d565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d91906140b0565b610c8f565b60405161032f91906140ec565b60405180910390f35b34801561034457600080fd5b5061034d610d21565b60405161035a9190614197565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613f63565b610db3565b60405161039791906141c8565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061420f565b610e2f565b005b3480156103d557600080fd5b506103de610f70565b6040516103eb919061425e565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613f63565b610f87565b60405161042891906140ec565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190614279565b610fa7565b005b34801561046657600080fd5b50610481600480360381019061047c9190613f63565b6112c9565b60405161048e91906140ec565b60405180910390f35b3480156104a357600080fd5b506104ac61136e565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906142cc565b611508565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190614279565b611615565b005b34801561050c57600080fd5b5061052760048036038101906105229190614279565b6117f2565b005b34801561053557600080fd5b50610550600480360381019061054b9190613f63565b611812565b005b34801561055e57600080fd5b506105796004803603810190610574919061442e565b611820565b005b34801561058757600080fd5b506105a2600480360381019061059d919061453f565b6118fc565b6040516105af91906146cd565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da9190613f63565b6119bd565b6040516105ec91906141c8565b60405180910390f35b34801561060157600080fd5b5061061c600480360381019061061791906142cc565b6119cf565b005b34801561062a57600080fd5b50610645600480360381019061064091906142cc565b611b4b565b604051610652919061471e565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190613f63565b611bf5565b005b34801561069057600080fd5b506106ab60048036038101906106a691906142cc565b611d0c565b6040516106b8919061425e565b60405180910390f35b3480156106cd57600080fd5b506106d6611dc4565b6040516106e391906140ec565b60405180910390f35b3480156106f857600080fd5b50610701611dd7565b60405161070e919061425e565b60405180910390f35b34801561072357600080fd5b5061073e600480360381019061073991906142cc565b611ddd565b60405161074b91906147e8565b60405180910390f35b61076e60048036038101906107699190613f63565b611f20565b005b34801561077c57600080fd5b5061078561209f565b6040516107929190614197565b60405180910390f35b3480156107a757600080fd5b506107b06120d8565b6040516107bd919061425e565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e891906148bb565b6120e0565b005b3480156107fb57600080fd5b50610804612199565b60405161081191906141c8565b60405180910390f35b34801561082657600080fd5b5061082f6121bf565b60405161083c9190614197565b60405180910390f35b34801561085157600080fd5b5061086c60048036038101906108679190613f63565b612251565b005b34801561087a57600080fd5b506108956004803603810190610890919061493c565b612324565b6040516108a291906147e8565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd91906149bb565b612530565b005b3480156108e057600080fd5b506108fb60048036038101906108f691906149e8565b61266b565b005b34801561090957600080fd5b506109126127e2565b60405161091f9190614a87565b60405180910390f35b34801561093457600080fd5b5061094f600480360381019061094a9190614aa2565b612808565b005b34801561095d57600080fd5b5061097860048036038101906109739190613f63565b61296a565b005b34801561098657600080fd5b5061098f612aee565b60405161099c91906140ec565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190613f63565b612b05565b6040516109d9919061425e565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a049190614bb7565b612b5e565b005b348015610a1757600080fd5b50610a326004803603810190610a2d9190613f63565b612bd1565b604051610a3f9190614c8f565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a9190613f63565b612c3b565b604051610a7c9190614197565b60405180910390f35b348015610a9157600080fd5b50610aac6004803603810190610aa791906142cc565b612cb4565b604051610ab99190614cc6565b60405180910390f35b348015610ace57600080fd5b50610ad7612cd4565b604051610ae491906141c8565b60405180910390f35b348015610af957600080fd5b50610b146004803603810190610b0f9190614ce1565b612cfe565b604051610b2191906140ec565b60405180910390f35b348015610b3657600080fd5b50610b516004803603810190610b4c919061420f565b612d92565b604051610b5e919061425e565b60405180910390f35b348015610b7357600080fd5b50610b8e6004803603810190610b8991906142cc565b612e7c565b005b348015610b9c57600080fd5b50610ba56130ae565b604051610bb29190614197565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd91906149bb565b6130e7565b005b610bec613e77565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178fe3f836040518263ffffffff1660e01b8152600401610c47919061425e565b606060405180830381865afa158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c889190614dc9565b9050919050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060098054610d3090614e25565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5c90614e25565b8015610da95780601f10610d7e57610100808354040283529160200191610da9565b820191906000526020600020905b815481529060010190602001808311610d8c57829003601f168201915b5050505050905090565b6000610dbe82613222565b610df4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e3a826119bd565b90508073ffffffffffffffffffffffffffffffffffffffff16610e5b613281565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe57610e8781610e82613281565b612cfe565b610ebd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f7a613289565b6001546000540303905090565b60126020528060005260406000206000915054906101000a900460ff1681565b6000610fb28261328e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611019576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110258461335a565b9150915061103b8187611036613281565b61337c565b611087576110508661104b613281565b612cfe565b611086576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036110ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110fa86868660016133c0565b801561110557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111d3856111af8888876133c6565b7c0200000000000000000000000000000000000000000000000000000000176133ee565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036112595760006001850190506000600460008381526020019081526020016000205403611257576000548114611256578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112c18686866001613419565b505050505050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663336ccba5836040518263ffffffff1660e01b8152600401611326919061425e565b602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113679190614e56565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d9190614197565b60405180910390fd5b506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161147f90614eb4565b60006040518083038185875af1925050503d80600081146114bc576040519150601f19603f3d011682016040523d82523d6000602084013e6114c1565b606091505b5050905080611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90614f15565b60405180910390fd5b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c79190614197565b60405180910390fd5b5080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49190614197565b60405180910390fd5b5060003083836040516024016116f593929190614f35565b6040516020818303038152906040527fb642fe57000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008473ffffffffffffffffffffffffffffffffffffffff168260405161179b9190614fa8565b6000604051808303816000865af19150503d80600081146117d8576040519150601f19603f3d011682016040523d82523d6000602084013e6117dd565b606091505b50509050806117eb57600080fd5b5050505050565b61180d83838360405180602001604052806000815250612b5e565b505050565b61181d81600161341f565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df9190614197565b60405180910390fd5b5080600b90816118f89190615161565b5050565b606060008251905060008167ffffffffffffffff8111156119205761191f614303565b5b60405190808252806020026020018201604052801561195957816020015b611946613eb0565b81526020019060019003908161193e5790505b50905060005b8281146119b25761198985828151811061197c5761197b615233565b5b6020026020010151612bd1565b82828151811061199c5761199b615233565b5b602002602001018190525080600101905061195f565b508092505050919050565b60006119c88261328e565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e9190614197565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe906152ae565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b53613eff565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f77926b836040518263ffffffff1660e01b8152600401611bae91906141c8565b6040805180830381865afa158015611bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bee919061531e565b9050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49190614197565b60405180910390fd5b50600e548111611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990615397565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d73576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600c60009054906101000a900460ff1681565b600f5481565b60606000806000611ded85611d0c565b905060008167ffffffffffffffff811115611e0b57611e0a614303565b5b604051908082528060200260200182016040528015611e395781602001602082028036833780820191505090505b509050611e44613eb0565b6000611e4e613289565b90505b838614611f1257611e6181613671565b91508160400151611f0757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611eac57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f065780838780600101985081518110611ef957611ef8615233565b5b6020026020010181815250505b5b806001019050611e51565b508195505050505050919050565b600c60009054906101000a900460ff16611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690615403565b60405180910390fd5b60008111611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061546f565b60405180910390fd5b80600f54611fc091906154be565b600e541015612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb9061553e565b60405180910390fd5b6000600c60019054906101000a900460ff1661202957612024338361369c565b612033565b61203282612b05565b5b905080341015612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f906155aa565b60405180910390fd5b81600f600082825461208a91906154be565b9250508190555061209b3383613788565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600042905090565b818190508484905014612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061563c565b60405180910390fd5b600084849050905060005b81811015612191576121863387878481811061215257612151615233565b5b905060200201602081019061216791906142cc565b86868581811061217a57612179615233565b5b90506020020135610fa7565b806001019050612133565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546121ce90614e25565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa90614e25565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b5050505050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123109190614197565b60405180910390fd5b5080600d8190555050565b606081831061235f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061236a6137a6565b9050612374613289565b85101561238657612383613289565b94505b80841115612392578093505b600061239d87611d0c565b9050848610156123c05760008686039050818110156123ba578091505b506123c5565b600090505b60008167ffffffffffffffff8111156123e1576123e0614303565b5b60405190808252806020026020018201604052801561240f5781602001602082028036833780820191505090505b509050600082036124265780945050505050612529565b600061243188612bd1565b90506000816040015161244657816000015190505b60008990505b88811415801561245c5750848714155b1561251b5761246a81613671565b9250826040015161251057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146124b557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361250f578084888060010199508151811061250257612501615233565b5b6020026020010181815250505b5b80600101905061244c565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef9190614197565b60405180910390fd5b50801515600c60009054906101000a900460ff1615150361264e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612645906156a8565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b612673613281565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006126e4613281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612791613281565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127d691906140ec565b60405180910390a35050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79190614197565b60405180910390fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c376fbfe848487856040518563ffffffff1660e01b81526004016129329493929190615732565b600060405180830381600087803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b5050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a299190614197565b60405180910390fd5b5060008111612a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6d9061546f565b60405180910390fd5b80600f54612a8491906154be565b600e541015612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf9061553e565b60405180910390fd5b80600f6000828254612ada91906154be565b92505081905550612aeb3382613788565b50565b6000600c60019054906101000a900460ff16905090565b6000808211612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b409061546f565b60405180910390fd5b600d5482612b579190615772565b9050919050565b612b69848484610fa7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bcb57612b94848484846137af565b612bca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612bd9613eb0565b612be1613eb0565b612be9613289565b831080612bfd5750612bf96137a6565b8310155b15612c0b5780915050612c36565b612c1483613671565b9050806040015115612c295780915050612c36565b612c32836138ff565b9150505b919050565b6060612c4682613222565b612c7c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c8461391f565b612c8d836139b1565b604051602001612c9e929190615808565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000808211612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061546f565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663edae89cb84846040518363ffffffff1660e01b8152600401612e3392919061582c565b602060405180830381865afa158015612e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e749190615855565b905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3b9190614197565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe49190614197565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a69190614197565b60405180910390fd5b50600c60019054906101000a900460ff16151581151503613205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fc906158f4565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008161322d613289565b1115801561323c575060005482105b801561327a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061329d613289565b11613323576000548110156133225760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613320575b600081036133165760046000836001900393508381526020019081526020016000205490506132ec565b8092505050613355565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86133dd868684613b39565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600061342a8361328e565b9050600081905060008061343d8661335a565b9150915084156134a6576134598184613454613281565b61337c565b6134a55761346e83613469613281565b612cfe565b6134a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6134b48360008860016133c0565b80156134bf57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061356783613524856000886133c6565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176133ee565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036135ed57600060018701905060006004600083815260200190815260200160002054036135eb5760005481146135ea578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613657836000886001613419565b600160008154809291906001019190505550505050505050565b613679613eb0565b6136956004600084815260200190815260200160002054613b42565b9050919050565b60008082116136e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d79061546f565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449e815d84846040518363ffffffff1660e01b815260040161373d92919061582c565b6020604051808303816000875af115801561375c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137809190615855565b905092915050565b6137a2828260405180602001604052806000815250613bf8565b5050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137d5613281565b8786866040518563ffffffff1660e01b81526004016137f7949392919061595e565b6020604051808303816000875af192505050801561383357506040513d601f19601f8201168201806040525081019061383091906159bf565b60015b6138ac573d8060008114613863576040519150601f19603f3d011682016040523d82523d6000602084013e613868565b606091505b5060008151036138a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b613907613eb0565b6139186139138361328e565b613b42565b9050919050565b6060600b805461392e90614e25565b80601f016020809104026020016040519081016040528092919081815260200182805461395a90614e25565b80156139a75780601f1061397c576101008083540402835291602001916139a7565b820191906000526020600020905b81548152906001019060200180831161398a57829003601f168201915b5050505050905090565b6060600082036139f8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b34565b600082905060005b60008214613a2a578080613a13906159ec565b915050600a82613a239190615a63565b9150613a00565b60008167ffffffffffffffff811115613a4657613a45614303565b5b6040519080825280601f01601f191660200182016040528015613a785781602001600182028036833780820191505090505b50905060008290505b60008614613b2c57600181613a969190615a94565b90506000600a8088613aa89190615a63565b613ab29190615772565b87613abd9190615a94565b6030613ac99190615ac8565b905060008160f81b905080848481518110613ae757613ae6615233565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88613b239190615a63565b97505050613a81565b819450505050505b919050565b60009392505050565b613b4a613eb0565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b613c028383613c95565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613c9057600080549050600083820390505b613c4260008683806001019450866137af565b613c78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613c2f578160005414613c8d57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613d01576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613d3b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d4860008483856133c0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613dbf83613db060008660006133c6565b613db985613e67565b176133ee565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613de357806000819055505050613e626000848385613419565b505050565b60006001821460e11b9050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613f4081613f2d565b8114613f4b57600080fd5b50565b600081359050613f5d81613f37565b92915050565b600060208284031215613f7957613f78613f23565b5b6000613f8784828501613f4e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fbb82613f90565b9050919050565b613fcb81613fb0565b82525050565b60008115159050919050565b613fe681613fd1565b82525050565b613ff581613f2d565b82525050565b6060820160008201516140116000850182613fc2565b5060208201516140246020850182613fdd565b5060408201516140376040850182613fec565b50505050565b60006060820190506140526000830184613ffb565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61408d81614058565b811461409857600080fd5b50565b6000813590506140aa81614084565b92915050565b6000602082840312156140c6576140c5613f23565b5b60006140d48482850161409b565b91505092915050565b6140e681613fd1565b82525050565b600060208201905061410160008301846140dd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614141578082015181840152602081019050614126565b60008484015250505050565b6000601f19601f8301169050919050565b600061416982614107565b6141738185614112565b9350614183818560208601614123565b61418c8161414d565b840191505092915050565b600060208201905081810360008301526141b1818461415e565b905092915050565b6141c281613fb0565b82525050565b60006020820190506141dd60008301846141b9565b92915050565b6141ec81613fb0565b81146141f757600080fd5b50565b600081359050614209816141e3565b92915050565b6000806040838503121561422657614225613f23565b5b6000614234858286016141fa565b925050602061424585828601613f4e565b9150509250929050565b61425881613f2d565b82525050565b6000602082019050614273600083018461424f565b92915050565b60008060006060848603121561429257614291613f23565b5b60006142a0868287016141fa565b93505060206142b1868287016141fa565b92505060406142c286828701613f4e565b9150509250925092565b6000602082840312156142e2576142e1613f23565b5b60006142f0848285016141fa565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61433b8261414d565b810181811067ffffffffffffffff8211171561435a57614359614303565b5b80604052505050565b600061436d613f19565b90506143798282614332565b919050565b600067ffffffffffffffff82111561439957614398614303565b5b6143a28261414d565b9050602081019050919050565b82818337600083830152505050565b60006143d16143cc8461437e565b614363565b9050828152602081018484840111156143ed576143ec6142fe565b5b6143f88482856143af565b509392505050565b600082601f830112614415576144146142f9565b5b81356144258482602086016143be565b91505092915050565b60006020828403121561444457614443613f23565b5b600082013567ffffffffffffffff81111561446257614461613f28565b5b61446e84828501614400565b91505092915050565b600067ffffffffffffffff82111561449257614491614303565b5b602082029050602081019050919050565b600080fd5b60006144bb6144b684614477565b614363565b905080838252602082019050602084028301858111156144de576144dd6144a3565b5b835b8181101561450757806144f38882613f4e565b8452602084019350506020810190506144e0565b5050509392505050565b600082601f830112614526576145256142f9565b5b81356145368482602086016144a8565b91505092915050565b60006020828403121561455557614554613f23565b5b600082013567ffffffffffffffff81111561457357614572613f28565b5b61457f84828501614511565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600067ffffffffffffffff82169050919050565b6145d1816145b4565b82525050565b600062ffffff82169050919050565b6145ef816145d7565b82525050565b60808201600082015161460b6000850182613fc2565b50602082015161461e60208501826145c8565b5060408201516146316040850182613fdd565b50606082015161464460608501826145e6565b50505050565b600061465683836145f5565b60808301905092915050565b6000602082019050919050565b600061467a82614588565b6146848185614593565b935061468f836145a4565b8060005b838110156146c05781516146a7888261464a565b97506146b283614662565b925050600181019050614693565b5085935050505092915050565b600060208201905081810360008301526146e7818461466f565b905092915050565b6040820160008201516147056000850182613fec565b5060208201516147186020850182613fec565b50505050565b600060408201905061473360008301846146ef565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006147718383613fec565b60208301905092915050565b6000602082019050919050565b600061479582614739565b61479f8185614744565b93506147aa83614755565b8060005b838110156147db5781516147c28882614765565b97506147cd8361477d565b9250506001810190506147ae565b5085935050505092915050565b60006020820190508181036000830152614802818461478a565b905092915050565b600080fd5b60008083601f840112614825576148246142f9565b5b8235905067ffffffffffffffff8111156148425761484161480a565b5b60208301915083602082028301111561485e5761485d6144a3565b5b9250929050565b60008083601f84011261487b5761487a6142f9565b5b8235905067ffffffffffffffff8111156148985761489761480a565b5b6020830191508360208202830111156148b4576148b36144a3565b5b9250929050565b600080600080604085870312156148d5576148d4613f23565b5b600085013567ffffffffffffffff8111156148f3576148f2613f28565b5b6148ff8782880161480f565b9450945050602085013567ffffffffffffffff81111561492257614921613f28565b5b61492e87828801614865565b925092505092959194509250565b60008060006060848603121561495557614954613f23565b5b6000614963868287016141fa565b935050602061497486828701613f4e565b925050604061498586828701613f4e565b9150509250925092565b61499881613fd1565b81146149a357600080fd5b50565b6000813590506149b58161498f565b92915050565b6000602082840312156149d1576149d0613f23565b5b60006149df848285016149a6565b91505092915050565b600080604083850312156149ff576149fe613f23565b5b6000614a0d858286016141fa565b9250506020614a1e858286016149a6565b9150509250929050565b6000819050919050565b6000614a4d614a48614a4384613f90565b614a28565b613f90565b9050919050565b6000614a5f82614a32565b9050919050565b6000614a7182614a54565b9050919050565b614a8181614a66565b82525050565b6000602082019050614a9c6000830184614a78565b92915050565b60008060008060608587031215614abc57614abb613f23565b5b6000614aca878288016141fa565b945050602085013567ffffffffffffffff811115614aeb57614aea613f28565b5b614af787828801614865565b93509350506040614b0a878288016149a6565b91505092959194509250565b600067ffffffffffffffff821115614b3157614b30614303565b5b614b3a8261414d565b9050602081019050919050565b6000614b5a614b5584614b16565b614363565b905082815260208101848484011115614b7657614b756142fe565b5b614b818482856143af565b509392505050565b600082601f830112614b9e57614b9d6142f9565b5b8135614bae848260208601614b47565b91505092915050565b60008060008060808587031215614bd157614bd0613f23565b5b6000614bdf878288016141fa565b9450506020614bf0878288016141fa565b9350506040614c0187828801613f4e565b925050606085013567ffffffffffffffff811115614c2257614c21613f28565b5b614c2e87828801614b89565b91505092959194509250565b608082016000820151614c506000850182613fc2565b506020820151614c6360208501826145c8565b506040820151614c766040850182613fdd565b506060820151614c8960608501826145e6565b50505050565b6000608082019050614ca46000830184614c3a565b92915050565b600060ff82169050919050565b614cc081614caa565b82525050565b6000602082019050614cdb6000830184614cb7565b92915050565b60008060408385031215614cf857614cf7613f23565b5b6000614d06858286016141fa565b9250506020614d17858286016141fa565b9150509250929050565b600080fd5b600081519050614d35816141e3565b92915050565b600081519050614d4a8161498f565b92915050565b600081519050614d5f81613f37565b92915050565b600060608284031215614d7b57614d7a614d21565b5b614d856060614363565b90506000614d9584828501614d26565b6000830152506020614da984828501614d3b565b6020830152506040614dbd84828501614d50565b60408301525092915050565b600060608284031215614ddf57614dde613f23565b5b6000614ded84828501614d65565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e3d57607f821691505b602082108103614e5057614e4f614df6565b5b50919050565b600060208284031215614e6c57614e6b613f23565b5b6000614e7a84828501614d3b565b91505092915050565b600081905092915050565b50565b6000614e9e600083614e83565b9150614ea982614e8e565b600082019050919050565b6000614ebf82614e91565b9150819050919050565b7f52656365697665722072656a656374656420455448207472616e736665720000600082015250565b6000614eff601e83614112565b9150614f0a82614ec9565b602082019050919050565b60006020820190508181036000830152614f2e81614ef2565b9050919050565b6000606082019050614f4a60008301866141b9565b614f5760208301856141b9565b614f64604083018461424f565b949350505050565b600081519050919050565b6000614f8282614f6c565b614f8c8185614e83565b9350614f9c818560208601614123565b80840191505092915050565b6000614fb48284614f77565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026150217fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614fe4565b61502b8683614fe4565b95508019841693508086168417925050509392505050565b600061505e61505961505484613f2d565b614a28565b613f2d565b9050919050565b6000819050919050565b61507883615043565b61508c61508482615065565b848454614ff1565b825550505050565b600090565b6150a1615094565b6150ac81848461506f565b505050565b5b818110156150d0576150c5600082615099565b6001810190506150b2565b5050565b601f821115615115576150e681614fbf565b6150ef84614fd4565b810160208510156150fe578190505b61511261510a85614fd4565b8301826150b1565b50505b505050565b600082821c905092915050565b60006151386000198460080261511a565b1980831691505092915050565b60006151518383615127565b9150826002028217905092915050565b61516a82614107565b67ffffffffffffffff81111561518357615182614303565b5b61518d8254614e25565b6151988282856150d4565b600060209050601f8311600181146151cb57600084156151b9578287015190505b6151c38582615145565b86555061522b565b601f1984166151d986614fbf565b60005b82811015615201578489015182556001820191506020850194506020810190506151dc565b8683101561521e578489015161521a601f891682615127565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f7420736574207a65726f2061646472657373000000000000000000600082015250565b6000615298601783614112565b91506152a382615262565b602082019050919050565b600060208201905081810360008301526152c78161528b565b9050919050565b6000604082840312156152e4576152e3614d21565b5b6152ee6040614363565b905060006152fe84828501614d50565b600083015250602061531284828501614d50565b60208301525092915050565b60006040828403121561533457615333613f23565b5b6000615342848285016152ce565b91505092915050565b7f43616e6e6f74206c6f77657220737570706c7900000000000000000000000000600082015250565b6000615381601383614112565b915061538c8261534b565b602082019050919050565b600060208201905081810360008301526153b081615374565b9050919050565b7f53616c65206e6f7420656e61626c656400000000000000000000000000000000600082015250565b60006153ed601083614112565b91506153f8826153b7565b602082019050919050565b6000602082019050818103600083015261541c816153e0565b9050919050565b7f43616e6e6f74206d696e74207a65726f00000000000000000000000000000000600082015250565b6000615459601083614112565b915061546482615423565b602082019050919050565b600060208201905081810360008301526154888161544c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006154c982613f2d565b91506154d483613f2d565b92508282019050808211156154ec576154eb61548f565b5b92915050565b7f496e737566666963656e7420737570706c790000000000000000000000000000600082015250565b6000615528601283614112565b9150615533826154f2565b602082019050919050565b600060208201905081810360008301526155578161551b565b9050919050565b7f496e737566666963656e7420696e70757420616d6f756e740000000000000000600082015250565b6000615594601883614112565b915061559f8261555e565b602082019050919050565b600060208201905081810360008301526155c381615587565b9050919050565b7f6164647265737320616e64206964206d75737420626520657175616c2073697a60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000615626602183614112565b9150615631826155ca565b604082019050919050565b6000602082019050818103600083015261565581615619565b9050919050565b7f737461746520616c726561647920736574000000000000000000000000000000600082015250565b6000615692601183614112565b915061569d8261565c565b602082019050919050565b600060208201905081810360008301526156c181615685565b9050919050565b600080fd5b82818337505050565b60006156e28385614744565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115615715576157146156c8565b5b6020830292506157268385846156cd565b82840190509392505050565b6000606082019050818103600083015261574d8186886156d6565b905061575c60208301856141b9565b61576960408301846140dd565b95945050505050565b600061577d82613f2d565b915061578883613f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157c1576157c061548f565b5b828202905092915050565b600081905092915050565b60006157e282614107565b6157ec81856157cc565b93506157fc818560208601614123565b80840191505092915050565b600061581482856157d7565b915061582082846157d7565b91508190509392505050565b600060408201905061584160008301856141b9565b61584e602083018461424f565b9392505050565b60006020828403121561586b5761586a613f23565b5b600061587984828501614d50565b91505092915050565b7f64656661756c7453616c6520616c72656164792068617320746861742076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006158de602283614112565b91506158e982615882565b604082019050919050565b6000602082019050818103600083015261590d816158d1565b9050919050565b600082825260208201905092915050565b600061593082614f6c565b61593a8185615914565b935061594a818560208601614123565b6159538161414d565b840191505092915050565b600060808201905061597360008301876141b9565b61598060208301866141b9565b61598d604083018561424f565b818103606083015261599f8184615925565b905095945050505050565b6000815190506159b981614084565b92915050565b6000602082840312156159d5576159d4613f23565b5b60006159e3848285016159aa565b91505092915050565b60006159f782613f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a2957615a2861548f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a6e82613f2d565b9150615a7983613f2d565b925082615a8957615a88615a34565b5b828204905092915050565b6000615a9f82613f2d565b9150615aaa83613f2d565b9250828203905081811115615ac257615ac161548f565b5b92915050565b6000615ad382614caa565b9150615ade83614caa565b9250828201905060ff811115615af757615af661548f565b5b9291505056fea26469706673582212209ec1321dafb0fe88f55ab1517915b68fe167a7fd5b5b706f0423e957e16dac0564736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000001f6938319f4873e84842c6f627496ab325b36e8f0000000000000000000000000000000000000000000000000214e8348c4f0000000000000000000000000000000000000000000000000000000000000000000e4f6d6e69686f727365205465737400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056d546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6557627651426b646b426548466477534b5731724a74586263726b70517a4d45526439583748544665706a482f00000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Omnihorse Test
Arg [1] : symbol_ (string): mTest
Arg [2] : baseURI_ (string): ipfs://QmeWbvQBkdkBeHFdwSKW1rJtXbcrkpQzMERd9X7HTFepjH/
Arg [3] : paymentReceiver_ (address): 0x1F6938319F4873E84842c6f627496AB325B36e8F
Arg [4] : defaultPrice_ (uint256): 150000000000000000
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000001f6938319f4873e84842c6f627496ab325b36e8f
Arg [4] : 0000000000000000000000000000000000000000000000000214e8348c4f0000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 4f6d6e69686f7273652054657374000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 6d54657374000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d6557627651426b646b426548466477534b5731724a7458
Arg [11] : 6263726b70517a4d45526439583748544665706a482f00000000000000000000
Deployed Bytecode Sourcemap
56198:10559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60192:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17441:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57313:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25034:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24582:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16495:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56609:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34299:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59859:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66555:199;;;;;;;;;;;;;:::i;:::-;;57665:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66186:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25924:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54167:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61851:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49101:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22877:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62032:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60525:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61423:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18120:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56369:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56499:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52911:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62698:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54398:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65061:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64707:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54526:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57490:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61663:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49959:2503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62281:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25310:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56568:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59515:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63192:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58123:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57881:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26180:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48522:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60907:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56655:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60741:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25689:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59033:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55384:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54340:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58280:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60192:139;60249:21;;:::i;:::-;60290:15;;;;;;;;;;;:23;;;60314:8;60290:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60283:40;;60192:139;;;:::o;17441:615::-;17526:4;17841:10;17826:25;;:11;:25;;;;:102;;;;17918:10;17903:25;;:11;:25;;;;17826:102;:179;;;;17995:10;17980:25;;:11;:25;;;;17826:179;17806:199;;17441:615;;;:::o;57313:111::-;57378:13;57411:5;57404:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57313:111;:::o;25034:204::-;25102:7;25127:16;25135:7;25127;:16::i;:::-;25122:64;;25152:34;;;;;;;;;;;;;;25122:64;25206:15;:24;25222:7;25206:24;;;;;;;;;;;;;;;;;;;;;25199:31;;25034:204;;;:::o;24582:386::-;24655:13;24671:16;24679:7;24671;:16::i;:::-;24655:32;;24727:5;24704:28;;:19;:17;:19::i;:::-;:28;;;24700:175;;24752:44;24769:5;24776:19;:17;:19::i;:::-;24752:16;:44::i;:::-;24747:128;;24824:35;;;;;;;;;;;;;;24747:128;24700:175;24914:2;24887:15;:24;24903:7;24887:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24952:7;24948:2;24932:28;;24941:5;24932:28;;;;;;;;;;;;24644:324;24582:386;;:::o;16495:315::-;16548:7;16776:15;:13;:15::i;:::-;16761:12;;16745:13;;:28;:46;16738:53;;16495:315;:::o;56609:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;34299:2800::-;34433:27;34463;34482:7;34463:18;:27::i;:::-;34433:57;;34548:4;34507:45;;34523:19;34507:45;;;34503:86;;34561:28;;;;;;;;;;;;;;34503:86;34603:27;34632:23;34659:28;34679:7;34659:19;:28::i;:::-;34602:85;;;;34787:62;34806:15;34823:4;34829:19;:17;:19::i;:::-;34787:18;:62::i;:::-;34782:174;;34869:43;34886:4;34892:19;:17;:19::i;:::-;34869:16;:43::i;:::-;34864:92;;34921:35;;;;;;;;;;;;;;34864:92;34782:174;34987:1;34973:16;;:2;:16;;;34969:52;;34998:23;;;;;;;;;;;;;;34969:52;35034:43;35056:4;35062:2;35066:7;35075:1;35034:21;:43::i;:::-;35170:15;35167:160;;;35310:1;35289:19;35282:30;35167:160;35705:18;:24;35724:4;35705:24;;;;;;;;;;;;;;;;35703:26;;;;;;;;;;;;35774:18;:22;35793:2;35774:22;;;;;;;;;;;;;;;;35772:24;;;;;;;;;;;36096:145;36133:2;36181:45;36196:4;36202:2;36206:19;36181:14;:45::i;:::-;13881:8;36154:72;36096:18;:145::i;:::-;36067:17;:26;36085:7;36067:26;;;;;;;;;;;:174;;;;36411:1;13881:8;36361:19;:46;:51;36357:626;;36433:19;36465:1;36455:7;:11;36433:33;;36622:1;36588:17;:30;36606:11;36588:30;;;;;;;;;;;;:35;36584:384;;36726:13;;36711:11;:28;36707:242;;36906:19;36873:17;:30;36891:11;36873:30;;;;;;;;;;;:52;;;;36707:242;36584:384;36414:569;36357:626;37030:7;37026:2;37011:27;;37020:4;37011:27;;;;;;;;;;;;37049:42;37070:4;37076:2;37080:7;37089:1;37049:20;:42::i;:::-;34422:2677;;;34299:2800;;;:::o;59859:120::-;59915:4;59939:15;;;;;;;;;;;:22;;;59962:8;59939:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59932:39;;59859:120;;;:::o;66555:199::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;66604:12:::1;66629:15;;;;;;;;;;;66621:29;;66658:21;66621:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66603:81;;;66703:7;66695:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66592:162;66555:199::o:0;57665:135::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;57775:16:::1;57747:15;;:45;;;;;;;;;;;;;;;;;;57665:135:::0;:::o;66186:305::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;66285:20:::1;66383:4;66390:3;66395:7;66308:95;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66285:118;;66415:12;66433:9;:14;;66448:7;66433:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66414:42;;;66475:7;66467:16;;;::::0;::::1;;66274:217;;66186:305:::0;;;:::o;25924:185::-;26062:39;26079:4;26085:2;26089:7;26062:39;;;;;;;;;;;;:16;:39::i;:::-;25924:185;;;:::o;54167:94::-;54233:20;54239:7;54248:4;54233:5;:20::i;:::-;54167:94;:::o;61851:98::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;61933:8:::1;61923:7;:18;;;;;;:::i;:::-;;61851:98:::0;:::o;49101:468::-;49190:23;49251:22;49276:8;:15;49251:40;;49306:34;49364:14;49343:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49306:73;;49399:9;49394:125;49415:14;49410:1;:19;49394:125;;49471:32;49491:8;49500:1;49491:11;;;;;;;;:::i;:::-;;;;;;;;49471:19;:32::i;:::-;49455:10;49466:1;49455:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;49431:3;;;;;49394:125;;;;49540:10;49533:17;;;;49101:468;;;:::o;22877:144::-;22941:7;22984:27;23003:7;22984:18;:27::i;:::-;22961:52;;22877:144;;;:::o;62032:177::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;62134:1:::1;62114:22;;:8;:22;;::::0;62106:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62193:8;62175:15;;:26;;;;;;;;;;;;;;;;;;62032:177:::0;:::o;60525:133::-;60579:21;;:::i;:::-;60620:15;;;;;;;;;;;:23;;;60644:5;60620:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60613:37;;60525:133;;;:::o;61423:165::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;61514:9:::1;;61501:10;:22;61493:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;61570:10;61558:9;:22;;;;61423:165:::0;:::o;18120:224::-;18184:7;18225:1;18208:19;;:5;:19;;;18204:60;;18236:28;;;;;;;;;;;;;;18204:60;12833:13;18282:18;:25;18301:5;18282:25;;;;;;;;;;;;;;;;:54;18275:61;;18120:224;;;:::o;56369:23::-;;;;;;;;;;;;;:::o;56499:28::-;;;;:::o;52911:892::-;52981:16;53035:19;53069:25;53109:22;53134:16;53144:5;53134:9;:16::i;:::-;53109:41;;53165:25;53207:14;53193:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53165:57;;53237:31;;:::i;:::-;53288:9;53300:15;:13;:15::i;:::-;53288:27;;53283:472;53332:14;53317:11;:29;53283:472;;53384:15;53397:1;53384:12;:15::i;:::-;53372:27;;53422:9;:16;;;53463:8;53418:73;53539:1;53513:28;;:9;:14;;;:28;;;53509:111;;53586:9;:14;;;53566:34;;53509:111;53663:5;53642:26;;:17;:26;;;53638:102;;53719:1;53693:8;53702:13;;;;;;53693:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;53638:102;53283:472;53348:3;;;;;53283:472;;;;53776:8;53769:15;;;;;;;52911:892;;;:::o;62698:435::-;56740:11;;;;;;;;;;;56732:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;62786:1:::1;62776:7;:11;62768:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;62856:7;62840:13;;:23;;;;:::i;:::-;62827:9;;:36;;62819:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;62897:13;62913:11;;;;;;;;;;;:70;;62954:29;62963:10;62975:7;62954:8;:29::i;:::-;62913:70;;;62927:24;62943:7;62927:15;:24::i;:::-;62913:70;62897:86;;63015:5;63002:9;:18;;62994:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63077:7;63060:13;;:24;;;;;;;:::i;:::-;;;;;;;;63095:30;63105:10;63117:7;63095:9;:30::i;:::-;62757:376;62698:435:::0;:::o;54398:65::-;;;;;;;;;;;;;;;;;;;:::o;65061:94::-;65105:7;65132:15;65125:22;;65061:94;:::o;64707:346::-;64826:3;;:10;;64807:8;;:15;;:29;64799:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;64883:14;64900:8;;:15;;64883:32;;64928:9;64924:122;64943:6;64941:1;:8;64924:122;;;64963:45;64976:10;64988:8;;64997:1;64988:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65001:3;;65005:1;65001:6;;;;;;;:::i;:::-;;;;;;;;64963:12;:45::i;:::-;65031:3;;;;;64924:122;;;;64790:263;64707:346;;;;:::o;54526:20::-;;;;;;;;;;;;;:::o;57490:115::-;57557:13;57590:7;57583:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57490:115;:::o;61663:112::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;61754:13:::1;61739:12;:28;;;;61663:112:::0;:::o;49959:2503::-;50092:16;50159:4;50150:5;:13;50146:45;;50172:19;;;;;;;;;;;;;;50146:45;50206:19;50240:17;50260:14;:12;:14::i;:::-;50240:34;;50360:15;:13;:15::i;:::-;50352:5;:23;50348:87;;;50404:15;:13;:15::i;:::-;50396:23;;50348:87;50511:9;50504:4;:16;50500:73;;;50548:9;50541:16;;50500:73;50587:25;50615:16;50625:5;50615:9;:16::i;:::-;50587:44;;50809:4;50801:5;:12;50797:278;;;50834:19;50863:5;50856:4;:12;50834:34;;50905:17;50891:11;:31;50887:111;;;50967:11;50947:31;;50887:111;50815:198;50797:278;;;51058:1;51038:21;;50797:278;51089:25;51131:17;51117:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51089:60;;51189:1;51168:17;:22;51164:78;;51218:8;51211:15;;;;;;;;51164:78;51386:31;51420:26;51440:5;51420:19;:26::i;:::-;51386:60;;51461:25;51706:9;:16;;;51701:92;;51763:9;:14;;;51743:34;;51701:92;51812:9;51824:5;51812:17;;51807:478;51836:4;51831:1;:9;;:45;;;;;51859:17;51844:11;:32;;51831:45;51807:478;;;51914:15;51927:1;51914:12;:15::i;:::-;51902:27;;51952:9;:16;;;51993:8;51948:73;52069:1;52043:28;;:9;:14;;;:28;;;52039:111;;52116:9;:14;;;52096:34;;52039:111;52193:5;52172:26;;:17;:26;;;52168:102;;52249:1;52223:8;52232:13;;;;;;52223:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;52168:102;51807:478;51878:3;;;;;51807:478;;;;52387:11;52377:8;52370:29;52435:8;52428:15;;;;;;;;49959:2503;;;;;;:::o;62281:153::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;62369:6:::1;62354:21;;:11;;;;;;;;;;;:21;;::::0;62346:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62420:6;62406:11;;:20;;;;;;;;;;;;;;;;;;62281:153:::0;:::o;25310:308::-;25421:19;:17;:19::i;:::-;25409:31;;:8;:31;;;25405:61;;25449:17;;;;;;;;;;;;;;25405:61;25531:8;25479:18;:39;25498:19;:17;:19::i;:::-;25479:39;;;;;;;;;;;;;;;:49;25519:8;25479:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25591:8;25555:55;;25570:19;:17;:19::i;:::-;25555:55;;;25601:8;25555:55;;;;;;:::i;:::-;;;;;;;;25310:308;;:::o;56568:32::-;;;;;;;;;;;;;:::o;59515:158::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;59617:15:::1;;;;;;;;;;;:23;;;59641:8;;59651:5;59658:6;59617:48;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59515:158:::0;;;;:::o;63192:272::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;63280:1:::1;63270:7;:11;63262:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63350:7;63334:13;;:23;;;;:::i;:::-;63321:9;;:36;;63313:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63408:7;63391:13;;:24;;;;;;;:::i;:::-;;;;;;;;63426:30;63436:10;63448:7;63426:9;:30::i;:::-;63192:272:::0;:::o;58123:89::-;58169:4;58193:11;;;;;;;;;;;58186:18;;58123:89;:::o;57881:170::-;57943:7;57981:1;57971:7;:11;57963:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;58031:12;;58021:7;:22;;;;:::i;:::-;58014:29;;57881:170;;;:::o;26180:399::-;26347:31;26360:4;26366:2;26370:7;26347:12;:31::i;:::-;26411:1;26393:2;:14;;;:19;26389:183;;26432:56;26463:4;26469:2;26473:7;26482:5;26432:30;:56::i;:::-;26427:145;;26516:40;;;;;;;;;;;;;;26427:145;26389:183;26180:399;;;;:::o;48522:420::-;48598:21;;:::i;:::-;48632:31;;:::i;:::-;48688:15;:13;:15::i;:::-;48678:7;:25;:54;;;;48718:14;:12;:14::i;:::-;48707:7;:25;;48678:54;48674:103;;;48756:9;48749:16;;;;;48674:103;48799:21;48812:7;48799:12;:21::i;:::-;48787:33;;48835:9;:16;;;48831:65;;;48875:9;48868:16;;;;;48831:65;48913:21;48926:7;48913:12;:21::i;:::-;48906:28;;;48522:420;;;;:::o;60907:258::-;60999:13;61030:16;61038:7;61030;:16::i;:::-;61025:59;;61055:29;;;;;;;;;;;;;;61025:59;61126:10;:8;:10::i;:::-;61138:17;61147:7;61138:8;:17::i;:::-;61109:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61095:62;;60907:258;;;:::o;56655:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;60741:88::-;60793:7;60811:15;;;;;;;;;;;60804:22;;60741:88;:::o;25689:164::-;25786:4;25810:18;:25;25829:5;25810:25;;;;;;;;;;;;;;;:35;25836:8;25810:35;;;;;;;;;;;;;;;;;;;;;;;;;25803:42;;25689:164;;;;:::o;59033:204::-;59107:7;59145:1;59135:7;:11;59127:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;59185:15;;;;;;;;;;;:28;;;59214:5;59221:7;59185:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59178:51;;59033:204;;;;:::o;55384:229::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;55487:1:::1;55466:23;;:9;:23;;;;55491:31;;;;;;;;;;;;;;;;::::0;55458:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;55567:9;55539:38;;55560:5;;;;;;;;;;;55539:38;;;;;;;;;;;;55596:9;55588:5;;:17;;;;;;;;;;;;;;;;;;55384:229:::0;:::o;54340:51::-;;;;;;;;;;;;;;;;;;;:::o;58280:190::-;55161:5;;;;;;;;;;;55147:19;;:10;:19;;;55168:17;;;;;;;;;;;;;;;;;55139:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;58375:11:::1;;;;;;;;;;;58359:27;;:12;:27;;::::0;58351:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;58450:12;58436:11;;:26;;;;;;;;;;;;;;;;;;58280:190:::0;:::o;26834:273::-;26891:4;26947:7;26928:15;:13;:15::i;:::-;:26;;:66;;;;;26981:13;;26971:7;:23;26928:66;:152;;;;;27079:1;13603:8;27032:17;:26;27050:7;27032:26;;;;;;;;;;;;:43;:48;26928:152;26908:172;;26834:273;;;:::o;45395:105::-;45455:7;45482:10;45475:17;;45395:105;:::o;16019:92::-;16075:7;16019:92;:::o;19794:1129::-;19861:7;19881:12;19896:7;19881:22;;19964:4;19945:15;:13;:15::i;:::-;:23;19941:915;;19998:13;;19991:4;:20;19987:869;;;20036:14;20053:17;:23;20071:4;20053:23;;;;;;;;;;;;20036:40;;20169:1;13603:8;20142:6;:23;:28;20138:699;;20661:113;20678:1;20668:6;:11;20661:113;;20721:17;:25;20739:6;;;;;;;20721:25;;;;;;;;;;;;20712:34;;20661:113;;;20807:6;20800:13;;;;;;20138:699;20013:843;19987:869;19941:915;20884:31;;;;;;;;;;;;;;19794:1129;;;;:::o;32635:652::-;32730:27;32759:23;32800:53;32856:15;32800:71;;33042:7;33036:4;33029:21;33077:22;33071:4;33064:36;33153:4;33147;33137:21;33114:44;;33249:19;33243:26;33224:45;;32980:300;32635:652;;;:::o;33400:645::-;33542:11;33704:15;33698:4;33694:26;33686:34;;33863:15;33852:9;33848:31;33835:44;;34010:15;33999:9;33996:30;33989:4;33978:9;33975:19;33972:55;33962:65;;33400:645;;;;;:::o;44228:159::-;;;;;:::o;42540:309::-;42675:7;42695:16;14004:3;42721:19;:40;;42695:67;;14004:3;42788:31;42799:4;42805:2;42809:9;42788:10;:31::i;:::-;42780:40;;:61;;42773:68;;;42540:309;;;;;:::o;22368:447::-;22448:14;22616:15;22609:5;22605:27;22596:36;;22790:5;22776:11;22752:22;22748:40;22745:51;22738:5;22735:62;22725:72;;22368:447;;;;:::o;45046:158::-;;;;;:::o;37495:3063::-;37575:27;37605;37624:7;37605:18;:27::i;:::-;37575:57;;37645:12;37676:19;37645:52;;37711:27;37740:23;37767:28;37787:7;37767:19;:28::i;:::-;37710:85;;;;37812:13;37808:310;;;37933:62;37952:15;37969:4;37975:19;:17;:19::i;:::-;37933:18;:62::i;:::-;37928:178;;38019:43;38036:4;38042:19;:17;:19::i;:::-;38019:16;:43::i;:::-;38014:92;;38071:35;;;;;;;;;;;;;;38014:92;37928:178;37808:310;38130:51;38152:4;38166:1;38170:7;38179:1;38130:21;:51::i;:::-;38274:15;38271:160;;;38414:1;38393:19;38386:30;38271:160;39090:1;13096:3;39061:1;:25;;39060:31;39032:18;:24;39051:4;39032:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;39358:174;39395:4;39464:53;39479:4;39493:1;39497:19;39464:14;:53::i;:::-;13881:8;13603;39419:41;39418:99;39358:18;:174::i;:::-;39329:17;:26;39347:7;39329:26;;;;;;;;;;;:203;;;;39702:1;13881:8;39652:19;:46;:51;39648:626;;39724:19;39756:1;39746:7;:11;39724:33;;39913:1;39879:17;:30;39897:11;39879:30;;;;;;;;;;;;:35;39875:384;;40017:13;;40002:11;:28;39998:242;;40197:19;40164:17;:30;40182:11;40164:30;;;;;;;;;;;:52;;;;39998:242;39875:384;39705:569;39648:626;40329:7;40325:1;40302:35;;40311:4;40302:35;;;;;;;;;;;;40348:50;40369:4;40383:1;40387:7;40396:1;40348:20;:50::i;:::-;40525:12;;:14;;;;;;;;;;;;;37564:2994;;;;37495:3063;;:::o;21471:153::-;21531:21;;:::i;:::-;21572:44;21591:17;:24;21609:5;21591:24;;;;;;;;;;;;21572:18;:44::i;:::-;21565:51;;21471:153;;;:::o;58668:193::-;58735:7;58773:1;58763:7;:11;58755:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;58813:15;;;;;;;;;;;:24;;;58838:5;58845:7;58813:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58806:47;;58668:193;;;;:::o;27191:104::-;27260:27;27270:2;27274:8;27260:27;;;;;;;;;;;;:9;:27::i;:::-;27191:104;;:::o;16190:95::-;16237:7;16264:13;;16257:20;;16190:95;:::o;41050:716::-;41213:4;41259:2;41234:45;;;41280:19;:17;:19::i;:::-;41301:4;41307:7;41316:5;41234:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41230:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41534:1;41517:6;:13;:18;41513:235;;41563:40;;;;;;;;;;;;;;41513:235;41706:6;41700:13;41691:6;41687:2;41683:15;41676:38;41230:529;41403:54;;;41393:64;;;:6;:64;;;;41386:71;;;41050:716;;;;;;:::o;22127:158::-;22189:21;;:::i;:::-;22230:47;22249:27;22268:7;22249:18;:27::i;:::-;22230:18;:47::i;:::-;22223:54;;22127:158;;;:::o;61229:108::-;61289:13;61322:7;61315:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61229:108;:::o;65352:551::-;65402:27;65452:1;65446:2;:7;65442:28;;65457:10;;;;;;;;;;;;;;;;;;;;;65442:28;65480:6;65489:2;65480:11;;65502:8;65521:69;65533:1;65528;:6;65521:69;;65551:5;;;;;:::i;:::-;;;;65576:2;65571:7;;;;;:::i;:::-;;;65521:69;;;65600:17;65630:3;65620:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65600:34;;65645:6;65654:3;65645:12;;65668:198;65681:1;65675:2;:7;65668:198;;65705:1;65703;:3;;;;:::i;:::-;65699:7;;65721:10;65761:2;65756;65751;:7;;;;:::i;:::-;:12;;;;:::i;:::-;65746:2;:17;;;;:::i;:::-;65735:2;:29;;;;:::i;:::-;65721:44;;65780:9;65799:4;65792:12;;65780:24;;65829:2;65819:4;65824:1;65819:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;65852:2;65846:8;;;;;:::i;:::-;;;65684:182;;65668:198;;;65890:4;65876:19;;;;;;65352:551;;;;:::o;43425:147::-;43562:6;43425:147;;;;;:::o;21017:363::-;21083:31;;:::i;:::-;21160:6;21127:9;:14;;:41;;;;;;;;;;;13487:3;21213:6;:32;;21179:9;:24;;:67;;;;;;;;;;;21303:1;13603:8;21276:6;:23;:28;;21257:9;:16;;:47;;;;;;;;;;;14004:3;21344:6;:27;;21315:9;:19;;:57;;;;;;;;;;;21017:363;;;:::o;27711:681::-;27834:19;27840:2;27844:8;27834:5;:19::i;:::-;27913:1;27895:2;:14;;;:19;27891:483;;27935:11;27949:13;;27935:27;;27981:13;28003:8;27997:3;:14;27981:30;;28030:233;28061:62;28100:1;28104:2;28108:7;;;;;;28117:5;28061:30;:62::i;:::-;28056:167;;28159:40;;;;;;;;;;;;;;28056:167;28258:3;28250:5;:11;28030:233;;28345:3;28328:13;;:20;28324:34;;28350:8;;;28324:34;27916:458;;27891:483;27711:681;;;:::o;28665:1529::-;28730:20;28753:13;;28730:36;;28795:1;28781:16;;:2;:16;;;28777:48;;28806:19;;;;;;;;;;;;;;28777:48;28852:1;28840:8;:13;28836:44;;28862:18;;;;;;;;;;;;;;28836:44;28893:61;28923:1;28927:2;28931:12;28945:8;28893:21;:61::i;:::-;29436:1;12970:2;29407:1;:25;;29406:31;29394:8;:44;29368:18;:22;29387:2;29368:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;29715:139;29752:2;29806:33;29829:1;29833:2;29837:1;29806:14;:33::i;:::-;29773:30;29794:8;29773:20;:30::i;:::-;:66;29715:18;:139::i;:::-;29681:17;:31;29699:12;29681:31;;;;;;;;;;;:173;;;;29871:15;29889:12;29871:30;;29916:11;29945:8;29930:12;:23;29916:37;;29968:101;30020:9;;;;;;30016:2;29995:35;;30012:1;29995:35;;;;;;;;;;;;30064:3;30054:7;:13;29968:101;;30101:3;30085:13;:19;;;;29142:974;;30126:60;30155:1;30159:2;30163:12;30177:8;30126:20;:60::i;:::-;28719:1475;28665:1529;;:::o;24198:322::-;24268:14;24499:1;24489:8;24486:15;24461:23;24457:45;24447:55;;24198:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:108::-;1336:24;1354:5;1336:24;:::i;:::-;1331:3;1324:37;1259:108;;:::o;1373:90::-;1407:7;1450:5;1443:13;1436:21;1425:32;;1373:90;;;:::o;1469:99::-;1540:21;1555:5;1540:21;:::i;:::-;1535:3;1528:34;1469:99;;:::o;1574:108::-;1651:24;1669:5;1651:24;:::i;:::-;1646:3;1639:37;1574:108;;:::o;1742:674::-;1883:4;1878:3;1874:14;1970:4;1963:5;1959:16;1953:23;1989:63;2046:4;2041:3;2037:14;2023:12;1989:63;:::i;:::-;1898:164;2144:4;2137:5;2133:16;2127:23;2163:57;2214:4;2209:3;2205:14;2191:12;2163:57;:::i;:::-;2072:158;2317:4;2310:5;2306:16;2300:23;2336:63;2393:4;2388:3;2384:14;2370:12;2336:63;:::i;:::-;2240:169;1852:564;1742:674;;:::o;2422:310::-;2559:4;2597:2;2586:9;2582:18;2574:26;;2610:115;2722:1;2711:9;2707:17;2698:6;2610:115;:::i;:::-;2422:310;;;;:::o;2738:149::-;2774:7;2814:66;2807:5;2803:78;2792:89;;2738:149;;;:::o;2893:120::-;2965:23;2982:5;2965:23;:::i;:::-;2958:5;2955:34;2945:62;;3003:1;3000;2993:12;2945:62;2893:120;:::o;3019:137::-;3064:5;3102:6;3089:20;3080:29;;3118:32;3144:5;3118:32;:::i;:::-;3019:137;;;;:::o;3162:327::-;3220:6;3269:2;3257:9;3248:7;3244:23;3240:32;3237:119;;;3275:79;;:::i;:::-;3237:119;3395:1;3420:52;3464:7;3455:6;3444:9;3440:22;3420:52;:::i;:::-;3410:62;;3366:116;3162:327;;;;:::o;3495:109::-;3576:21;3591:5;3576:21;:::i;:::-;3571:3;3564:34;3495:109;;:::o;3610:210::-;3697:4;3735:2;3724:9;3720:18;3712:26;;3748:65;3810:1;3799:9;3795:17;3786:6;3748:65;:::i;:::-;3610:210;;;;:::o;3826:99::-;3878:6;3912:5;3906:12;3896:22;;3826:99;;;:::o;3931:169::-;4015:11;4049:6;4044:3;4037:19;4089:4;4084:3;4080:14;4065:29;;3931:169;;;;:::o;4106:246::-;4187:1;4197:113;4211:6;4208:1;4205:13;4197:113;;;4296:1;4291:3;4287:11;4281:18;4277:1;4272:3;4268:11;4261:39;4233:2;4230:1;4226:10;4221:15;;4197:113;;;4344:1;4335:6;4330:3;4326:16;4319:27;4168:184;4106:246;;;:::o;4358:102::-;4399:6;4450:2;4446:7;4441:2;4434:5;4430:14;4426:28;4416:38;;4358:102;;;:::o;4466:377::-;4554:3;4582:39;4615:5;4582:39;:::i;:::-;4637:71;4701:6;4696:3;4637:71;:::i;:::-;4630:78;;4717:65;4775:6;4770:3;4763:4;4756:5;4752:16;4717:65;:::i;:::-;4807:29;4829:6;4807:29;:::i;:::-;4802:3;4798:39;4791:46;;4558:285;4466:377;;;;:::o;4849:313::-;4962:4;5000:2;4989:9;4985:18;4977:26;;5049:9;5043:4;5039:20;5035:1;5024:9;5020:17;5013:47;5077:78;5150:4;5141:6;5077:78;:::i;:::-;5069:86;;4849:313;;;;:::o;5168:118::-;5255:24;5273:5;5255:24;:::i;:::-;5250:3;5243:37;5168:118;;:::o;5292:222::-;5385:4;5423:2;5412:9;5408:18;5400:26;;5436:71;5504:1;5493:9;5489:17;5480:6;5436:71;:::i;:::-;5292:222;;;;:::o;5520:122::-;5593:24;5611:5;5593:24;:::i;:::-;5586:5;5583:35;5573:63;;5632:1;5629;5622:12;5573:63;5520:122;:::o;5648:139::-;5694:5;5732:6;5719:20;5710:29;;5748:33;5775:5;5748:33;:::i;:::-;5648:139;;;;:::o;5793:474::-;5861:6;5869;5918:2;5906:9;5897:7;5893:23;5889:32;5886:119;;;5924:79;;:::i;:::-;5886:119;6044:1;6069:53;6114:7;6105:6;6094:9;6090:22;6069:53;:::i;:::-;6059:63;;6015:117;6171:2;6197:53;6242:7;6233:6;6222:9;6218:22;6197:53;:::i;:::-;6187:63;;6142:118;5793:474;;;;;:::o;6273:118::-;6360:24;6378:5;6360:24;:::i;:::-;6355:3;6348:37;6273:118;;:::o;6397:222::-;6490:4;6528:2;6517:9;6513:18;6505:26;;6541:71;6609:1;6598:9;6594:17;6585:6;6541:71;:::i;:::-;6397:222;;;;:::o;6625:619::-;6702:6;6710;6718;6767:2;6755:9;6746:7;6742:23;6738:32;6735:119;;;6773:79;;:::i;:::-;6735:119;6893:1;6918:53;6963:7;6954:6;6943:9;6939:22;6918:53;:::i;:::-;6908:63;;6864:117;7020:2;7046:53;7091:7;7082:6;7071:9;7067:22;7046:53;:::i;:::-;7036:63;;6991:118;7148:2;7174:53;7219:7;7210:6;7199:9;7195:22;7174:53;:::i;:::-;7164:63;;7119:118;6625:619;;;;;:::o;7250:329::-;7309:6;7358:2;7346:9;7337:7;7333:23;7329:32;7326:119;;;7364:79;;:::i;:::-;7326:119;7484:1;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7455:117;7250:329;;;;:::o;7585:117::-;7694:1;7691;7684:12;7708:117;7817:1;7814;7807:12;7831:180;7879:77;7876:1;7869:88;7976:4;7973:1;7966:15;8000:4;7997:1;7990:15;8017:281;8100:27;8122:4;8100:27;:::i;:::-;8092:6;8088:40;8230:6;8218:10;8215:22;8194:18;8182:10;8179:34;8176:62;8173:88;;;8241:18;;:::i;:::-;8173:88;8281:10;8277:2;8270:22;8060:238;8017:281;;:::o;8304:129::-;8338:6;8365:20;;:::i;:::-;8355:30;;8394:33;8422:4;8414:6;8394:33;:::i;:::-;8304:129;;;:::o;8439:308::-;8501:4;8591:18;8583:6;8580:30;8577:56;;;8613:18;;:::i;:::-;8577:56;8651:29;8673:6;8651:29;:::i;:::-;8643:37;;8735:4;8729;8725:15;8717:23;;8439:308;;;:::o;8753:146::-;8850:6;8845:3;8840;8827:30;8891:1;8882:6;8877:3;8873:16;8866:27;8753:146;;;:::o;8905:425::-;8983:5;9008:66;9024:49;9066:6;9024:49;:::i;:::-;9008:66;:::i;:::-;8999:75;;9097:6;9090:5;9083:21;9135:4;9128:5;9124:16;9173:3;9164:6;9159:3;9155:16;9152:25;9149:112;;;9180:79;;:::i;:::-;9149:112;9270:54;9317:6;9312:3;9307;9270:54;:::i;:::-;8989:341;8905:425;;;;;:::o;9350:340::-;9406:5;9455:3;9448:4;9440:6;9436:17;9432:27;9422:122;;9463:79;;:::i;:::-;9422:122;9580:6;9567:20;9605:79;9680:3;9672:6;9665:4;9657:6;9653:17;9605:79;:::i;:::-;9596:88;;9412:278;9350:340;;;;:::o;9696:509::-;9765:6;9814:2;9802:9;9793:7;9789:23;9785:32;9782:119;;;9820:79;;:::i;:::-;9782:119;9968:1;9957:9;9953:17;9940:31;9998:18;9990:6;9987:30;9984:117;;;10020:79;;:::i;:::-;9984:117;10125:63;10180:7;10171:6;10160:9;10156:22;10125:63;:::i;:::-;10115:73;;9911:287;9696:509;;;;:::o;10211:311::-;10288:4;10378:18;10370:6;10367:30;10364:56;;;10400:18;;:::i;:::-;10364:56;10450:4;10442:6;10438:17;10430:25;;10510:4;10504;10500:15;10492:23;;10211:311;;;:::o;10528:117::-;10637:1;10634;10627:12;10668:710;10764:5;10789:81;10805:64;10862:6;10805:64;:::i;:::-;10789:81;:::i;:::-;10780:90;;10890:5;10919:6;10912:5;10905:21;10953:4;10946:5;10942:16;10935:23;;11006:4;10998:6;10994:17;10986:6;10982:30;11035:3;11027:6;11024:15;11021:122;;;11054:79;;:::i;:::-;11021:122;11169:6;11152:220;11186:6;11181:3;11178:15;11152:220;;;11261:3;11290:37;11323:3;11311:10;11290:37;:::i;:::-;11285:3;11278:50;11357:4;11352:3;11348:14;11341:21;;11228:144;11212:4;11207:3;11203:14;11196:21;;11152:220;;;11156:21;10770:608;;10668:710;;;;;:::o;11401:370::-;11472:5;11521:3;11514:4;11506:6;11502:17;11498:27;11488:122;;11529:79;;:::i;:::-;11488:122;11646:6;11633:20;11671:94;11761:3;11753:6;11746:4;11738:6;11734:17;11671:94;:::i;:::-;11662:103;;11478:293;11401:370;;;;:::o;11777:539::-;11861:6;11910:2;11898:9;11889:7;11885:23;11881:32;11878:119;;;11916:79;;:::i;:::-;11878:119;12064:1;12053:9;12049:17;12036:31;12094:18;12086:6;12083:30;12080:117;;;12116:79;;:::i;:::-;12080:117;12221:78;12291:7;12282:6;12271:9;12267:22;12221:78;:::i;:::-;12211:88;;12007:302;11777:539;;;;:::o;12322:144::-;12419:6;12453:5;12447:12;12437:22;;12322:144;;;:::o;12472:214::-;12601:11;12635:6;12630:3;12623:19;12675:4;12670:3;12666:14;12651:29;;12472:214;;;;:::o;12692:162::-;12789:4;12812:3;12804:11;;12842:4;12837:3;12833:14;12825:22;;12692:162;;;:::o;12860:101::-;12896:7;12936:18;12929:5;12925:30;12914:41;;12860:101;;;:::o;12967:105::-;13042:23;13059:5;13042:23;:::i;:::-;13037:3;13030:36;12967:105;;:::o;13078:91::-;13114:7;13154:8;13147:5;13143:20;13132:31;;13078:91;;;:::o;13175:105::-;13250:23;13267:5;13250:23;:::i;:::-;13245:3;13238:36;13175:105;;:::o;13358:862::-;13505:4;13500:3;13496:14;13592:4;13585:5;13581:16;13575:23;13611:63;13668:4;13663:3;13659:14;13645:12;13611:63;:::i;:::-;13520:164;13776:4;13769:5;13765:16;13759:23;13795:61;13850:4;13845:3;13841:14;13827:12;13795:61;:::i;:::-;13694:172;13950:4;13943:5;13939:16;13933:23;13969:57;14020:4;14015:3;14011:14;13997:12;13969:57;:::i;:::-;13876:160;14123:4;14116:5;14112:16;14106:23;14142:61;14197:4;14192:3;14188:14;14174:12;14142:61;:::i;:::-;14046:167;13474:746;13358:862;;:::o;14226:299::-;14355:10;14376:106;14478:3;14470:6;14376:106;:::i;:::-;14514:4;14509:3;14505:14;14491:28;;14226:299;;;;:::o;14531:143::-;14631:4;14663;14658:3;14654:14;14646:22;;14531:143;;;:::o;14756:972::-;14935:3;14964:84;15042:5;14964:84;:::i;:::-;15064:116;15173:6;15168:3;15064:116;:::i;:::-;15057:123;;15204:86;15284:5;15204:86;:::i;:::-;15313:7;15344:1;15329:374;15354:6;15351:1;15348:13;15329:374;;;15430:6;15424:13;15457:123;15576:3;15561:13;15457:123;:::i;:::-;15450:130;;15603:90;15686:6;15603:90;:::i;:::-;15593:100;;15389:314;15376:1;15373;15369:9;15364:14;;15329:374;;;15333:14;15719:3;15712:10;;14940:788;;;14756:972;;;;:::o;15734:493::-;15937:4;15975:2;15964:9;15960:18;15952:26;;16024:9;16018:4;16014:20;16010:1;15999:9;15995:17;15988:47;16052:168;16215:4;16206:6;16052:168;:::i;:::-;16044:176;;15734:493;;;;:::o;16287:508::-;16428:4;16423:3;16419:14;16519:4;16512:5;16508:16;16502:23;16538:63;16595:4;16590:3;16586:14;16572:12;16538:63;:::i;:::-;16443:168;16696:4;16689:5;16685:16;16679:23;16715:63;16772:4;16767:3;16763:14;16749:12;16715:63;:::i;:::-;16621:167;16397:398;16287:508;;:::o;16801:310::-;16938:4;16976:2;16965:9;16961:18;16953:26;;16989:115;17101:1;17090:9;17086:17;17077:6;16989:115;:::i;:::-;16801:310;;;;:::o;17117:114::-;17184:6;17218:5;17212:12;17202:22;;17117:114;;;:::o;17237:184::-;17336:11;17370:6;17365:3;17358:19;17410:4;17405:3;17401:14;17386:29;;17237:184;;;;:::o;17427:132::-;17494:4;17517:3;17509:11;;17547:4;17542:3;17538:14;17530:22;;17427:132;;;:::o;17565:179::-;17634:10;17655:46;17697:3;17689:6;17655:46;:::i;:::-;17733:4;17728:3;17724:14;17710:28;;17565:179;;;;:::o;17750:113::-;17820:4;17852;17847:3;17843:14;17835:22;;17750:113;;;:::o;17899:732::-;18018:3;18047:54;18095:5;18047:54;:::i;:::-;18117:86;18196:6;18191:3;18117:86;:::i;:::-;18110:93;;18227:56;18277:5;18227:56;:::i;:::-;18306:7;18337:1;18322:284;18347:6;18344:1;18341:13;18322:284;;;18423:6;18417:13;18450:63;18509:3;18494:13;18450:63;:::i;:::-;18443:70;;18536:60;18589:6;18536:60;:::i;:::-;18526:70;;18382:224;18369:1;18366;18362:9;18357:14;;18322:284;;;18326:14;18622:3;18615:10;;18023:608;;;17899:732;;;;:::o;18637:373::-;18780:4;18818:2;18807:9;18803:18;18795:26;;18867:9;18861:4;18857:20;18853:1;18842:9;18838:17;18831:47;18895:108;18998:4;18989:6;18895:108;:::i;:::-;18887:116;;18637:373;;;;:::o;19016:117::-;19125:1;19122;19115:12;19156:568;19229:8;19239:6;19289:3;19282:4;19274:6;19270:17;19266:27;19256:122;;19297:79;;:::i;:::-;19256:122;19410:6;19397:20;19387:30;;19440:18;19432:6;19429:30;19426:117;;;19462:79;;:::i;:::-;19426:117;19576:4;19568:6;19564:17;19552:29;;19630:3;19622:4;19614:6;19610:17;19600:8;19596:32;19593:41;19590:128;;;19637:79;;:::i;:::-;19590:128;19156:568;;;;;:::o;19747:::-;19820:8;19830:6;19880:3;19873:4;19865:6;19861:17;19857:27;19847:122;;19888:79;;:::i;:::-;19847:122;20001:6;19988:20;19978:30;;20031:18;20023:6;20020:30;20017:117;;;20053:79;;:::i;:::-;20017:117;20167:4;20159:6;20155:17;20143:29;;20221:3;20213:4;20205:6;20201:17;20191:8;20187:32;20184:41;20181:128;;;20228:79;;:::i;:::-;20181:128;19747:568;;;;;:::o;20321:934::-;20443:6;20451;20459;20467;20516:2;20504:9;20495:7;20491:23;20487:32;20484:119;;;20522:79;;:::i;:::-;20484:119;20670:1;20659:9;20655:17;20642:31;20700:18;20692:6;20689:30;20686:117;;;20722:79;;:::i;:::-;20686:117;20835:80;20907:7;20898:6;20887:9;20883:22;20835:80;:::i;:::-;20817:98;;;;20613:312;20992:2;20981:9;20977:18;20964:32;21023:18;21015:6;21012:30;21009:117;;;21045:79;;:::i;:::-;21009:117;21158:80;21230:7;21221:6;21210:9;21206:22;21158:80;:::i;:::-;21140:98;;;;20935:313;20321:934;;;;;;;:::o;21261:619::-;21338:6;21346;21354;21403:2;21391:9;21382:7;21378:23;21374:32;21371:119;;;21409:79;;:::i;:::-;21371:119;21529:1;21554:53;21599:7;21590:6;21579:9;21575:22;21554:53;:::i;:::-;21544:63;;21500:117;21656:2;21682:53;21727:7;21718:6;21707:9;21703:22;21682:53;:::i;:::-;21672:63;;21627:118;21784:2;21810:53;21855:7;21846:6;21835:9;21831:22;21810:53;:::i;:::-;21800:63;;21755:118;21261:619;;;;;:::o;21886:116::-;21956:21;21971:5;21956:21;:::i;:::-;21949:5;21946:32;21936:60;;21992:1;21989;21982:12;21936:60;21886:116;:::o;22008:133::-;22051:5;22089:6;22076:20;22067:29;;22105:30;22129:5;22105:30;:::i;:::-;22008:133;;;;:::o;22147:323::-;22203:6;22252:2;22240:9;22231:7;22227:23;22223:32;22220:119;;;22258:79;;:::i;:::-;22220:119;22378:1;22403:50;22445:7;22436:6;22425:9;22421:22;22403:50;:::i;:::-;22393:60;;22349:114;22147:323;;;;:::o;22476:468::-;22541:6;22549;22598:2;22586:9;22577:7;22573:23;22569:32;22566:119;;;22604:79;;:::i;:::-;22566:119;22724:1;22749:53;22794:7;22785:6;22774:9;22770:22;22749:53;:::i;:::-;22739:63;;22695:117;22851:2;22877:50;22919:7;22910:6;22899:9;22895:22;22877:50;:::i;:::-;22867:60;;22822:115;22476:468;;;;;:::o;22950:60::-;22978:3;22999:5;22992:12;;22950:60;;;:::o;23016:142::-;23066:9;23099:53;23117:34;23126:24;23144:5;23126:24;:::i;:::-;23117:34;:::i;:::-;23099:53;:::i;:::-;23086:66;;23016:142;;;:::o;23164:126::-;23214:9;23247:37;23278:5;23247:37;:::i;:::-;23234:50;;23164:126;;;:::o;23296:144::-;23364:9;23397:37;23428:5;23397:37;:::i;:::-;23384:50;;23296:144;;;:::o;23446:167::-;23551:55;23600:5;23551:55;:::i;:::-;23546:3;23539:68;23446:167;;:::o;23619:258::-;23730:4;23768:2;23757:9;23753:18;23745:26;;23781:89;23867:1;23856:9;23852:17;23843:6;23781:89;:::i;:::-;23619:258;;;;:::o;23883:843::-;23984:6;23992;24000;24008;24057:2;24045:9;24036:7;24032:23;24028:32;24025:119;;;24063:79;;:::i;:::-;24025:119;24183:1;24208:53;24253:7;24244:6;24233:9;24229:22;24208:53;:::i;:::-;24198:63;;24154:117;24338:2;24327:9;24323:18;24310:32;24369:18;24361:6;24358:30;24355:117;;;24391:79;;:::i;:::-;24355:117;24504:80;24576:7;24567:6;24556:9;24552:22;24504:80;:::i;:::-;24486:98;;;;24281:313;24633:2;24659:50;24701:7;24692:6;24681:9;24677:22;24659:50;:::i;:::-;24649:60;;24604:115;23883:843;;;;;;;:::o;24732:307::-;24793:4;24883:18;24875:6;24872:30;24869:56;;;24905:18;;:::i;:::-;24869:56;24943:29;24965:6;24943:29;:::i;:::-;24935:37;;25027:4;25021;25017:15;25009:23;;24732:307;;;:::o;25045:423::-;25122:5;25147:65;25163:48;25204:6;25163:48;:::i;:::-;25147:65;:::i;:::-;25138:74;;25235:6;25228:5;25221:21;25273:4;25266:5;25262:16;25311:3;25302:6;25297:3;25293:16;25290:25;25287:112;;;25318:79;;:::i;:::-;25287:112;25408:54;25455:6;25450:3;25445;25408:54;:::i;:::-;25128:340;25045:423;;;;;:::o;25487:338::-;25542:5;25591:3;25584:4;25576:6;25572:17;25568:27;25558:122;;25599:79;;:::i;:::-;25558:122;25716:6;25703:20;25741:78;25815:3;25807:6;25800:4;25792:6;25788:17;25741:78;:::i;:::-;25732:87;;25548:277;25487:338;;;;:::o;25831:943::-;25926:6;25934;25942;25950;25999:3;25987:9;25978:7;25974:23;25970:33;25967:120;;;26006:79;;:::i;:::-;25967:120;26126:1;26151:53;26196:7;26187:6;26176:9;26172:22;26151:53;:::i;:::-;26141:63;;26097:117;26253:2;26279:53;26324:7;26315:6;26304:9;26300:22;26279:53;:::i;:::-;26269:63;;26224:118;26381:2;26407:53;26452:7;26443:6;26432:9;26428:22;26407:53;:::i;:::-;26397:63;;26352:118;26537:2;26526:9;26522:18;26509:32;26568:18;26560:6;26557:30;26554:117;;;26590:79;;:::i;:::-;26554:117;26695:62;26749:7;26740:6;26729:9;26725:22;26695:62;:::i;:::-;26685:72;;26480:287;25831:943;;;;;;;:::o;26852:872::-;27009:4;27004:3;27000:14;27096:4;27089:5;27085:16;27079:23;27115:63;27172:4;27167:3;27163:14;27149:12;27115:63;:::i;:::-;27024:164;27280:4;27273:5;27269:16;27263:23;27299:61;27354:4;27349:3;27345:14;27331:12;27299:61;:::i;:::-;27198:172;27454:4;27447:5;27443:16;27437:23;27473:57;27524:4;27519:3;27515:14;27501:12;27473:57;:::i;:::-;27380:160;27627:4;27620:5;27616:16;27610:23;27646:61;27701:4;27696:3;27692:14;27678:12;27646:61;:::i;:::-;27550:167;26978:746;26852:872;;:::o;27730:343::-;27883:4;27921:3;27910:9;27906:19;27898:27;;27935:131;28063:1;28052:9;28048:17;28039:6;27935:131;:::i;:::-;27730:343;;;;:::o;28079:86::-;28114:7;28154:4;28147:5;28143:16;28132:27;;28079:86;;;:::o;28171:112::-;28254:22;28270:5;28254:22;:::i;:::-;28249:3;28242:35;28171:112;;:::o;28289:214::-;28378:4;28416:2;28405:9;28401:18;28393:26;;28429:67;28493:1;28482:9;28478:17;28469:6;28429:67;:::i;:::-;28289:214;;;;:::o;28509:474::-;28577:6;28585;28634:2;28622:9;28613:7;28609:23;28605:32;28602:119;;;28640:79;;:::i;:::-;28602:119;28760:1;28785:53;28830:7;28821:6;28810:9;28806:22;28785:53;:::i;:::-;28775:63;;28731:117;28887:2;28913:53;28958:7;28949:6;28938:9;28934:22;28913:53;:::i;:::-;28903:63;;28858:118;28509:474;;;;;:::o;28989:117::-;29098:1;29095;29088:12;29235:143;29292:5;29323:6;29317:13;29308:22;;29339:33;29366:5;29339:33;:::i;:::-;29235:143;;;;:::o;29384:137::-;29438:5;29469:6;29463:13;29454:22;;29485:30;29509:5;29485:30;:::i;:::-;29384:137;;;;:::o;29527:143::-;29584:5;29615:6;29609:13;29600:22;;29631:33;29658:5;29631:33;:::i;:::-;29527:143;;;;:::o;29705:778::-;29787:5;29831:4;29819:9;29814:3;29810:19;29806:30;29803:117;;;29839:79;;:::i;:::-;29803:117;29938:21;29954:4;29938:21;:::i;:::-;29929:30;;30018:1;30058:60;30114:3;30105:6;30094:9;30090:22;30058:60;:::i;:::-;30051:4;30044:5;30040:16;30033:86;29969:161;30189:2;30230:57;30283:3;30274:6;30263:9;30259:22;30230:57;:::i;:::-;30223:4;30216:5;30212:16;30205:83;30140:159;30363:2;30404:60;30460:3;30451:6;30440:9;30436:22;30404:60;:::i;:::-;30397:4;30390:5;30386:16;30379:86;30309:167;29705:778;;;;:::o;30489:395::-;30581:6;30630:2;30618:9;30609:7;30605:23;30601:32;30598:119;;;30636:79;;:::i;:::-;30598:119;30756:1;30781:86;30859:7;30850:6;30839:9;30835:22;30781:86;:::i;:::-;30771:96;;30727:150;30489:395;;;;:::o;30890:180::-;30938:77;30935:1;30928:88;31035:4;31032:1;31025:15;31059:4;31056:1;31049:15;31076:320;31120:6;31157:1;31151:4;31147:12;31137:22;;31204:1;31198:4;31194:12;31225:18;31215:81;;31281:4;31273:6;31269:17;31259:27;;31215:81;31343:2;31335:6;31332:14;31312:18;31309:38;31306:84;;31362:18;;:::i;:::-;31306:84;31127:269;31076:320;;;:::o;31402:345::-;31469:6;31518:2;31506:9;31497:7;31493:23;31489:32;31486:119;;;31524:79;;:::i;:::-;31486:119;31644:1;31669:61;31722:7;31713:6;31702:9;31698:22;31669:61;:::i;:::-;31659:71;;31615:125;31402:345;;;;:::o;31753:147::-;31854:11;31891:3;31876:18;;31753:147;;;;:::o;31906:114::-;;:::o;32026:398::-;32185:3;32206:83;32287:1;32282:3;32206:83;:::i;:::-;32199:90;;32298:93;32387:3;32298:93;:::i;:::-;32416:1;32411:3;32407:11;32400:18;;32026:398;;;:::o;32430:379::-;32614:3;32636:147;32779:3;32636:147;:::i;:::-;32629:154;;32800:3;32793:10;;32430:379;;;:::o;32815:180::-;32955:32;32951:1;32943:6;32939:14;32932:56;32815:180;:::o;33001:366::-;33143:3;33164:67;33228:2;33223:3;33164:67;:::i;:::-;33157:74;;33240:93;33329:3;33240:93;:::i;:::-;33358:2;33353:3;33349:12;33342:19;;33001:366;;;:::o;33373:419::-;33539:4;33577:2;33566:9;33562:18;33554:26;;33626:9;33620:4;33616:20;33612:1;33601:9;33597:17;33590:47;33654:131;33780:4;33654:131;:::i;:::-;33646:139;;33373:419;;;:::o;33798:442::-;33947:4;33985:2;33974:9;33970:18;33962:26;;33998:71;34066:1;34055:9;34051:17;34042:6;33998:71;:::i;:::-;34079:72;34147:2;34136:9;34132:18;34123:6;34079:72;:::i;:::-;34161;34229:2;34218:9;34214:18;34205:6;34161:72;:::i;:::-;33798:442;;;;;;:::o;34246:98::-;34297:6;34331:5;34325:12;34315:22;;34246:98;;;:::o;34350:386::-;34454:3;34482:38;34514:5;34482:38;:::i;:::-;34536:88;34617:6;34612:3;34536:88;:::i;:::-;34529:95;;34633:65;34691:6;34686:3;34679:4;34672:5;34668:16;34633:65;:::i;:::-;34723:6;34718:3;34714:16;34707:23;;34458:278;34350:386;;;;:::o;34742:271::-;34872:3;34894:93;34983:3;34974:6;34894:93;:::i;:::-;34887:100;;35004:3;34997:10;;34742:271;;;;:::o;35019:141::-;35068:4;35091:3;35083:11;;35114:3;35111:1;35104:14;35148:4;35145:1;35135:18;35127:26;;35019:141;;;:::o;35166:93::-;35203:6;35250:2;35245;35238:5;35234:14;35230:23;35220:33;;35166:93;;;:::o;35265:107::-;35309:8;35359:5;35353:4;35349:16;35328:37;;35265:107;;;;:::o;35378:393::-;35447:6;35497:1;35485:10;35481:18;35520:97;35550:66;35539:9;35520:97;:::i;:::-;35638:39;35668:8;35657:9;35638:39;:::i;:::-;35626:51;;35710:4;35706:9;35699:5;35695:21;35686:30;;35759:4;35749:8;35745:19;35738:5;35735:30;35725:40;;35454:317;;35378:393;;;;;:::o;35777:142::-;35827:9;35860:53;35878:34;35887:24;35905:5;35887:24;:::i;:::-;35878:34;:::i;:::-;35860:53;:::i;:::-;35847:66;;35777:142;;;:::o;35925:75::-;35968:3;35989:5;35982:12;;35925:75;;;:::o;36006:269::-;36116:39;36147:7;36116:39;:::i;:::-;36177:91;36226:41;36250:16;36226:41;:::i;:::-;36218:6;36211:4;36205:11;36177:91;:::i;:::-;36171:4;36164:105;36082:193;36006:269;;;:::o;36281:73::-;36326:3;36281:73;:::o;36360:189::-;36437:32;;:::i;:::-;36478:65;36536:6;36528;36522:4;36478:65;:::i;:::-;36413:136;36360:189;;:::o;36555:186::-;36615:120;36632:3;36625:5;36622:14;36615:120;;;36686:39;36723:1;36716:5;36686:39;:::i;:::-;36659:1;36652:5;36648:13;36639:22;;36615:120;;;36555:186;;:::o;36747:543::-;36848:2;36843:3;36840:11;36837:446;;;36882:38;36914:5;36882:38;:::i;:::-;36966:29;36984:10;36966:29;:::i;:::-;36956:8;36952:44;37149:2;37137:10;37134:18;37131:49;;;37170:8;37155:23;;37131:49;37193:80;37249:22;37267:3;37249:22;:::i;:::-;37239:8;37235:37;37222:11;37193:80;:::i;:::-;36852:431;;36837:446;36747:543;;;:::o;37296:117::-;37350:8;37400:5;37394:4;37390:16;37369:37;;37296:117;;;;:::o;37419:169::-;37463:6;37496:51;37544:1;37540:6;37532:5;37529:1;37525:13;37496:51;:::i;:::-;37492:56;37577:4;37571;37567:15;37557:25;;37470:118;37419:169;;;;:::o;37593:295::-;37669:4;37815:29;37840:3;37834:4;37815:29;:::i;:::-;37807:37;;37877:3;37874:1;37870:11;37864:4;37861:21;37853:29;;37593:295;;;;:::o;37893:1395::-;38010:37;38043:3;38010:37;:::i;:::-;38112:18;38104:6;38101:30;38098:56;;;38134:18;;:::i;:::-;38098:56;38178:38;38210:4;38204:11;38178:38;:::i;:::-;38263:67;38323:6;38315;38309:4;38263:67;:::i;:::-;38357:1;38381:4;38368:17;;38413:2;38405:6;38402:14;38430:1;38425:618;;;;39087:1;39104:6;39101:77;;;39153:9;39148:3;39144:19;39138:26;39129:35;;39101:77;39204:67;39264:6;39257:5;39204:67;:::i;:::-;39198:4;39191:81;39060:222;38395:887;;38425:618;38477:4;38473:9;38465:6;38461:22;38511:37;38543:4;38511:37;:::i;:::-;38570:1;38584:208;38598:7;38595:1;38592:14;38584:208;;;38677:9;38672:3;38668:19;38662:26;38654:6;38647:42;38728:1;38720:6;38716:14;38706:24;;38775:2;38764:9;38760:18;38747:31;;38621:4;38618:1;38614:12;38609:17;;38584:208;;;38820:6;38811:7;38808:19;38805:179;;;38878:9;38873:3;38869:19;38863:26;38921:48;38963:4;38955:6;38951:17;38940:9;38921:48;:::i;:::-;38913:6;38906:64;38828:156;38805:179;39030:1;39026;39018:6;39014:14;39010:22;39004:4;38997:36;38432:611;;;38395:887;;37985:1303;;;37893:1395;;:::o;39294:180::-;39342:77;39339:1;39332:88;39439:4;39436:1;39429:15;39463:4;39460:1;39453:15;39480:173;39620:25;39616:1;39608:6;39604:14;39597:49;39480:173;:::o;39659:366::-;39801:3;39822:67;39886:2;39881:3;39822:67;:::i;:::-;39815:74;;39898:93;39987:3;39898:93;:::i;:::-;40016:2;40011:3;40007:12;40000:19;;39659:366;;;:::o;40031:419::-;40197:4;40235:2;40224:9;40220:18;40212:26;;40284:9;40278:4;40274:20;40270:1;40259:9;40255:17;40248:47;40312:131;40438:4;40312:131;:::i;:::-;40304:139;;40031:419;;;:::o;40485:611::-;40567:5;40611:4;40599:9;40594:3;40590:19;40586:30;40583:117;;;40619:79;;:::i;:::-;40583:117;40718:21;40734:4;40718:21;:::i;:::-;40709:30;;40802:1;40842:60;40898:3;40889:6;40878:9;40874:22;40842:60;:::i;:::-;40835:4;40828:5;40824:16;40817:86;40749:165;40976:2;41017:60;41073:3;41064:6;41053:9;41049:22;41017:60;:::i;:::-;41010:4;41003:5;40999:16;40992:86;40924:165;40485:611;;;;:::o;41102:395::-;41194:6;41243:2;41231:9;41222:7;41218:23;41214:32;41211:119;;;41249:79;;:::i;:::-;41211:119;41369:1;41394:86;41472:7;41463:6;41452:9;41448:22;41394:86;:::i;:::-;41384:96;;41340:150;41102:395;;;;:::o;41503:169::-;41643:21;41639:1;41631:6;41627:14;41620:45;41503:169;:::o;41678:366::-;41820:3;41841:67;41905:2;41900:3;41841:67;:::i;:::-;41834:74;;41917:93;42006:3;41917:93;:::i;:::-;42035:2;42030:3;42026:12;42019:19;;41678:366;;;:::o;42050:419::-;42216:4;42254:2;42243:9;42239:18;42231:26;;42303:9;42297:4;42293:20;42289:1;42278:9;42274:17;42267:47;42331:131;42457:4;42331:131;:::i;:::-;42323:139;;42050:419;;;:::o;42475:166::-;42615:18;42611:1;42603:6;42599:14;42592:42;42475:166;:::o;42647:366::-;42789:3;42810:67;42874:2;42869:3;42810:67;:::i;:::-;42803:74;;42886:93;42975:3;42886:93;:::i;:::-;43004:2;42999:3;42995:12;42988:19;;42647:366;;;:::o;43019:419::-;43185:4;43223:2;43212:9;43208:18;43200:26;;43272:9;43266:4;43262:20;43258:1;43247:9;43243:17;43236:47;43300:131;43426:4;43300:131;:::i;:::-;43292:139;;43019:419;;;:::o;43444:166::-;43584:18;43580:1;43572:6;43568:14;43561:42;43444:166;:::o;43616:366::-;43758:3;43779:67;43843:2;43838:3;43779:67;:::i;:::-;43772:74;;43855:93;43944:3;43855:93;:::i;:::-;43973:2;43968:3;43964:12;43957:19;;43616:366;;;:::o;43988:419::-;44154:4;44192:2;44181:9;44177:18;44169:26;;44241:9;44235:4;44231:20;44227:1;44216:9;44212:17;44205:47;44269:131;44395:4;44269:131;:::i;:::-;44261:139;;43988:419;;;:::o;44413:180::-;44461:77;44458:1;44451:88;44558:4;44555:1;44548:15;44582:4;44579:1;44572:15;44599:191;44639:3;44658:20;44676:1;44658:20;:::i;:::-;44653:25;;44692:20;44710:1;44692:20;:::i;:::-;44687:25;;44735:1;44732;44728:9;44721:16;;44756:3;44753:1;44750:10;44747:36;;;44763:18;;:::i;:::-;44747:36;44599:191;;;;:::o;44796:168::-;44936:20;44932:1;44924:6;44920:14;44913:44;44796:168;:::o;44970:366::-;45112:3;45133:67;45197:2;45192:3;45133:67;:::i;:::-;45126:74;;45209:93;45298:3;45209:93;:::i;:::-;45327:2;45322:3;45318:12;45311:19;;44970:366;;;:::o;45342:419::-;45508:4;45546:2;45535:9;45531:18;45523:26;;45595:9;45589:4;45585:20;45581:1;45570:9;45566:17;45559:47;45623:131;45749:4;45623:131;:::i;:::-;45615:139;;45342:419;;;:::o;45767:174::-;45907:26;45903:1;45895:6;45891:14;45884:50;45767:174;:::o;45947:366::-;46089:3;46110:67;46174:2;46169:3;46110:67;:::i;:::-;46103:74;;46186:93;46275:3;46186:93;:::i;:::-;46304:2;46299:3;46295:12;46288:19;;45947:366;;;:::o;46319:419::-;46485:4;46523:2;46512:9;46508:18;46500:26;;46572:9;46566:4;46562:20;46558:1;46547:9;46543:17;46536:47;46600:131;46726:4;46600:131;:::i;:::-;46592:139;;46319:419;;;:::o;46744:220::-;46884:34;46880:1;46872:6;46868:14;46861:58;46953:3;46948:2;46940:6;46936:15;46929:28;46744:220;:::o;46970:366::-;47112:3;47133:67;47197:2;47192:3;47133:67;:::i;:::-;47126:74;;47209:93;47298:3;47209:93;:::i;:::-;47327:2;47322:3;47318:12;47311:19;;46970:366;;;:::o;47342:419::-;47508:4;47546:2;47535:9;47531:18;47523:26;;47595:9;47589:4;47585:20;47581:1;47570:9;47566:17;47559:47;47623:131;47749:4;47623:131;:::i;:::-;47615:139;;47342:419;;;:::o;47767:167::-;47907:19;47903:1;47895:6;47891:14;47884:43;47767:167;:::o;47940:366::-;48082:3;48103:67;48167:2;48162:3;48103:67;:::i;:::-;48096:74;;48179:93;48268:3;48179:93;:::i;:::-;48297:2;48292:3;48288:12;48281:19;;47940:366;;;:::o;48312:419::-;48478:4;48516:2;48505:9;48501:18;48493:26;;48565:9;48559:4;48555:20;48551:1;48540:9;48536:17;48529:47;48593:131;48719:4;48593:131;:::i;:::-;48585:139;;48312:419;;;:::o;48737:117::-;48846:1;48843;48836:12;48860:98;48944:6;48939:3;48934;48921:30;48860:98;;;:::o;48994:537::-;49122:3;49143:86;49222:6;49217:3;49143:86;:::i;:::-;49136:93;;49253:66;49245:6;49242:78;49239:165;;;49323:79;;:::i;:::-;49239:165;49435:4;49427:6;49423:17;49413:27;;49450:43;49486:6;49481:3;49474:5;49450:43;:::i;:::-;49518:6;49513:3;49509:16;49502:23;;48994:537;;;;;:::o;49537:601::-;49740:4;49778:2;49767:9;49763:18;49755:26;;49827:9;49821:4;49817:20;49813:1;49802:9;49798:17;49791:47;49855:118;49968:4;49959:6;49951;49855:118;:::i;:::-;49847:126;;49983:72;50051:2;50040:9;50036:18;50027:6;49983:72;:::i;:::-;50065:66;50127:2;50116:9;50112:18;50103:6;50065:66;:::i;:::-;49537:601;;;;;;;:::o;50144:348::-;50184:7;50207:20;50225:1;50207:20;:::i;:::-;50202:25;;50241:20;50259:1;50241:20;:::i;:::-;50236:25;;50429:1;50361:66;50357:74;50354:1;50351:81;50346:1;50339:9;50332:17;50328:105;50325:131;;;50436:18;;:::i;:::-;50325:131;50484:1;50481;50477:9;50466:20;;50144:348;;;;:::o;50498:148::-;50600:11;50637:3;50622:18;;50498:148;;;;:::o;50652:390::-;50758:3;50786:39;50819:5;50786:39;:::i;:::-;50841:89;50923:6;50918:3;50841:89;:::i;:::-;50834:96;;50939:65;50997:6;50992:3;50985:4;50978:5;50974:16;50939:65;:::i;:::-;51029:6;51024:3;51020:16;51013:23;;50762:280;50652:390;;;;:::o;51048:435::-;51228:3;51250:95;51341:3;51332:6;51250:95;:::i;:::-;51243:102;;51362:95;51453:3;51444:6;51362:95;:::i;:::-;51355:102;;51474:3;51467:10;;51048:435;;;;;:::o;51489:332::-;51610:4;51648:2;51637:9;51633:18;51625:26;;51661:71;51729:1;51718:9;51714:17;51705:6;51661:71;:::i;:::-;51742:72;51810:2;51799:9;51795:18;51786:6;51742:72;:::i;:::-;51489:332;;;;;:::o;51827:351::-;51897:6;51946:2;51934:9;51925:7;51921:23;51917:32;51914:119;;;51952:79;;:::i;:::-;51914:119;52072:1;52097:64;52153:7;52144:6;52133:9;52129:22;52097:64;:::i;:::-;52087:74;;52043:128;51827:351;;;;:::o;52184:221::-;52324:34;52320:1;52312:6;52308:14;52301:58;52393:4;52388:2;52380:6;52376:15;52369:29;52184:221;:::o;52411:366::-;52553:3;52574:67;52638:2;52633:3;52574:67;:::i;:::-;52567:74;;52650:93;52739:3;52650:93;:::i;:::-;52768:2;52763:3;52759:12;52752:19;;52411:366;;;:::o;52783:419::-;52949:4;52987:2;52976:9;52972:18;52964:26;;53036:9;53030:4;53026:20;53022:1;53011:9;53007:17;53000:47;53064:131;53190:4;53064:131;:::i;:::-;53056:139;;52783:419;;;:::o;53208:168::-;53291:11;53325:6;53320:3;53313:19;53365:4;53360:3;53356:14;53341:29;;53208:168;;;;:::o;53382:373::-;53468:3;53496:38;53528:5;53496:38;:::i;:::-;53550:70;53613:6;53608:3;53550:70;:::i;:::-;53543:77;;53629:65;53687:6;53682:3;53675:4;53668:5;53664:16;53629:65;:::i;:::-;53719:29;53741:6;53719:29;:::i;:::-;53714:3;53710:39;53703:46;;53472:283;53382:373;;;;:::o;53761:640::-;53956:4;53994:3;53983:9;53979:19;53971:27;;54008:71;54076:1;54065:9;54061:17;54052:6;54008:71;:::i;:::-;54089:72;54157:2;54146:9;54142:18;54133:6;54089:72;:::i;:::-;54171;54239:2;54228:9;54224:18;54215:6;54171:72;:::i;:::-;54290:9;54284:4;54280:20;54275:2;54264:9;54260:18;54253:48;54318:76;54389:4;54380:6;54318:76;:::i;:::-;54310:84;;53761:640;;;;;;;:::o;54407:141::-;54463:5;54494:6;54488:13;54479:22;;54510:32;54536:5;54510:32;:::i;:::-;54407:141;;;;:::o;54554:349::-;54623:6;54672:2;54660:9;54651:7;54647:23;54643:32;54640:119;;;54678:79;;:::i;:::-;54640:119;54798:1;54823:63;54878:7;54869:6;54858:9;54854:22;54823:63;:::i;:::-;54813:73;;54769:127;54554:349;;;;:::o;54909:233::-;54948:3;54971:24;54989:5;54971:24;:::i;:::-;54962:33;;55017:66;55010:5;55007:77;55004:103;;55087:18;;:::i;:::-;55004:103;55134:1;55127:5;55123:13;55116:20;;54909:233;;;:::o;55148:180::-;55196:77;55193:1;55186:88;55293:4;55290:1;55283:15;55317:4;55314:1;55307:15;55334:185;55374:1;55391:20;55409:1;55391:20;:::i;:::-;55386:25;;55425:20;55443:1;55425:20;:::i;:::-;55420:25;;55464:1;55454:35;;55469:18;;:::i;:::-;55454:35;55511:1;55508;55504:9;55499:14;;55334:185;;;;:::o;55525:194::-;55565:4;55585:20;55603:1;55585:20;:::i;:::-;55580:25;;55619:20;55637:1;55619:20;:::i;:::-;55614:25;;55663:1;55660;55656:9;55648:17;;55687:1;55681:4;55678:11;55675:37;;;55692:18;;:::i;:::-;55675:37;55525:194;;;;:::o;55725:188::-;55763:3;55782:18;55798:1;55782:18;:::i;:::-;55777:23;;55814:18;55830:1;55814:18;:::i;:::-;55809:23;;55855:1;55852;55848:9;55841:16;;55878:4;55873:3;55870:13;55867:39;;;55886:18;;:::i;:::-;55867:39;55725:188;;;;:::o
Swarm Source
ipfs://9ec1321dafb0fe88f55ab1517915b68fe167a7fd5b5b706f0423e957e16dac05
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.