ERC-721
Overview
Max Total Supply
235 PHTM
Holders
166
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 PHTMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Phantoms
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-10 */ // File: @openzeppelin/contracts/utils/structs/BitMaps.sol pragma solidity ^0.8.0; /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo( BitMap storage bitmap, uint256 index, bool value ) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/Phantoms.sol pragma solidity ^0.8.0; contract Phantoms is Ownable, ERC721Enumerable { using Strings for uint256; using BitMaps for BitMaps.BitMap; uint256 public onAuction; // of tokens put on auction string public sourceCode; mapping (address => bool) private _participated; //only for DA BitMaps.BitMap private _spectralClaimed; IERC721Enumerable private _spectrals = IERC721Enumerable(0xc29EecF43C89071fA2e8fEbBbbaD86c14D7F4C44); bytes32 private _merkleRoot = 0xc85d1b056eb792ee2dc79028b11688b34c785a490b2252e5e9722a56ac1e14cd; string private _baseTokenURI; mapping (address => bool) private _claimed; constructor(uint256 quantityToAuction) ERC721("Phantoms", "PHTM") { onAuction = quantityToAuction; } function withdraw() onlyOwner public { Address.sendValue(payable(owner()), address(this).balance); } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseTokenURI) onlyOwner public { _baseTokenURI = baseTokenURI; } function setMerkleProof(bytes32 root) onlyOwner public { _merkleRoot = root; } function uploadSourceCode(string calldata code) onlyOwner public { sourceCode = code; } uint256 public constant phantomPrice = 40000000000000000; bool public auctionState = false; uint256 public merkleClaimed = 0; uint256 public dutchClaimed = 0; uint256 startingPrice; uint64 startingBlock; uint64 decreasingConstant; uint64 period; //period (in blocks) during which price will decrease function setAuction(uint256 startingPrice_, uint64 startingBlock_, uint64 decreasingConstant_, uint64 period_) onlyOwner public { startingPrice = startingPrice_; startingBlock = startingBlock_; decreasingConstant = decreasingConstant_; period = period_; } function getPrice() public view returns (uint256) { uint256 price = startingPrice; if (block.number <= startingBlock) return price; uint256 floorPrice = price - period * decreasingConstant; unchecked { price -= decreasingConstant * (block.number - startingBlock); } return price >= floorPrice && price <= startingPrice ? price : floorPrice; } function verifyBid() internal returns (uint256) { require(startingBlock > 0, "AUCTION:NOT CREATED"); require(block.number >= startingBlock, "PURCHASE:AUCTION NOT STARTED"); uint256 price = getPrice(); require(msg.value >= price, "PURCHASE:INCORRECT MSG.VALUE"); if (msg.value - price > 0) Address.sendValue(payable(msg.sender), msg.value-price); //refund difference return price; } function ownerMint(address to) onlyOwner public { _safeMint(to, totalSupply()); } function merkleClaim(bytes32[] calldata proof) public payable { require(!_claimed[msg.sender], "already claimed"); _claimed[msg.sender] = true; bytes32 node = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, _merkleRoot, node), "invalid proof"); require(msg.value >= phantomPrice, "not enough"); _safeMint(msg.sender, totalSupply()); merkleClaimed++; } function bid() public payable { require(!Address.isContract(msg.sender), "is a contract"); require(onAuction > 0, "sold out"); require(!_participated[msg.sender], "already bought one"); onAuction--; require(_spectrals.balanceOf(msg.sender) > 0, "no spectrals owned"); uint256 paid = verifyBid(); _safeMint(msg.sender, totalSupply()); _participated[msg.sender] = true; payout(paid); dutchClaimed++; } function payout(uint256 amount) internal { Address.sendValue(payable(owner()), amount); } function flipAuctionState() public onlyOwner { auctionState = !auctionState; } function burn(uint256 tokenId) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "BURN:CALLER ISN'T OWNER OR APPROVED"); super._burn(tokenId); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return string(abi.encodePacked(_baseURI(), "/", tokenId.toString())); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"quantityToAuction","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dutchClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipAuctionState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"merkleClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"merkleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phantomPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingPrice_","type":"uint256"},{"internalType":"uint64","name":"startingBlock_","type":"uint64"},{"internalType":"uint64","name":"decreasingConstant_","type":"uint64"},{"internalType":"uint64","name":"period_","type":"uint64"}],"name":"setAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sourceCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"uploadSourceCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405273c29eecf43c89071fa2e8febbbbad86c14d7f4c44600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc85d1b056eb792ee2dc79028b11688b34c785a490b2252e5e9722a56ac1e14cd60001b6010556000601360006101000a81548160ff02191690831515021790555060006014556000601555348015620000b257600080fd5b506040516200547e3803806200547e8339818101604052810190620000d8919062000339565b6040518060400160405280600881526020017f5068616e746f6d730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5048544d000000000000000000000000000000000000000000000000000000008152506200016462000158620001a660201b60201c565b620001ae60201b60201c565b81600190805190602001906200017c92919062000272565b5080600290805190602001906200019592919062000272565b50505080600b8190555050620003ee565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000280906200036f565b90600052602060002090601f016020900481019282620002a45760008555620002f0565b82601f10620002bf57805160ff1916838001178555620002f0565b82800160010185558215620002f0579182015b82811115620002ef578251825591602001919060010190620002d2565b5b509050620002ff919062000303565b5090565b5b808211156200031e57600081600090555060010162000304565b5090565b6000815190506200033381620003d4565b92915050565b6000602082840312156200034c57600080fd5b60006200035c8482850162000322565b91505092915050565b6000819050919050565b600060028204905060018216806200038857607f821691505b602082108114156200039f576200039e620003a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620003df8162000365565b8114620003eb57600080fd5b50565b61508080620003fe6000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063d8fc689a1161006f578063d8fc689a14610759578063e985e9c514610784578063ee73c473146107c1578063f2fde38b146107d8578063f94e9ef1146108015761020f565b8063a22cb4651461069f578063b5dfb495146106c8578063b88d4fde146106f3578063c87b56dd1461071c5761020f565b806386758912116100e757806386758912146105cc5780638da5cb5b146105f557806395d89b411461062057806397b0e0251461064b57806398d5fdca146106745761020f565b806370a0823114610531578063715018a61461056e5780637a490137146105855780637fb45099146105a15761020f565b806323b872dd1161019b57806342966c681161016a57806342966c681461043a5780634b08689a146104635780634f6ccce71461048e57806355f804b3146104cb5780636352211e146104f45761020f565b806323b872dd146103945780632f745c59146103bd5780633ccfd60b146103fa57806342842e0e146104115761020f565b806313c60177116101e257806313c60177146102e257806318160ddd1461030d57806318eb2724146103385780631998aeef146103615780631e3bcc8e1461036b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613989565b61082c565b604051610248919061471a565b60405180910390f35b34801561025d57600080fd5b5061026661083e565b6040516102739190614735565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613a61565b6108d0565b6040516102b091906146b3565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906138df565b610955565b005b3480156102ee57600080fd5b506102f7610a6d565b6040516103049190614735565b60405180910390f35b34801561031957600080fd5b50610322610afb565b60405161032f9190614b17565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906139db565b610b08565b005b610369610b9a565b005b34801561037757600080fd5b50610392600480360381019061038d9190613774565b610e53565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906137d9565b610ee3565b005b3480156103c957600080fd5b506103e460048036038101906103df91906138df565b610f43565b6040516103f19190614b17565b60405180910390f35b34801561040657600080fd5b5061040f610fe8565b005b34801561041d57600080fd5b50610438600480360381019061043391906137d9565b611077565b005b34801561044657600080fd5b50610461600480360381019061045c9190613a61565b611097565b005b34801561046f57600080fd5b506104786110f3565b6040516104859190614b17565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613a61565b6110f9565b6040516104c29190614b17565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed9190613a20565b611190565b005b34801561050057600080fd5b5061051b60048036038101906105169190613a61565b611226565b60405161052891906146b3565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613774565b6112d8565b6040516105659190614b17565b60405180910390f35b34801561057a57600080fd5b50610583611390565b005b61059f600480360381019061059a919061391b565b611418565b005b3480156105ad57600080fd5b506105b661162d565b6040516105c3919061471a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613960565b611640565b005b34801561060157600080fd5b5061060a6116c6565b60405161061791906146b3565b60405180910390f35b34801561062c57600080fd5b506106356116ef565b6040516106429190614735565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613ab3565b611781565b005b34801561068057600080fd5b50610689611885565b6040516106969190614b17565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906138a3565b61197d565b005b3480156106d457600080fd5b506106dd611afe565b6040516106ea9190614b17565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613828565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e9190613a61565b611b66565b6040516107509190614735565b60405180910390f35b34801561076557600080fd5b5061076e611ba0565b60405161077b9190614b17565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a6919061379d565b611ba6565b6040516107b8919061471a565b60405180910390f35b3480156107cd57600080fd5b506107d6611c3a565b005b3480156107e457600080fd5b506107ff60048036038101906107fa9190613774565b611ce2565b005b34801561080d57600080fd5b50610816611dda565b6040516108239190614b17565b60405180910390f35b600061083782611de5565b9050919050565b60606001805461084d90614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461087990614e0c565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611e5f565b61091a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610911906149d7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096082611226565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890614a97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f0611ecb565b73ffffffffffffffffffffffffffffffffffffffff161480610a1f5750610a1e81610a19611ecb565b611ba6565b5b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590614937565b60405180910390fd5b610a688383611ed3565b505050565b600c8054610a7a90614e0c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa690614e0c565b8015610af35780601f10610ac857610100808354040283529160200191610af3565b820191906000526020600020905b815481529060010190602001808311610ad657829003601f168201915b505050505081565b6000600980549050905090565b610b10611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610b2e6116c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7b906149f7565b60405180910390fd5b8181600c9190610b9592919061343f565b505050565b610ba333611f8c565b15610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90614a77565b60405180910390fd5b6000600b5411610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614917565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614757565b60405180910390fd5b600b6000815480929190610cc890614de2565b91905055506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d2a91906146b3565b60206040518083038186803b158015610d4257600080fd5b505afa158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a9190613a8a565b11610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614a17565b60405180910390fd5b6000610dc4611f9f565b9050610dd733610dd2610afb565b6120e6565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e3881612104565b60156000815480929190610e4b90614e3e565b919050555050565b610e5b611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610e796116c6565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906149f7565b60405180910390fd5b610ee081610edb610afb565b6120e6565b50565b610ef4610eee611ecb565b82612118565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90614ab7565b60405180910390fd5b610f3e8383836121f6565b505050565b6000610f4e836112d8565b8210610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690614797565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff0611ecb565b73ffffffffffffffffffffffffffffffffffffffff1661100e6116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906149f7565b60405180910390fd5b61107561106f6116c6565b47612452565b565b61109283838360405180602001604052806000815250611b04565b505050565b6110a86110a2611ecb565b82612118565b6110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90614777565b60405180910390fd5b6110f081612546565b50565b600b5481565b6000611103610afb565b8210611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614af7565b60405180910390fd5b6009828154811061117e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611198611ecb565b73ffffffffffffffffffffffffffffffffffffffff166111b66116c6565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611203906149f7565b60405180910390fd5b80601190805190602001906112229291906134c5565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614977565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614957565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611398611ecb565b73ffffffffffffffffffffffffffffffffffffffff166113b66116c6565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611403906149f7565b60405180910390fd5b6114166000612657565b565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614817565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000336040516020016115109190614628565b604051602081830303815290604052805190602001209050611576838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361271b565b6115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90614ad7565b60405180910390fd5b668e1bc9bf0400003410156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614837565b60405180910390fd5b6116103361160b610afb565b6120e6565b6014600081548092919061162390614e3e565b9190505550505050565b601360009054906101000a900460ff1681565b611648611ecb565b73ffffffffffffffffffffffffffffffffffffffff166116666116c6565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b3906149f7565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116fe90614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614e0c565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b5050505050905090565b611789611ecb565b73ffffffffffffffffffffffffffffffffffffffff166117a76116c6565b73ffffffffffffffffffffffffffffffffffffffff16146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f4906149f7565b60405180910390fd5b8360168190555082601760006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081601760086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080601760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6000806016549050601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1643116118bd578091505061197a565b6000601760089054906101000a900467ffffffffffffffff16601760109054906101000a900467ffffffffffffffff166118f79190614c98565b67ffffffffffffffff168261190c9190614cda565b9050601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff164303601760089054906101000a900467ffffffffffffffff1667ffffffffffffffff16028203915080821015801561196957506016548211155b6119735780611975565b815b925050505b90565b611985611ecb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90614877565b60405180910390fd5b8060066000611a00611ecb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aad611ecb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af2919061471a565b60405180910390a35050565b60155481565b611b15611b0f611ecb565b83612118565b611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b90614ab7565b60405180910390fd5b611b60848484846127f7565b50505050565b6060611b70612853565b611b79836128e5565b604051602001611b8a92919061466f565b6040516020818303038152906040529050919050565b60145481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c42611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611c606116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906149f7565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611cea611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611d086116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906149f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc5906147d7565b60405180910390fd5b611dd781612657565b50565b668e1bc9bf04000081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e585750611e5782612a92565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4683611226565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080823b905060008111915050919050565b600080601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa90614a57565b60405180910390fd5b601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff16431015612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614997565b60405180910390fd5b6000612070611885565b9050803410156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614897565b60405180910390fd5b600081346120c39190614cda565b11156120df576120de3382346120d99190614cda565b612452565b5b8091505090565b612100828260405180602001604052806000815250612b74565b5050565b61211561210f6116c6565b82612452565b50565b600061212382611e5f565b612162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612159906148f7565b60405180910390fd5b600061216d83611226565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121dc57508373ffffffffffffffffffffffffffffffffffffffff166121c4846108d0565b73ffffffffffffffffffffffffffffffffffffffff16145b806121ed57506121ec8185611ba6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661221682611226565b73ffffffffffffffffffffffffffffffffffffffff161461226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614a37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d390614857565b60405180910390fd5b6122e7838383612bcf565b6122f2600082611ed3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123429190614cda565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123999190614c11565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906148d7565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516124bb9061469e565b60006040518083038185875af1925050503d80600081146124f8576040519150601f19603f3d011682016040523d82523d6000602084013e6124fd565b606091505b5050905080612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906148b7565b60405180910390fd5b505050565b600061255182611226565b905061255f81600084612bcf565b61256a600083611ed3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ba9190614cda565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b85518110156127e9576000868281518110612768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116127a957828160405160200161278c929190614643565b6040516020818303038152906040528051906020012092506127d5565b80836040516020016127bc929190614643565b6040516020818303038152906040528051906020012092505b5080806127e190614e3e565b915050612724565b508381149150509392505050565b6128028484846121f6565b61280e84848484612bdf565b61284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906147b7565b60405180910390fd5b50505050565b60606011805461286290614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461288e90614e0c565b80156128db5780601f106128b0576101008083540402835291602001916128db565b820191906000526020600020905b8154815290600101906020018083116128be57829003601f168201915b5050505050905090565b6060600082141561292d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8d565b600082905060005b6000821461295f57808061294890614e3e565b915050600a826129589190614c67565b9150612935565b60008167ffffffffffffffff8111156129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129d35781602001600182028036833780820191505090505b5090505b60008514612a86576001826129ec9190614cda565b9150600a856129fb9190614eb5565b6030612a079190614c11565b60f81b818381518110612a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a7f9190614c67565b94506129d7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b5d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b6d5750612b6c82612d76565b5b9050919050565b612b7e8383612de0565b612b8b6000848484612bdf565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc1906147b7565b60405180910390fd5b505050565b612bda838383612fae565b505050565b6000612c008473ffffffffffffffffffffffffffffffffffffffff16611f8c565b15612d69578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c29611ecb565b8786866040518563ffffffff1660e01b8152600401612c4b94939291906146ce565b602060405180830381600087803b158015612c6557600080fd5b505af1925050508015612c9657506040513d601f19601f82011682018060405250810190612c9391906139b2565b60015b612d19573d8060008114612cc6576040519150601f19603f3d011682016040523d82523d6000602084013e612ccb565b606091505b50600081511415612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d08906147b7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d6e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e47906149b7565b60405180910390fd5b612e5981611e5f565b15612e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e90906147f7565b60405180910390fd5b612ea560008383612bcf565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef59190614c11565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612fb98383836130c2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffc57612ff7816130c7565b61303b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303a576130398382613110565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561307e576130798161327d565b6130bd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130bc576130bb82826133c0565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161311d846112d8565b6131279190614cda565b905060006008600084815260200190815260200160002054905081811461320c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132919190614cda565b90506000600a60008481526020019081526020016000205490506000600983815481106132e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806009838154811061332f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806133a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133cb836112d8565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461344b90614e0c565b90600052602060002090601f01602090048101928261346d57600085556134b4565b82601f1061348657803560ff19168380011785556134b4565b828001600101855582156134b4579182015b828111156134b3578235825591602001919060010190613498565b5b5090506134c1919061354b565b5090565b8280546134d190614e0c565b90600052602060002090601f0160209004810192826134f3576000855561353a565b82601f1061350c57805160ff191683800117855561353a565b8280016001018555821561353a579182015b8281111561353957825182559160200191906001019061351e565b5b509050613547919061354b565b5090565b5b8082111561356457600081600090555060010161354c565b5090565b600061357b61357684614b63565b614b32565b90508281526020810184848401111561359357600080fd5b61359e848285614da0565b509392505050565b60006135b96135b484614b93565b614b32565b9050828152602081018484840111156135d157600080fd5b6135dc848285614da0565b509392505050565b6000813590506135f381614fc0565b92915050565b60008083601f84011261360b57600080fd5b8235905067ffffffffffffffff81111561362457600080fd5b60208301915083602082028301111561363c57600080fd5b9250929050565b60008135905061365281614fd7565b92915050565b60008135905061366781614fee565b92915050565b60008135905061367c81615005565b92915050565b60008151905061369181615005565b92915050565b600082601f8301126136a857600080fd5b81356136b8848260208601613568565b91505092915050565b60008083601f8401126136d357600080fd5b8235905067ffffffffffffffff8111156136ec57600080fd5b60208301915083600182028301111561370457600080fd5b9250929050565b600082601f83011261371c57600080fd5b813561372c8482602086016135a6565b91505092915050565b6000813590506137448161501c565b92915050565b6000815190506137598161501c565b92915050565b60008135905061376e81615033565b92915050565b60006020828403121561378657600080fd5b6000613794848285016135e4565b91505092915050565b600080604083850312156137b057600080fd5b60006137be858286016135e4565b92505060206137cf858286016135e4565b9150509250929050565b6000806000606084860312156137ee57600080fd5b60006137fc868287016135e4565b935050602061380d868287016135e4565b925050604061381e86828701613735565b9150509250925092565b6000806000806080858703121561383e57600080fd5b600061384c878288016135e4565b945050602061385d878288016135e4565b935050604061386e87828801613735565b925050606085013567ffffffffffffffff81111561388b57600080fd5b61389787828801613697565b91505092959194509250565b600080604083850312156138b657600080fd5b60006138c4858286016135e4565b92505060206138d585828601613643565b9150509250929050565b600080604083850312156138f257600080fd5b6000613900858286016135e4565b925050602061391185828601613735565b9150509250929050565b6000806020838503121561392e57600080fd5b600083013567ffffffffffffffff81111561394857600080fd5b613954858286016135f9565b92509250509250929050565b60006020828403121561397257600080fd5b600061398084828501613658565b91505092915050565b60006020828403121561399b57600080fd5b60006139a98482850161366d565b91505092915050565b6000602082840312156139c457600080fd5b60006139d284828501613682565b91505092915050565b600080602083850312156139ee57600080fd5b600083013567ffffffffffffffff811115613a0857600080fd5b613a14858286016136c1565b92509250509250929050565b600060208284031215613a3257600080fd5b600082013567ffffffffffffffff811115613a4c57600080fd5b613a588482850161370b565b91505092915050565b600060208284031215613a7357600080fd5b6000613a8184828501613735565b91505092915050565b600060208284031215613a9c57600080fd5b6000613aaa8482850161374a565b91505092915050565b60008060008060808587031215613ac957600080fd5b6000613ad787828801613735565b9450506020613ae88782880161375f565b9350506040613af98782880161375f565b9250506060613b0a8782880161375f565b91505092959194509250565b613b1f81614d0e565b82525050565b613b36613b3182614d0e565b614e87565b82525050565b613b4581614d20565b82525050565b613b5c613b5782614d2c565b614e99565b82525050565b6000613b6d82614bc3565b613b778185614bd9565b9350613b87818560208601614daf565b613b9081614fa2565b840191505092915050565b6000613ba682614bce565b613bb08185614bf5565b9350613bc0818560208601614daf565b613bc981614fa2565b840191505092915050565b6000613bdf82614bce565b613be98185614c06565b9350613bf9818560208601614daf565b80840191505092915050565b6000613c12601283614bf5565b91507f616c726561647920626f75676874206f6e6500000000000000000000000000006000830152602082019050919050565b6000613c52602383614bf5565b91507f4255524e3a43414c4c45522049534e2754204f574e4552204f5220415050524f60008301527f56454400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb8602b83614bf5565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1e603283614bf5565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d84602683614bf5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dea601c83614bf5565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e2a600f83614bf5565b91507f616c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b6000613e6a600a83614bf5565b91507f6e6f7420656e6f756768000000000000000000000000000000000000000000006000830152602082019050919050565b6000613eaa602483614bf5565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f10601983614bf5565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f50601c83614bf5565b91507f50555243484153453a494e434f5252454354204d53472e56414c5545000000006000830152602082019050919050565b6000613f90603a83614bf5565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613ff6601d83614bf5565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000614036602c83614bf5565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061409c600883614bf5565b91507f736f6c64206f75740000000000000000000000000000000000000000000000006000830152602082019050919050565b60006140dc603883614bf5565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614142602a83614bf5565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a8602983614bf5565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420e601c83614bf5565b91507f50555243484153453a41554354494f4e204e4f542053544152544544000000006000830152602082019050919050565b600061424e602083614bf5565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428e602c83614bf5565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142f4602083614bf5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614334601283614bf5565b91507f6e6f20737065637472616c73206f776e656400000000000000000000000000006000830152602082019050919050565b6000614374602983614bf5565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143da601383614bf5565b91507f41554354494f4e3a4e4f542043524541544544000000000000000000000000006000830152602082019050919050565b600061441a600d83614bf5565b91507f6973206120636f6e7472616374000000000000000000000000000000000000006000830152602082019050919050565b600061445a602183614bf5565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c0600083614bea565b9150600082019050919050565b60006144da603183614bf5565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614540600d83614bf5565b91507f696e76616c69642070726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614580602c83614bf5565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006145e6600183614c06565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61462281614d82565b82525050565b60006146348284613b25565b60148201915081905092915050565b600061464f8285613b4b565b60208201915061465f8284613b4b565b6020820191508190509392505050565b600061467b8285613bd4565b9150614686826145d9565b91506146928284613bd4565b91508190509392505050565b60006146a9826144b3565b9150819050919050565b60006020820190506146c86000830184613b16565b92915050565b60006080820190506146e36000830187613b16565b6146f06020830186613b16565b6146fd6040830185614619565b818103606083015261470f8184613b62565b905095945050505050565b600060208201905061472f6000830184613b3c565b92915050565b6000602082019050818103600083015261474f8184613b9b565b905092915050565b6000602082019050818103600083015261477081613c05565b9050919050565b6000602082019050818103600083015261479081613c45565b9050919050565b600060208201905081810360008301526147b081613cab565b9050919050565b600060208201905081810360008301526147d081613d11565b9050919050565b600060208201905081810360008301526147f081613d77565b9050919050565b6000602082019050818103600083015261481081613ddd565b9050919050565b6000602082019050818103600083015261483081613e1d565b9050919050565b6000602082019050818103600083015261485081613e5d565b9050919050565b6000602082019050818103600083015261487081613e9d565b9050919050565b6000602082019050818103600083015261489081613f03565b9050919050565b600060208201905081810360008301526148b081613f43565b9050919050565b600060208201905081810360008301526148d081613f83565b9050919050565b600060208201905081810360008301526148f081613fe9565b9050919050565b6000602082019050818103600083015261491081614029565b9050919050565b600060208201905081810360008301526149308161408f565b9050919050565b60006020820190508181036000830152614950816140cf565b9050919050565b6000602082019050818103600083015261497081614135565b9050919050565b600060208201905081810360008301526149908161419b565b9050919050565b600060208201905081810360008301526149b081614201565b9050919050565b600060208201905081810360008301526149d081614241565b9050919050565b600060208201905081810360008301526149f081614281565b9050919050565b60006020820190508181036000830152614a10816142e7565b9050919050565b60006020820190508181036000830152614a3081614327565b9050919050565b60006020820190508181036000830152614a5081614367565b9050919050565b60006020820190508181036000830152614a70816143cd565b9050919050565b60006020820190508181036000830152614a908161440d565b9050919050565b60006020820190508181036000830152614ab08161444d565b9050919050565b60006020820190508181036000830152614ad0816144cd565b9050919050565b60006020820190508181036000830152614af081614533565b9050919050565b60006020820190508181036000830152614b1081614573565b9050919050565b6000602082019050614b2c6000830184614619565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b5957614b58614f73565b5b8060405250919050565b600067ffffffffffffffff821115614b7e57614b7d614f73565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bae57614bad614f73565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1c82614d82565b9150614c2783614d82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5c57614c5b614ee6565b5b828201905092915050565b6000614c7282614d82565b9150614c7d83614d82565b925082614c8d57614c8c614f15565b5b828204905092915050565b6000614ca382614d8c565b9150614cae83614d8c565b92508167ffffffffffffffff0483118215151615614ccf57614cce614ee6565b5b828202905092915050565b6000614ce582614d82565b9150614cf083614d82565b925082821015614d0357614d02614ee6565b5b828203905092915050565b6000614d1982614d62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614dcd578082015181840152602081019050614db2565b83811115614ddc576000848401525b50505050565b6000614ded82614d82565b91506000821415614e0157614e00614ee6565b5b600182039050919050565b60006002820490506001821680614e2457607f821691505b60208210811415614e3857614e37614f44565b5b50919050565b6000614e4982614d82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e7c57614e7b614ee6565b5b600182019050919050565b6000614e9282614ea3565b9050919050565b6000819050919050565b6000614eae82614fb3565b9050919050565b6000614ec082614d82565b9150614ecb83614d82565b925082614edb57614eda614f15565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614fc981614d0e565b8114614fd457600080fd5b50565b614fe081614d20565b8114614feb57600080fd5b50565b614ff781614d2c565b811461500257600080fd5b50565b61500e81614d36565b811461501957600080fd5b50565b61502581614d82565b811461503057600080fd5b50565b61503c81614d8c565b811461504757600080fd5b5056fea26469706673582212204780ef46b8211df120be039160cc3dc2d8d0e99292e3c3407ad11edf55f747f664736f6c634300080000330000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063d8fc689a1161006f578063d8fc689a14610759578063e985e9c514610784578063ee73c473146107c1578063f2fde38b146107d8578063f94e9ef1146108015761020f565b8063a22cb4651461069f578063b5dfb495146106c8578063b88d4fde146106f3578063c87b56dd1461071c5761020f565b806386758912116100e757806386758912146105cc5780638da5cb5b146105f557806395d89b411461062057806397b0e0251461064b57806398d5fdca146106745761020f565b806370a0823114610531578063715018a61461056e5780637a490137146105855780637fb45099146105a15761020f565b806323b872dd1161019b57806342966c681161016a57806342966c681461043a5780634b08689a146104635780634f6ccce71461048e57806355f804b3146104cb5780636352211e146104f45761020f565b806323b872dd146103945780632f745c59146103bd5780633ccfd60b146103fa57806342842e0e146104115761020f565b806313c60177116101e257806313c60177146102e257806318160ddd1461030d57806318eb2724146103385780631998aeef146103615780631e3bcc8e1461036b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613989565b61082c565b604051610248919061471a565b60405180910390f35b34801561025d57600080fd5b5061026661083e565b6040516102739190614735565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613a61565b6108d0565b6040516102b091906146b3565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906138df565b610955565b005b3480156102ee57600080fd5b506102f7610a6d565b6040516103049190614735565b60405180910390f35b34801561031957600080fd5b50610322610afb565b60405161032f9190614b17565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a91906139db565b610b08565b005b610369610b9a565b005b34801561037757600080fd5b50610392600480360381019061038d9190613774565b610e53565b005b3480156103a057600080fd5b506103bb60048036038101906103b691906137d9565b610ee3565b005b3480156103c957600080fd5b506103e460048036038101906103df91906138df565b610f43565b6040516103f19190614b17565b60405180910390f35b34801561040657600080fd5b5061040f610fe8565b005b34801561041d57600080fd5b50610438600480360381019061043391906137d9565b611077565b005b34801561044657600080fd5b50610461600480360381019061045c9190613a61565b611097565b005b34801561046f57600080fd5b506104786110f3565b6040516104859190614b17565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190613a61565b6110f9565b6040516104c29190614b17565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed9190613a20565b611190565b005b34801561050057600080fd5b5061051b60048036038101906105169190613a61565b611226565b60405161052891906146b3565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613774565b6112d8565b6040516105659190614b17565b60405180910390f35b34801561057a57600080fd5b50610583611390565b005b61059f600480360381019061059a919061391b565b611418565b005b3480156105ad57600080fd5b506105b661162d565b6040516105c3919061471a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613960565b611640565b005b34801561060157600080fd5b5061060a6116c6565b60405161061791906146b3565b60405180910390f35b34801561062c57600080fd5b506106356116ef565b6040516106429190614735565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613ab3565b611781565b005b34801561068057600080fd5b50610689611885565b6040516106969190614b17565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c191906138a3565b61197d565b005b3480156106d457600080fd5b506106dd611afe565b6040516106ea9190614b17565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613828565b611b04565b005b34801561072857600080fd5b50610743600480360381019061073e9190613a61565b611b66565b6040516107509190614735565b60405180910390f35b34801561076557600080fd5b5061076e611ba0565b60405161077b9190614b17565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a6919061379d565b611ba6565b6040516107b8919061471a565b60405180910390f35b3480156107cd57600080fd5b506107d6611c3a565b005b3480156107e457600080fd5b506107ff60048036038101906107fa9190613774565b611ce2565b005b34801561080d57600080fd5b50610816611dda565b6040516108239190614b17565b60405180910390f35b600061083782611de5565b9050919050565b60606001805461084d90614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461087990614e0c565b80156108c65780601f1061089b576101008083540402835291602001916108c6565b820191906000526020600020905b8154815290600101906020018083116108a957829003601f168201915b5050505050905090565b60006108db82611e5f565b61091a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610911906149d7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096082611226565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890614a97565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109f0611ecb565b73ffffffffffffffffffffffffffffffffffffffff161480610a1f5750610a1e81610a19611ecb565b611ba6565b5b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590614937565b60405180910390fd5b610a688383611ed3565b505050565b600c8054610a7a90614e0c565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa690614e0c565b8015610af35780601f10610ac857610100808354040283529160200191610af3565b820191906000526020600020905b815481529060010190602001808311610ad657829003601f168201915b505050505081565b6000600980549050905090565b610b10611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610b2e6116c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7b906149f7565b60405180910390fd5b8181600c9190610b9592919061343f565b505050565b610ba333611f8c565b15610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90614a77565b60405180910390fd5b6000600b5411610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614917565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614757565b60405180910390fd5b600b6000815480929190610cc890614de2565b91905055506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d2a91906146b3565b60206040518083038186803b158015610d4257600080fd5b505afa158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a9190613a8a565b11610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614a17565b60405180910390fd5b6000610dc4611f9f565b9050610dd733610dd2610afb565b6120e6565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e3881612104565b60156000815480929190610e4b90614e3e565b919050555050565b610e5b611ecb565b73ffffffffffffffffffffffffffffffffffffffff16610e796116c6565b73ffffffffffffffffffffffffffffffffffffffff1614610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906149f7565b60405180910390fd5b610ee081610edb610afb565b6120e6565b50565b610ef4610eee611ecb565b82612118565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90614ab7565b60405180910390fd5b610f3e8383836121f6565b505050565b6000610f4e836112d8565b8210610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690614797565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ff0611ecb565b73ffffffffffffffffffffffffffffffffffffffff1661100e6116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906149f7565b60405180910390fd5b61107561106f6116c6565b47612452565b565b61109283838360405180602001604052806000815250611b04565b505050565b6110a86110a2611ecb565b82612118565b6110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90614777565b60405180910390fd5b6110f081612546565b50565b600b5481565b6000611103610afb565b8210611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614af7565b60405180910390fd5b6009828154811061117e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611198611ecb565b73ffffffffffffffffffffffffffffffffffffffff166111b66116c6565b73ffffffffffffffffffffffffffffffffffffffff161461120c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611203906149f7565b60405180910390fd5b80601190805190602001906112229291906134c5565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614977565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614957565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611398611ecb565b73ffffffffffffffffffffffffffffffffffffffff166113b66116c6565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611403906149f7565b60405180910390fd5b6114166000612657565b565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614817565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000336040516020016115109190614628565b604051602081830303815290604052805190602001209050611576838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361271b565b6115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90614ad7565b60405180910390fd5b668e1bc9bf0400003410156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690614837565b60405180910390fd5b6116103361160b610afb565b6120e6565b6014600081548092919061162390614e3e565b9190505550505050565b601360009054906101000a900460ff1681565b611648611ecb565b73ffffffffffffffffffffffffffffffffffffffff166116666116c6565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b3906149f7565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546116fe90614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614e0c565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b5050505050905090565b611789611ecb565b73ffffffffffffffffffffffffffffffffffffffff166117a76116c6565b73ffffffffffffffffffffffffffffffffffffffff16146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f4906149f7565b60405180910390fd5b8360168190555082601760006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081601760086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080601760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6000806016549050601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1643116118bd578091505061197a565b6000601760089054906101000a900467ffffffffffffffff16601760109054906101000a900467ffffffffffffffff166118f79190614c98565b67ffffffffffffffff168261190c9190614cda565b9050601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff164303601760089054906101000a900467ffffffffffffffff1667ffffffffffffffff16028203915080821015801561196957506016548211155b6119735780611975565b815b925050505b90565b611985611ecb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90614877565b60405180910390fd5b8060066000611a00611ecb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aad611ecb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af2919061471a565b60405180910390a35050565b60155481565b611b15611b0f611ecb565b83612118565b611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b90614ab7565b60405180910390fd5b611b60848484846127f7565b50505050565b6060611b70612853565b611b79836128e5565b604051602001611b8a92919061466f565b6040516020818303038152906040529050919050565b60145481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c42611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611c606116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad906149f7565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611cea611ecb565b73ffffffffffffffffffffffffffffffffffffffff16611d086116c6565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d55906149f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc5906147d7565b60405180910390fd5b611dd781612657565b50565b668e1bc9bf04000081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e585750611e5782612a92565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4683611226565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080823b905060008111915050919050565b600080601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa90614a57565b60405180910390fd5b601760009054906101000a900467ffffffffffffffff1667ffffffffffffffff16431015612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614997565b60405180910390fd5b6000612070611885565b9050803410156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614897565b60405180910390fd5b600081346120c39190614cda565b11156120df576120de3382346120d99190614cda565b612452565b5b8091505090565b612100828260405180602001604052806000815250612b74565b5050565b61211561210f6116c6565b82612452565b50565b600061212382611e5f565b612162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612159906148f7565b60405180910390fd5b600061216d83611226565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121dc57508373ffffffffffffffffffffffffffffffffffffffff166121c4846108d0565b73ffffffffffffffffffffffffffffffffffffffff16145b806121ed57506121ec8185611ba6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661221682611226565b73ffffffffffffffffffffffffffffffffffffffff161461226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614a37565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d390614857565b60405180910390fd5b6122e7838383612bcf565b6122f2600082611ed3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123429190614cda565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123999190614c11565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906148d7565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516124bb9061469e565b60006040518083038185875af1925050503d80600081146124f8576040519150601f19603f3d011682016040523d82523d6000602084013e6124fd565b606091505b5050905080612541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612538906148b7565b60405180910390fd5b505050565b600061255182611226565b905061255f81600084612bcf565b61256a600083611ed3565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ba9190614cda565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b85518110156127e9576000868281518110612768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116127a957828160405160200161278c929190614643565b6040516020818303038152906040528051906020012092506127d5565b80836040516020016127bc929190614643565b6040516020818303038152906040528051906020012092505b5080806127e190614e3e565b915050612724565b508381149150509392505050565b6128028484846121f6565b61280e84848484612bdf565b61284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906147b7565b60405180910390fd5b50505050565b60606011805461286290614e0c565b80601f016020809104026020016040519081016040528092919081815260200182805461288e90614e0c565b80156128db5780601f106128b0576101008083540402835291602001916128db565b820191906000526020600020905b8154815290600101906020018083116128be57829003601f168201915b5050505050905090565b6060600082141561292d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8d565b600082905060005b6000821461295f57808061294890614e3e565b915050600a826129589190614c67565b9150612935565b60008167ffffffffffffffff8111156129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129d35781602001600182028036833780820191505090505b5090505b60008514612a86576001826129ec9190614cda565b9150600a856129fb9190614eb5565b6030612a079190614c11565b60f81b818381518110612a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a7f9190614c67565b94506129d7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b5d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b6d5750612b6c82612d76565b5b9050919050565b612b7e8383612de0565b612b8b6000848484612bdf565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc1906147b7565b60405180910390fd5b505050565b612bda838383612fae565b505050565b6000612c008473ffffffffffffffffffffffffffffffffffffffff16611f8c565b15612d69578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c29611ecb565b8786866040518563ffffffff1660e01b8152600401612c4b94939291906146ce565b602060405180830381600087803b158015612c6557600080fd5b505af1925050508015612c9657506040513d601f19601f82011682018060405250810190612c9391906139b2565b60015b612d19573d8060008114612cc6576040519150601f19603f3d011682016040523d82523d6000602084013e612ccb565b606091505b50600081511415612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d08906147b7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d6e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e47906149b7565b60405180910390fd5b612e5981611e5f565b15612e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e90906147f7565b60405180910390fd5b612ea560008383612bcf565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef59190614c11565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612fb98383836130c2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffc57612ff7816130c7565b61303b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303a576130398382613110565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561307e576130798161327d565b6130bd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130bc576130bb82826133c0565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161311d846112d8565b6131279190614cda565b905060006008600084815260200190815260200160002054905081811461320c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132919190614cda565b90506000600a60008481526020019081526020016000205490506000600983815481106132e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806009838154811061332f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806133a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133cb836112d8565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461344b90614e0c565b90600052602060002090601f01602090048101928261346d57600085556134b4565b82601f1061348657803560ff19168380011785556134b4565b828001600101855582156134b4579182015b828111156134b3578235825591602001919060010190613498565b5b5090506134c1919061354b565b5090565b8280546134d190614e0c565b90600052602060002090601f0160209004810192826134f3576000855561353a565b82601f1061350c57805160ff191683800117855561353a565b8280016001018555821561353a579182015b8281111561353957825182559160200191906001019061351e565b5b509050613547919061354b565b5090565b5b8082111561356457600081600090555060010161354c565b5090565b600061357b61357684614b63565b614b32565b90508281526020810184848401111561359357600080fd5b61359e848285614da0565b509392505050565b60006135b96135b484614b93565b614b32565b9050828152602081018484840111156135d157600080fd5b6135dc848285614da0565b509392505050565b6000813590506135f381614fc0565b92915050565b60008083601f84011261360b57600080fd5b8235905067ffffffffffffffff81111561362457600080fd5b60208301915083602082028301111561363c57600080fd5b9250929050565b60008135905061365281614fd7565b92915050565b60008135905061366781614fee565b92915050565b60008135905061367c81615005565b92915050565b60008151905061369181615005565b92915050565b600082601f8301126136a857600080fd5b81356136b8848260208601613568565b91505092915050565b60008083601f8401126136d357600080fd5b8235905067ffffffffffffffff8111156136ec57600080fd5b60208301915083600182028301111561370457600080fd5b9250929050565b600082601f83011261371c57600080fd5b813561372c8482602086016135a6565b91505092915050565b6000813590506137448161501c565b92915050565b6000815190506137598161501c565b92915050565b60008135905061376e81615033565b92915050565b60006020828403121561378657600080fd5b6000613794848285016135e4565b91505092915050565b600080604083850312156137b057600080fd5b60006137be858286016135e4565b92505060206137cf858286016135e4565b9150509250929050565b6000806000606084860312156137ee57600080fd5b60006137fc868287016135e4565b935050602061380d868287016135e4565b925050604061381e86828701613735565b9150509250925092565b6000806000806080858703121561383e57600080fd5b600061384c878288016135e4565b945050602061385d878288016135e4565b935050604061386e87828801613735565b925050606085013567ffffffffffffffff81111561388b57600080fd5b61389787828801613697565b91505092959194509250565b600080604083850312156138b657600080fd5b60006138c4858286016135e4565b92505060206138d585828601613643565b9150509250929050565b600080604083850312156138f257600080fd5b6000613900858286016135e4565b925050602061391185828601613735565b9150509250929050565b6000806020838503121561392e57600080fd5b600083013567ffffffffffffffff81111561394857600080fd5b613954858286016135f9565b92509250509250929050565b60006020828403121561397257600080fd5b600061398084828501613658565b91505092915050565b60006020828403121561399b57600080fd5b60006139a98482850161366d565b91505092915050565b6000602082840312156139c457600080fd5b60006139d284828501613682565b91505092915050565b600080602083850312156139ee57600080fd5b600083013567ffffffffffffffff811115613a0857600080fd5b613a14858286016136c1565b92509250509250929050565b600060208284031215613a3257600080fd5b600082013567ffffffffffffffff811115613a4c57600080fd5b613a588482850161370b565b91505092915050565b600060208284031215613a7357600080fd5b6000613a8184828501613735565b91505092915050565b600060208284031215613a9c57600080fd5b6000613aaa8482850161374a565b91505092915050565b60008060008060808587031215613ac957600080fd5b6000613ad787828801613735565b9450506020613ae88782880161375f565b9350506040613af98782880161375f565b9250506060613b0a8782880161375f565b91505092959194509250565b613b1f81614d0e565b82525050565b613b36613b3182614d0e565b614e87565b82525050565b613b4581614d20565b82525050565b613b5c613b5782614d2c565b614e99565b82525050565b6000613b6d82614bc3565b613b778185614bd9565b9350613b87818560208601614daf565b613b9081614fa2565b840191505092915050565b6000613ba682614bce565b613bb08185614bf5565b9350613bc0818560208601614daf565b613bc981614fa2565b840191505092915050565b6000613bdf82614bce565b613be98185614c06565b9350613bf9818560208601614daf565b80840191505092915050565b6000613c12601283614bf5565b91507f616c726561647920626f75676874206f6e6500000000000000000000000000006000830152602082019050919050565b6000613c52602383614bf5565b91507f4255524e3a43414c4c45522049534e2754204f574e4552204f5220415050524f60008301527f56454400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb8602b83614bf5565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1e603283614bf5565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d84602683614bf5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dea601c83614bf5565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e2a600f83614bf5565b91507f616c726561647920636c61696d656400000000000000000000000000000000006000830152602082019050919050565b6000613e6a600a83614bf5565b91507f6e6f7420656e6f756768000000000000000000000000000000000000000000006000830152602082019050919050565b6000613eaa602483614bf5565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f10601983614bf5565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f50601c83614bf5565b91507f50555243484153453a494e434f5252454354204d53472e56414c5545000000006000830152602082019050919050565b6000613f90603a83614bf5565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613ff6601d83614bf5565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000614036602c83614bf5565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061409c600883614bf5565b91507f736f6c64206f75740000000000000000000000000000000000000000000000006000830152602082019050919050565b60006140dc603883614bf5565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614142602a83614bf5565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141a8602983614bf5565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061420e601c83614bf5565b91507f50555243484153453a41554354494f4e204e4f542053544152544544000000006000830152602082019050919050565b600061424e602083614bf5565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428e602c83614bf5565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142f4602083614bf5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614334601283614bf5565b91507f6e6f20737065637472616c73206f776e656400000000000000000000000000006000830152602082019050919050565b6000614374602983614bf5565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143da601383614bf5565b91507f41554354494f4e3a4e4f542043524541544544000000000000000000000000006000830152602082019050919050565b600061441a600d83614bf5565b91507f6973206120636f6e7472616374000000000000000000000000000000000000006000830152602082019050919050565b600061445a602183614bf5565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c0600083614bea565b9150600082019050919050565b60006144da603183614bf5565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614540600d83614bf5565b91507f696e76616c69642070726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614580602c83614bf5565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006145e6600183614c06565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61462281614d82565b82525050565b60006146348284613b25565b60148201915081905092915050565b600061464f8285613b4b565b60208201915061465f8284613b4b565b6020820191508190509392505050565b600061467b8285613bd4565b9150614686826145d9565b91506146928284613bd4565b91508190509392505050565b60006146a9826144b3565b9150819050919050565b60006020820190506146c86000830184613b16565b92915050565b60006080820190506146e36000830187613b16565b6146f06020830186613b16565b6146fd6040830185614619565b818103606083015261470f8184613b62565b905095945050505050565b600060208201905061472f6000830184613b3c565b92915050565b6000602082019050818103600083015261474f8184613b9b565b905092915050565b6000602082019050818103600083015261477081613c05565b9050919050565b6000602082019050818103600083015261479081613c45565b9050919050565b600060208201905081810360008301526147b081613cab565b9050919050565b600060208201905081810360008301526147d081613d11565b9050919050565b600060208201905081810360008301526147f081613d77565b9050919050565b6000602082019050818103600083015261481081613ddd565b9050919050565b6000602082019050818103600083015261483081613e1d565b9050919050565b6000602082019050818103600083015261485081613e5d565b9050919050565b6000602082019050818103600083015261487081613e9d565b9050919050565b6000602082019050818103600083015261489081613f03565b9050919050565b600060208201905081810360008301526148b081613f43565b9050919050565b600060208201905081810360008301526148d081613f83565b9050919050565b600060208201905081810360008301526148f081613fe9565b9050919050565b6000602082019050818103600083015261491081614029565b9050919050565b600060208201905081810360008301526149308161408f565b9050919050565b60006020820190508181036000830152614950816140cf565b9050919050565b6000602082019050818103600083015261497081614135565b9050919050565b600060208201905081810360008301526149908161419b565b9050919050565b600060208201905081810360008301526149b081614201565b9050919050565b600060208201905081810360008301526149d081614241565b9050919050565b600060208201905081810360008301526149f081614281565b9050919050565b60006020820190508181036000830152614a10816142e7565b9050919050565b60006020820190508181036000830152614a3081614327565b9050919050565b60006020820190508181036000830152614a5081614367565b9050919050565b60006020820190508181036000830152614a70816143cd565b9050919050565b60006020820190508181036000830152614a908161440d565b9050919050565b60006020820190508181036000830152614ab08161444d565b9050919050565b60006020820190508181036000830152614ad0816144cd565b9050919050565b60006020820190508181036000830152614af081614533565b9050919050565b60006020820190508181036000830152614b1081614573565b9050919050565b6000602082019050614b2c6000830184614619565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b5957614b58614f73565b5b8060405250919050565b600067ffffffffffffffff821115614b7e57614b7d614f73565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614bae57614bad614f73565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1c82614d82565b9150614c2783614d82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5c57614c5b614ee6565b5b828201905092915050565b6000614c7282614d82565b9150614c7d83614d82565b925082614c8d57614c8c614f15565b5b828204905092915050565b6000614ca382614d8c565b9150614cae83614d8c565b92508167ffffffffffffffff0483118215151615614ccf57614cce614ee6565b5b828202905092915050565b6000614ce582614d82565b9150614cf083614d82565b925082821015614d0357614d02614ee6565b5b828203905092915050565b6000614d1982614d62565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614dcd578082015181840152602081019050614db2565b83811115614ddc576000848401525b50505050565b6000614ded82614d82565b91506000821415614e0157614e00614ee6565b5b600182039050919050565b60006002820490506001821680614e2457607f821691505b60208210811415614e3857614e37614f44565b5b50919050565b6000614e4982614d82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e7c57614e7b614ee6565b5b600182019050919050565b6000614e9282614ea3565b9050919050565b6000819050919050565b6000614eae82614fb3565b9050919050565b6000614ec082614d82565b9150614ecb83614d82565b925082614edb57614eda614f15565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614fc981614d0e565b8114614fd457600080fd5b50565b614fe081614d20565b8114614feb57600080fd5b50565b614ff781614d2c565b811461500257600080fd5b50565b61500e81614d36565b811461501957600080fd5b50565b61502581614d82565b811461503057600080fd5b50565b61503c81614d8c565b811461504757600080fd5b5056fea26469706673582212204780ef46b8211df120be039160cc3dc2d8d0e99292e3c3407ad11edf55f747f664736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : quantityToAuction (uint256): 100
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode Sourcemap
46457:4858:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51141:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27144:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28703:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28226:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46645:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40883:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47681:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49867:494;;;:::i;:::-;;49310:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29593:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40551:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47225:114;;;;;;;;;;;;;:::i;:::-;;30003:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50584:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46586:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41073:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47461:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26838:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26568:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7834:94;;;;;;;;;;;;;:::i;:::-;;49413:446;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47853:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47581:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7183:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27313:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48132:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48440:414;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28996:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47931:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30259:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50769:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47892:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29362:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50484:92;;;;;;;;;;;;;:::i;:::-;;8083:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47790:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51141:171;51244:4;51268:36;51292:11;51268:23;:36::i;:::-;51261:43;;51141:171;;;:::o;27144:100::-;27198:13;27231:5;27224:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27144:100;:::o;28703:221::-;28779:7;28807:16;28815:7;28807;:16::i;:::-;28799:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28892:15;:24;28908:7;28892:24;;;;;;;;;;;;;;;;;;;;;28885:31;;28703:221;;;:::o;28226:411::-;28307:13;28323:23;28338:7;28323:14;:23::i;:::-;28307:39;;28371:5;28365:11;;:2;:11;;;;28357:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28465:5;28449:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28474:37;28491:5;28498:12;:10;:12::i;:::-;28474:16;:37::i;:::-;28449:62;28427:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28608:21;28617:2;28621:7;28608:8;:21::i;:::-;28226:411;;;:::o;46645:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40883:113::-;40944:7;40971:10;:17;;;;40964:24;;40883:113;:::o;47681:101::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47770:4:::1;;47757:10;:17;;;;;;;:::i;:::-;;47681:101:::0;;:::o;49867:494::-;49917:30;49936:10;49917:18;:30::i;:::-;49916:31;49908:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49996:1;49984:9;;:13;49976:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;50030:13;:25;50044:10;50030:25;;;;;;;;;;;;;;;;;;;;;;;;;50029:26;50021:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50089:9;;:11;;;;;;;;;:::i;:::-;;;;;;50154:1;50119:10;;;;;;;;;;;:20;;;50140:10;50119:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;50111:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50189:12;50204:11;:9;:11::i;:::-;50189:26;;50226:36;50236:10;50248:13;:11;:13::i;:::-;50226:9;:36::i;:::-;50301:4;50273:13;:25;50287:10;50273:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;50316:12;50323:4;50316:6;:12::i;:::-;50339;;:14;;;;;;;;;:::i;:::-;;;;;;49867:494;:::o;49310:95::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49369:28:::1;49379:2;49383:13;:11;:13::i;:::-;49369:9;:28::i;:::-;49310:95:::0;:::o;29593:339::-;29788:41;29807:12;:10;:12::i;:::-;29821:7;29788:18;:41::i;:::-;29780:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29896:28;29906:4;29912:2;29916:7;29896:9;:28::i;:::-;29593:339;;;:::o;40551:256::-;40648:7;40684:23;40701:5;40684:16;:23::i;:::-;40676:5;:31;40668:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40773:12;:19;40786:5;40773:19;;;;;;;;;;;;;;;:26;40793:5;40773:26;;;;;;;;;;;;40766:33;;40551:256;;;;:::o;47225:114::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47273:58:::1;47299:7;:5;:7::i;:::-;47309:21;47273:17;:58::i;:::-;47225:114::o:0;30003:185::-;30141:39;30158:4;30164:2;30168:7;30141:39;;;;;;;;;;;;:16;:39::i;:::-;30003:185;;;:::o;50584:177::-;50641:41;50660:12;:10;:12::i;:::-;50674:7;50641:18;:41::i;:::-;50633:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;50733:20;50745:7;50733:11;:20::i;:::-;50584:177;:::o;46586:24::-;;;;:::o;41073:233::-;41148:7;41184:30;:28;:30::i;:::-;41176:5;:38;41168:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41281:10;41292:5;41281:17;;;;;;;;;;;;;;;;;;;;;;;;41274:24;;41073:233;;;:::o;47461:112::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47553:12:::1;47537:13;:28;;;;;;;;;;;;:::i;:::-;;47461:112:::0;:::o;26838:239::-;26910:7;26930:13;26946:7;:16;26954:7;26946:16;;;;;;;;;;;;;;;;;;;;;26930:32;;26998:1;26981:19;;:5;:19;;;;26973:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27064:5;27057:12;;;26838:239;;;:::o;26568:208::-;26640:7;26685:1;26668:19;;:5;:19;;;;26660:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26752:9;:16;26762:5;26752:16;;;;;;;;;;;;;;;;26745:23;;26568:208;;;:::o;7834:94::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7899:21:::1;7917:1;7899:9;:21::i;:::-;7834:94::o:0;49413:446::-;49495:8;:20;49504:10;49495:20;;;;;;;;;;;;;;;;;;;;;;;;;49494:21;49486:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49569:4;49546:8;:20;49555:10;49546:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;49584:12;49626:10;49609:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49599:39;;;;;;49584:54;;49657:44;49676:5;;49657:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49683:11;;49696:4;49657:18;:44::i;:::-;49649:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47829:17;49738:9;:25;;49730:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;49789:36;49799:10;49811:13;:11;:13::i;:::-;49789:9;:36::i;:::-;49836:13;;:15;;;;;;;;;:::i;:::-;;;;;;49413:446;;;:::o;47853:32::-;;;;;;;;;;;;;:::o;47581:92::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47661:4:::1;47647:11;:18;;;;47581:92:::0;:::o;7183:87::-;7229:7;7256:6;;;;;;;;;;;7249:13;;7183:87;:::o;27313:104::-;27369:13;27402:7;27395:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27313:104;:::o;48132:296::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48287:14:::1;48271:13;:30;;;;48328:14;48312:13;;:30;;;;;;;;;;;;;;;;;;48374:19;48353:18;;:40;;;;;;;;;;;;;;;;;;48413:7;48404:6;;:16;;;;;;;;;;;;;;;;;;48132:296:::0;;;;:::o;48440:414::-;48481:7;48501:13;48517;;48501:29;;48561:13;;;;;;;;;;;48545:29;;:12;:29;48541:47;;48583:5;48576:12;;;;;48541:47;48599:18;48637;;;;;;;;;;;48628:6;;;;;;;;;;;:27;;;;:::i;:::-;48620:35;;:5;:35;;;;:::i;:::-;48599:56;;48737:13;;;;;;;;;;;48722:28;;:12;:28;48700:18;;;;;;;;;;;:51;;;48691:60;;;;48789:10;48780:5;:19;;:45;;;;;48812:13;;48803:5;:22;;48780:45;:66;;48836:10;48780:66;;;48828:5;48780:66;48773:73;;;;48440:414;;:::o;28996:295::-;29111:12;:10;:12::i;:::-;29099:24;;:8;:24;;;;29091:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29211:8;29166:18;:32;29185:12;:10;:12::i;:::-;29166:32;;;;;;;;;;;;;;;:42;29199:8;29166:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29264:8;29235:48;;29250:12;:10;:12::i;:::-;29235:48;;;29274:8;29235:48;;;;;;:::i;:::-;;;;;;;;28996:295;;:::o;47931:31::-;;;;:::o;30259:328::-;30434:41;30453:12;:10;:12::i;:::-;30467:7;30434:18;:41::i;:::-;30426:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30540:39;30554:4;30560:2;30564:7;30573:5;30540:13;:39::i;:::-;30259:328;;;;:::o;50769:175::-;50842:13;50899:10;:8;:10::i;:::-;50916:18;:7;:16;:18::i;:::-;50882:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50868:68;;50769:175;;;:::o;47892:32::-;;;;:::o;29362:164::-;29459:4;29483:18;:25;29502:5;29483:25;;;;;;;;;;;;;;;:35;29509:8;29483:35;;;;;;;;;;;;;;;;;;;;;;;;;29476:42;;29362:164;;;;:::o;50484:92::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50556:12:::1;;;;;;;;;;;50555:13;50540:12;;:28;;;;;;;;;;;;;;;;;;50484:92::o:0;8083:192::-;7414:12;:10;:12::i;:::-;7403:23;;:7;:5;:7::i;:::-;:23;;;7395:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8192:1:::1;8172:22;;:8;:22;;;;8164:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8248:19;8258:8;8248:9;:19::i;:::-;8083:192:::0;:::o;47790:56::-;47829:17;47790:56;:::o;40243:224::-;40345:4;40384:35;40369:50;;;:11;:50;;;;:90;;;;40423:36;40447:11;40423:23;:36::i;:::-;40369:90;40362:97;;40243:224;;;:::o;32097:127::-;32162:4;32214:1;32186:30;;:7;:16;32194:7;32186:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32179:37;;32097:127;;;:::o;5971:98::-;6024:7;6051:10;6044:17;;5971:98;:::o;36079:174::-;36181:2;36154:15;:24;36170:7;36154:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36237:7;36233:2;36199:46;;36208:23;36223:7;36208:14;:23::i;:::-;36199:46;;;;;;;;;;;;36079:174;;:::o;9229:387::-;9289:4;9497:12;9564:7;9552:20;9544:28;;9607:1;9600:4;:8;9593:15;;;9229:387;;;:::o;48862:440::-;48901:7;48945:1;48929:13;;;;;;;;;;;:17;;;48921:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49005:13;;;;;;;;;;;48989:29;;:12;:29;;48981:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49062:13;49078:10;:8;:10::i;:::-;49062:26;;49120:5;49107:9;:18;;49099:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49193:1;49185:5;49173:9;:17;;;;:::i;:::-;:21;49169:82;;;49196:55;49222:10;49245:5;49235:9;:15;;;;:::i;:::-;49196:17;:55::i;:::-;49169:82;49289:5;49282:12;;;48862:440;:::o;33081:110::-;33157:26;33167:2;33171:7;33157:26;;;;;;;;;;;;:9;:26::i;:::-;33081:110;;:::o;50373:103::-;50425:43;50451:7;:5;:7::i;:::-;50461:6;50425:17;:43::i;:::-;50373:103;:::o;32391:348::-;32484:4;32509:16;32517:7;32509;:16::i;:::-;32501:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32585:13;32601:23;32616:7;32601:14;:23::i;:::-;32585:39;;32654:5;32643:16;;:7;:16;;;:51;;;;32687:7;32663:31;;:20;32675:7;32663:11;:20::i;:::-;:31;;;32643:51;:87;;;;32698:32;32715:5;32722:7;32698:16;:32::i;:::-;32643:87;32635:96;;;32391:348;;;;:::o;35383:578::-;35542:4;35515:31;;:23;35530:7;35515:14;:23::i;:::-;:31;;;35507:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35625:1;35611:16;;:2;:16;;;;35603:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35681:39;35702:4;35708:2;35712:7;35681:20;:39::i;:::-;35785:29;35802:1;35806:7;35785:8;:29::i;:::-;35846:1;35827:9;:15;35837:4;35827:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35875:1;35858:9;:13;35868:2;35858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35906:2;35887:7;:16;35895:7;35887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35945:7;35941:2;35926:27;;35935:4;35926:27;;;;;;;;;;;;35383:578;;;:::o;10551:317::-;10666:6;10641:21;:31;;10633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10720:12;10738:9;:14;;10760:6;10738:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10719:52;;;10790:7;10782:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10551:317;;;:::o;34686:360::-;34746:13;34762:23;34777:7;34762:14;:23::i;:::-;34746:39;;34798:48;34819:5;34834:1;34838:7;34798:20;:48::i;:::-;34887:29;34904:1;34908:7;34887:8;:29::i;:::-;34949:1;34929:9;:16;34939:5;34929:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34968:7;:16;34976:7;34968:16;;;;;;;;;;;;34961:23;;;;;;;;;;;35030:7;35026:1;35002:36;;35011:5;35002:36;;;;;;;;;;;;34686:360;;:::o;8283:173::-;8339:16;8358:6;;;;;;;;;;;8339:25;;8384:8;8375:6;;:17;;;;;;;;;;;;;;;;;;8439:8;8408:40;;8429:8;8408:40;;;;;;;;;;;;8283:173;;:::o;2439:830::-;2564:4;2581:20;2604:4;2581:27;;2626:9;2621:525;2645:5;:12;2641:1;:16;2621:525;;;2679:20;2702:5;2708:1;2702:8;;;;;;;;;;;;;;;;;;;;;;2679:31;;2747:12;2731;:28;2727:408;;2901:12;2915;2884:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2874:55;;;;;;2859:70;;2727:408;;;3091:12;3105;3074:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3064:55;;;;;;3049:70;;2727:408;2621:525;2659:3;;;;;:::i;:::-;;;;2621:525;;;;3257:4;3241:12;:20;3234:27;;;2439:830;;;;;:::o;31469:315::-;31626:28;31636:4;31642:2;31646:7;31626:9;:28::i;:::-;31673:48;31696:4;31702:2;31706:7;31715:5;31673:22;:48::i;:::-;31665:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31469:315;;;;:::o;47347:106::-;47399:13;47432;47425:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47347:106;:::o;3587:723::-;3643:13;3873:1;3864:5;:10;3860:53;;;3891:10;;;;;;;;;;;;;;;;;;;;;3860:53;3923:12;3938:5;3923:20;;3954:14;3979:78;3994:1;3986:4;:9;3979:78;;4012:8;;;;;:::i;:::-;;;;4043:2;4035:10;;;;;:::i;:::-;;;3979:78;;;4067:19;4099:6;4089:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4067:39;;4117:154;4133:1;4124:5;:10;4117:154;;4161:1;4151:11;;;;;:::i;:::-;;;4228:2;4220:5;:10;;;;:::i;:::-;4207:2;:24;;;;:::i;:::-;4194:39;;4177:6;4184;4177:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;4257:2;4248:11;;;;;:::i;:::-;;;4117:154;;;4295:6;4281:21;;;;;3587:723;;;;:::o;26199:305::-;26301:4;26353:25;26338:40;;;:11;:40;;;;:105;;;;26410:33;26395:48;;;:11;:48;;;;26338:105;:158;;;;26460:36;26484:11;26460:23;:36::i;:::-;26338:158;26318:178;;26199:305;;;:::o;33418:321::-;33548:18;33554:2;33558:7;33548:5;:18::i;:::-;33599:54;33630:1;33634:2;33638:7;33647:5;33599:22;:54::i;:::-;33577:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33418:321;;;:::o;50952:181::-;51080:45;51107:4;51113:2;51117:7;51080:26;:45::i;:::-;50952:181;;;:::o;36818:799::-;36973:4;36994:15;:2;:13;;;:15::i;:::-;36990:620;;;37046:2;37030:36;;;37067:12;:10;:12::i;:::-;37081:4;37087:7;37096:5;37030:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37026:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37289:1;37272:6;:13;:18;37268:272;;;37315:60;;;;;;;;;;:::i;:::-;;;;;;;;37268:272;37490:6;37484:13;37475:6;37471:2;37467:15;37460:38;37026:529;37163:41;;;37153:51;;;:6;:51;;;;37146:58;;;;;36990:620;37594:4;37587:11;;36818:799;;;;;;;:::o;19169:157::-;19254:4;19293:25;19278:40;;;:11;:40;;;;19271:47;;19169:157;;;:::o;34075:382::-;34169:1;34155:16;;:2;:16;;;;34147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34228:16;34236:7;34228;:16::i;:::-;34227:17;34219:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34290:45;34319:1;34323:2;34327:7;34290:20;:45::i;:::-;34365:1;34348:9;:13;34358:2;34348:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34396:2;34377:7;:16;34385:7;34377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34441:7;34437:2;34416:33;;34433:1;34416:33;;;;;;;;;;;;34075:382;;:::o;41919:589::-;42063:45;42090:4;42096:2;42100:7;42063:26;:45::i;:::-;42141:1;42125:18;;:4;:18;;;42121:187;;;42160:40;42192:7;42160:31;:40::i;:::-;42121:187;;;42230:2;42222:10;;:4;:10;;;42218:90;;42249:47;42282:4;42288:7;42249:32;:47::i;:::-;42218:90;42121:187;42336:1;42322:16;;:2;:16;;;42318:183;;;42355:45;42392:7;42355:36;:45::i;:::-;42318:183;;;42428:4;42422:10;;:2;:10;;;42418:83;;42449:40;42477:2;42481:7;42449:27;:40::i;:::-;42418:83;42318:183;41919:589;;;:::o;38189:126::-;;;;:::o;43231:164::-;43335:10;:17;;;;43308:15;:24;43324:7;43308:24;;;;;;;;;;;:44;;;;43363:10;43379:7;43363:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43231:164;:::o;44022:988::-;44288:22;44338:1;44313:22;44330:4;44313:16;:22::i;:::-;:26;;;;:::i;:::-;44288:51;;44350:18;44371:17;:26;44389:7;44371:26;;;;;;;;;;;;44350:47;;44518:14;44504:10;:28;44500:328;;44549:19;44571:12;:18;44584:4;44571:18;;;;;;;;;;;;;;;:34;44590:14;44571:34;;;;;;;;;;;;44549:56;;44655:11;44622:12;:18;44635:4;44622:18;;;;;;;;;;;;;;;:30;44641:10;44622:30;;;;;;;;;;;:44;;;;44772:10;44739:17;:30;44757:11;44739:30;;;;;;;;;;;:43;;;;44500:328;;44924:17;:26;44942:7;44924:26;;;;;;;;;;;44917:33;;;44968:12;:18;44981:4;44968:18;;;;;;;;;;;;;;;:34;44987:14;44968:34;;;;;;;;;;;44961:41;;;44022:988;;;;:::o;45305:1079::-;45558:22;45603:1;45583:10;:17;;;;:21;;;;:::i;:::-;45558:46;;45615:18;45636:15;:24;45652:7;45636:24;;;;;;;;;;;;45615:45;;45987:19;46009:10;46020:14;46009:26;;;;;;;;;;;;;;;;;;;;;;;;45987:48;;46073:11;46048:10;46059;46048:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46184:10;46153:15;:28;46169:11;46153:28;;;;;;;;;;;:41;;;;46325:15;:24;46341:7;46325:24;;;;;;;;;;;46318:31;;;46360:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45305:1079;;;;:::o;42809:221::-;42894:14;42911:20;42928:2;42911:16;:20::i;:::-;42894:37;;42969:7;42942:12;:16;42955:2;42942:16;;;;;;;;;;;;;;;:24;42959:6;42942:24;;;;;;;;;;;:34;;;;43016:6;42987:17;:26;43005:7;42987:26;;;;;;;;;;;:35;;;;42809:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:352::-;;;2236:3;2229:4;2221:6;2217:17;2213:27;2203:2;;2254:1;2251;2244:12;2203:2;2290:6;2277:20;2267:30;;2320:18;2312:6;2309:30;2306:2;;;2352:1;2349;2342:12;2306:2;2389:4;2381:6;2377:17;2365:29;;2443:3;2435:4;2427:6;2423:17;2413:8;2409:32;2406:41;2403:2;;;2460:1;2457;2450:12;2403:2;2193:277;;;;;:::o;2490:273::-;;2595:3;2588:4;2580:6;2576:17;2572:27;2562:2;;2613:1;2610;2603:12;2562:2;2653:6;2640:20;2678:79;2753:3;2745:6;2738:4;2730:6;2726:17;2678:79;:::i;:::-;2669:88;;2552:211;;;;;:::o;2769:139::-;;2853:6;2840:20;2831:29;;2869:33;2896:5;2869:33;:::i;:::-;2821:87;;;;:::o;2914:143::-;;3002:6;2996:13;2987:22;;3018:33;3045:5;3018:33;:::i;:::-;2977:80;;;;:::o;3063:137::-;;3146:6;3133:20;3124:29;;3162:32;3188:5;3162:32;:::i;:::-;3114:86;;;;:::o;3206:262::-;;3314:2;3302:9;3293:7;3289:23;3285:32;3282:2;;;3330:1;3327;3320:12;3282:2;3373:1;3398:53;3443:7;3434:6;3423:9;3419:22;3398:53;:::i;:::-;3388:63;;3344:117;3272:196;;;;:::o;3474:407::-;;;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3615:1;3612;3605:12;3567:2;3658:1;3683:53;3728:7;3719:6;3708:9;3704:22;3683:53;:::i;:::-;3673:63;;3629:117;3785:2;3811:53;3856:7;3847:6;3836:9;3832:22;3811:53;:::i;:::-;3801:63;;3756:118;3557:324;;;;;:::o;3887:552::-;;;;4029:2;4017:9;4008:7;4004:23;4000:32;3997:2;;;4045:1;4042;4035:12;3997:2;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;4215:2;4241:53;4286:7;4277:6;4266:9;4262:22;4241:53;:::i;:::-;4231:63;;4186:118;4343:2;4369:53;4414:7;4405:6;4394:9;4390:22;4369:53;:::i;:::-;4359:63;;4314:118;3987:452;;;;;:::o;4445:809::-;;;;;4613:3;4601:9;4592:7;4588:23;4584:33;4581:2;;;4630:1;4627;4620:12;4581:2;4673:1;4698:53;4743:7;4734:6;4723:9;4719:22;4698:53;:::i;:::-;4688:63;;4644:117;4800:2;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4771:118;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;5084:2;5073:9;5069:18;5056:32;5115:18;5107:6;5104:30;5101:2;;;5147:1;5144;5137:12;5101:2;5175:62;5229:7;5220:6;5209:9;5205:22;5175:62;:::i;:::-;5165:72;;5027:220;4571:683;;;;;;;:::o;5260:401::-;;;5382:2;5370:9;5361:7;5357:23;5353:32;5350:2;;;5398:1;5395;5388:12;5350:2;5441:1;5466:53;5511:7;5502:6;5491:9;5487:22;5466:53;:::i;:::-;5456:63;;5412:117;5568:2;5594:50;5636:7;5627:6;5616:9;5612:22;5594:50;:::i;:::-;5584:60;;5539:115;5340:321;;;;;:::o;5667:407::-;;;5792:2;5780:9;5771:7;5767:23;5763:32;5760:2;;;5808:1;5805;5798:12;5760:2;5851:1;5876:53;5921:7;5912:6;5901:9;5897:22;5876:53;:::i;:::-;5866:63;;5822:117;5978:2;6004:53;6049:7;6040:6;6029:9;6025:22;6004:53;:::i;:::-;5994:63;;5949:118;5750:324;;;;;:::o;6080:425::-;;;6223:2;6211:9;6202:7;6198:23;6194:32;6191:2;;;6239:1;6236;6229:12;6191:2;6310:1;6299:9;6295:17;6282:31;6340:18;6332:6;6329:30;6326:2;;;6372:1;6369;6362:12;6326:2;6408:80;6480:7;6471:6;6460:9;6456:22;6408:80;:::i;:::-;6390:98;;;;6253:245;6181:324;;;;;:::o;6511:262::-;;6619:2;6607:9;6598:7;6594:23;6590:32;6587:2;;;6635:1;6632;6625:12;6587:2;6678:1;6703:53;6748:7;6739:6;6728:9;6724:22;6703:53;:::i;:::-;6693:63;;6649:117;6577:196;;;;:::o;6779:260::-;;6886:2;6874:9;6865:7;6861:23;6857:32;6854:2;;;6902:1;6899;6892:12;6854:2;6945:1;6970:52;7014:7;7005:6;6994:9;6990:22;6970:52;:::i;:::-;6960:62;;6916:116;6844:195;;;;:::o;7045:282::-;;7163:2;7151:9;7142:7;7138:23;7134:32;7131:2;;;7179:1;7176;7169:12;7131:2;7222:1;7247:63;7302:7;7293:6;7282:9;7278:22;7247:63;:::i;:::-;7237:73;;7193:127;7121:206;;;;:::o;7333:395::-;;;7461:2;7449:9;7440:7;7436:23;7432:32;7429:2;;;7477:1;7474;7467:12;7429:2;7548:1;7537:9;7533:17;7520:31;7578:18;7570:6;7567:30;7564:2;;;7610:1;7607;7600:12;7564:2;7646:65;7703:7;7694:6;7683:9;7679:22;7646:65;:::i;:::-;7628:83;;;;7491:230;7419:309;;;;;:::o;7734:375::-;;7852:2;7840:9;7831:7;7827:23;7823:32;7820:2;;;7868:1;7865;7858:12;7820:2;7939:1;7928:9;7924:17;7911:31;7969:18;7961:6;7958:30;7955:2;;;8001:1;7998;7991:12;7955:2;8029:63;8084:7;8075:6;8064:9;8060:22;8029:63;:::i;:::-;8019:73;;7882:220;7810:299;;;;:::o;8115:262::-;;8223:2;8211:9;8202:7;8198:23;8194:32;8191:2;;;8239:1;8236;8229:12;8191:2;8282:1;8307:53;8352:7;8343:6;8332:9;8328:22;8307:53;:::i;:::-;8297:63;;8253:117;8181:196;;;;:::o;8383:284::-;;8502:2;8490:9;8481:7;8477:23;8473:32;8470:2;;;8518:1;8515;8508:12;8470:2;8561:1;8586:64;8642:7;8633:6;8622:9;8618:22;8586:64;:::i;:::-;8576:74;;8532:128;8460:207;;;;:::o;8673:692::-;;;;;8829:3;8817:9;8808:7;8804:23;8800:33;8797:2;;;8846:1;8843;8836:12;8797:2;8889:1;8914:53;8959:7;8950:6;8939:9;8935:22;8914:53;:::i;:::-;8904:63;;8860:117;9016:2;9042:52;9086:7;9077:6;9066:9;9062:22;9042:52;:::i;:::-;9032:62;;8987:117;9143:2;9169:52;9213:7;9204:6;9193:9;9189:22;9169:52;:::i;:::-;9159:62;;9114:117;9270:2;9296:52;9340:7;9331:6;9320:9;9316:22;9296:52;:::i;:::-;9286:62;;9241:117;8787:578;;;;;;;:::o;9371:118::-;9458:24;9476:5;9458:24;:::i;:::-;9453:3;9446:37;9436:53;;:::o;9495:157::-;9600:45;9620:24;9638:5;9620:24;:::i;:::-;9600:45;:::i;:::-;9595:3;9588:58;9578:74;;:::o;9658:109::-;9739:21;9754:5;9739:21;:::i;:::-;9734:3;9727:34;9717:50;;:::o;9773:157::-;9878:45;9898:24;9916:5;9898:24;:::i;:::-;9878:45;:::i;:::-;9873:3;9866:58;9856:74;;:::o;9936:360::-;;10050:38;10082:5;10050:38;:::i;:::-;10104:70;10167:6;10162:3;10104:70;:::i;:::-;10097:77;;10183:52;10228:6;10223:3;10216:4;10209:5;10205:16;10183:52;:::i;:::-;10260:29;10282:6;10260:29;:::i;:::-;10255:3;10251:39;10244:46;;10026:270;;;;;:::o;10302:364::-;;10418:39;10451:5;10418:39;:::i;:::-;10473:71;10537:6;10532:3;10473:71;:::i;:::-;10466:78;;10553:52;10598:6;10593:3;10586:4;10579:5;10575:16;10553:52;:::i;:::-;10630:29;10652:6;10630:29;:::i;:::-;10625:3;10621:39;10614:46;;10394:272;;;;;:::o;10672:377::-;;10806:39;10839:5;10806:39;:::i;:::-;10861:89;10943:6;10938:3;10861:89;:::i;:::-;10854:96;;10959:52;11004:6;10999:3;10992:4;10985:5;10981:16;10959:52;:::i;:::-;11036:6;11031:3;11027:16;11020:23;;10782:267;;;;;:::o;11055:316::-;;11218:67;11282:2;11277:3;11218:67;:::i;:::-;11211:74;;11315:20;11311:1;11306:3;11302:11;11295:41;11362:2;11357:3;11353:12;11346:19;;11201:170;;;:::o;11377:367::-;;11540:67;11604:2;11599:3;11540:67;:::i;:::-;11533:74;;11637:34;11633:1;11628:3;11624:11;11617:55;11703:5;11698:2;11693:3;11689:12;11682:27;11735:2;11730:3;11726:12;11719:19;;11523:221;;;:::o;11750:375::-;;11913:67;11977:2;11972:3;11913:67;:::i;:::-;11906:74;;12010:34;12006:1;12001:3;11997:11;11990:55;12076:13;12071:2;12066:3;12062:12;12055:35;12116:2;12111:3;12107:12;12100:19;;11896:229;;;:::o;12131:382::-;;12294:67;12358:2;12353:3;12294:67;:::i;:::-;12287:74;;12391:34;12387:1;12382:3;12378:11;12371:55;12457:20;12452:2;12447:3;12443:12;12436:42;12504:2;12499:3;12495:12;12488:19;;12277:236;;;:::o;12519:370::-;;12682:67;12746:2;12741:3;12682:67;:::i;:::-;12675:74;;12779:34;12775:1;12770:3;12766:11;12759:55;12845:8;12840:2;12835:3;12831:12;12824:30;12880:2;12875:3;12871:12;12864:19;;12665:224;;;:::o;12895:326::-;;13058:67;13122:2;13117:3;13058:67;:::i;:::-;13051:74;;13155:30;13151:1;13146:3;13142:11;13135:51;13212:2;13207:3;13203:12;13196:19;;13041:180;;;:::o;13227:313::-;;13390:67;13454:2;13449:3;13390:67;:::i;:::-;13383:74;;13487:17;13483:1;13478:3;13474:11;13467:38;13531:2;13526:3;13522:12;13515:19;;13373:167;;;:::o;13546:308::-;;13709:67;13773:2;13768:3;13709:67;:::i;:::-;13702:74;;13806:12;13802:1;13797:3;13793:11;13786:33;13845:2;13840:3;13836:12;13829:19;;13692:162;;;:::o;13860:368::-;;14023:67;14087:2;14082:3;14023:67;:::i;:::-;14016:74;;14120:34;14116:1;14111:3;14107:11;14100:55;14186:6;14181:2;14176:3;14172:12;14165:28;14219:2;14214:3;14210:12;14203:19;;14006:222;;;:::o;14234:323::-;;14397:67;14461:2;14456:3;14397:67;:::i;:::-;14390:74;;14494:27;14490:1;14485:3;14481:11;14474:48;14548:2;14543:3;14539:12;14532:19;;14380:177;;;:::o;14563:326::-;;14726:67;14790:2;14785:3;14726:67;:::i;:::-;14719:74;;14823:30;14819:1;14814:3;14810:11;14803:51;14880:2;14875:3;14871:12;14864:19;;14709:180;;;:::o;14895:390::-;;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15155:34;15151:1;15146:3;15142:11;15135:55;15221:28;15216:2;15211:3;15207:12;15200:50;15276:2;15271:3;15267:12;15260:19;;15041:244;;;:::o;15291:327::-;;15454:67;15518:2;15513:3;15454:67;:::i;:::-;15447:74;;15551:31;15547:1;15542:3;15538:11;15531:52;15609:2;15604:3;15600:12;15593:19;;15437:181;;;:::o;15624:376::-;;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15884:34;15880:1;15875:3;15871:11;15864:55;15950:14;15945:2;15940:3;15936:12;15929:36;15991:2;15986:3;15982:12;15975:19;;15770:230;;;:::o;16006:305::-;;16169:66;16233:1;16228:3;16169:66;:::i;:::-;16162:73;;16265:10;16261:1;16256:3;16252:11;16245:31;16302:2;16297:3;16293:12;16286:19;;16152:159;;;:::o;16317:388::-;;16480:67;16544:2;16539:3;16480:67;:::i;:::-;16473:74;;16577:34;16573:1;16568:3;16564:11;16557:55;16643:26;16638:2;16633:3;16629:12;16622:48;16696:2;16691:3;16687:12;16680:19;;16463:242;;;:::o;16711:374::-;;16874:67;16938:2;16933:3;16874:67;:::i;:::-;16867:74;;16971:34;16967:1;16962:3;16958:11;16951:55;17037:12;17032:2;17027:3;17023:12;17016:34;17076:2;17071:3;17067:12;17060:19;;16857:228;;;:::o;17091:373::-;;17254:67;17318:2;17313:3;17254:67;:::i;:::-;17247:74;;17351:34;17347:1;17342:3;17338:11;17331:55;17417:11;17412:2;17407:3;17403:12;17396:33;17455:2;17450:3;17446:12;17439:19;;17237:227;;;:::o;17470:326::-;;17633:67;17697:2;17692:3;17633:67;:::i;:::-;17626:74;;17730:30;17726:1;17721:3;17717:11;17710:51;17787:2;17782:3;17778:12;17771:19;;17616:180;;;:::o;17802:330::-;;17965:67;18029:2;18024:3;17965:67;:::i;:::-;17958:74;;18062:34;18058:1;18053:3;18049:11;18042:55;18123:2;18118:3;18114:12;18107:19;;17948:184;;;:::o;18138:376::-;;18301:67;18365:2;18360:3;18301:67;:::i;:::-;18294:74;;18398:34;18394:1;18389:3;18385:11;18378:55;18464:14;18459:2;18454:3;18450:12;18443:36;18505:2;18500:3;18496:12;18489:19;;18284:230;;;:::o;18520:330::-;;18683:67;18747:2;18742:3;18683:67;:::i;:::-;18676:74;;18780:34;18776:1;18771:3;18767:11;18760:55;18841:2;18836:3;18832:12;18825:19;;18666:184;;;:::o;18856:316::-;;19019:67;19083:2;19078:3;19019:67;:::i;:::-;19012:74;;19116:20;19112:1;19107:3;19103:11;19096:41;19163:2;19158:3;19154:12;19147:19;;19002:170;;;:::o;19178:373::-;;19341:67;19405:2;19400:3;19341:67;:::i;:::-;19334:74;;19438:34;19434:1;19429:3;19425:11;19418:55;19504:11;19499:2;19494:3;19490:12;19483:33;19542:2;19537:3;19533:12;19526:19;;19324:227;;;:::o;19557:317::-;;19720:67;19784:2;19779:3;19720:67;:::i;:::-;19713:74;;19817:21;19813:1;19808:3;19804:11;19797:42;19865:2;19860:3;19856:12;19849:19;;19703:171;;;:::o;19880:311::-;;20043:67;20107:2;20102:3;20043:67;:::i;:::-;20036:74;;20140:15;20136:1;20131:3;20127:11;20120:36;20182:2;20177:3;20173:12;20166:19;;20026:165;;;:::o;20197:365::-;;20360:67;20424:2;20419:3;20360:67;:::i;:::-;20353:74;;20457:34;20453:1;20448:3;20444:11;20437:55;20523:3;20518:2;20513:3;20509:12;20502:25;20553:2;20548:3;20544:12;20537:19;;20343:219;;;:::o;20568:297::-;;20748:83;20829:1;20824:3;20748:83;:::i;:::-;20741:90;;20857:1;20852:3;20848:11;20841:18;;20731:134;;;:::o;20871:381::-;;21034:67;21098:2;21093:3;21034:67;:::i;:::-;21027:74;;21131:34;21127:1;21122:3;21118:11;21111:55;21197:19;21192:2;21187:3;21183:12;21176:41;21243:2;21238:3;21234:12;21227:19;;21017:235;;;:::o;21258:311::-;;21421:67;21485:2;21480:3;21421:67;:::i;:::-;21414:74;;21518:15;21514:1;21509:3;21505:11;21498:36;21560:2;21555:3;21551:12;21544:19;;21404:165;;;:::o;21575:376::-;;21738:67;21802:2;21797:3;21738:67;:::i;:::-;21731:74;;21835:34;21831:1;21826:3;21822:11;21815:55;21901:14;21896:2;21891:3;21887:12;21880:36;21942:2;21937:3;21933:12;21926:19;;21721:230;;;:::o;21957:333::-;;22138:84;22220:1;22215:3;22138:84;:::i;:::-;22131:91;;22252:3;22248:1;22243:3;22239:11;22232:24;22282:1;22277:3;22273:11;22266:18;;22121:169;;;:::o;22296:118::-;22383:24;22401:5;22383:24;:::i;:::-;22378:3;22371:37;22361:53;;:::o;22420:256::-;;22547:75;22618:3;22609:6;22547:75;:::i;:::-;22647:2;22642:3;22638:12;22631:19;;22667:3;22660:10;;22536:140;;;;:::o;22682:397::-;;22837:75;22908:3;22899:6;22837:75;:::i;:::-;22937:2;22932:3;22928:12;22921:19;;22950:75;23021:3;23012:6;22950:75;:::i;:::-;23050:2;23045:3;23041:12;23034:19;;23070:3;23063:10;;22826:253;;;;;:::o;23085:701::-;;23388:95;23479:3;23470:6;23388:95;:::i;:::-;23381:102;;23500:148;23644:3;23500:148;:::i;:::-;23493:155;;23665:95;23756:3;23747:6;23665:95;:::i;:::-;23658:102;;23777:3;23770:10;;23370:416;;;;;:::o;23792:379::-;;23998:147;24141:3;23998:147;:::i;:::-;23991:154;;24162:3;24155:10;;23980:191;;;:::o;24177:222::-;;24308:2;24297:9;24293:18;24285:26;;24321:71;24389:1;24378:9;24374:17;24365:6;24321:71;:::i;:::-;24275:124;;;;:::o;24405:640::-;;24638:3;24627:9;24623:19;24615:27;;24652:71;24720:1;24709:9;24705:17;24696:6;24652:71;:::i;:::-;24733:72;24801:2;24790:9;24786:18;24777:6;24733:72;:::i;:::-;24815;24883:2;24872:9;24868:18;24859:6;24815:72;:::i;:::-;24934:9;24928:4;24924:20;24919:2;24908:9;24904:18;24897:48;24962:76;25033:4;25024:6;24962:76;:::i;:::-;24954:84;;24605:440;;;;;;;:::o;25051:210::-;;25176:2;25165:9;25161:18;25153:26;;25189:65;25251:1;25240:9;25236:17;25227:6;25189:65;:::i;:::-;25143:118;;;;:::o;25267:313::-;;25418:2;25407:9;25403:18;25395:26;;25467:9;25461:4;25457:20;25453:1;25442:9;25438:17;25431:47;25495:78;25568:4;25559:6;25495:78;:::i;:::-;25487:86;;25385:195;;;;:::o;25586:419::-;;25790:2;25779:9;25775:18;25767:26;;25839:9;25833:4;25829:20;25825:1;25814:9;25810:17;25803:47;25867:131;25993:4;25867:131;:::i;:::-;25859:139;;25757:248;;;:::o;26011:419::-;;26215:2;26204:9;26200:18;26192:26;;26264:9;26258:4;26254:20;26250:1;26239:9;26235:17;26228:47;26292:131;26418:4;26292:131;:::i;:::-;26284:139;;26182:248;;;:::o;26436:419::-;;26640:2;26629:9;26625:18;26617:26;;26689:9;26683:4;26679:20;26675:1;26664:9;26660:17;26653:47;26717:131;26843:4;26717:131;:::i;:::-;26709:139;;26607:248;;;:::o;26861:419::-;;27065:2;27054:9;27050:18;27042:26;;27114:9;27108:4;27104:20;27100:1;27089:9;27085:17;27078:47;27142:131;27268:4;27142:131;:::i;:::-;27134:139;;27032:248;;;:::o;27286:419::-;;27490:2;27479:9;27475:18;27467:26;;27539:9;27533:4;27529:20;27525:1;27514:9;27510:17;27503:47;27567:131;27693:4;27567:131;:::i;:::-;27559:139;;27457:248;;;:::o;27711:419::-;;27915:2;27904:9;27900:18;27892:26;;27964:9;27958:4;27954:20;27950:1;27939:9;27935:17;27928:47;27992:131;28118:4;27992:131;:::i;:::-;27984:139;;27882:248;;;:::o;28136:419::-;;28340:2;28329:9;28325:18;28317:26;;28389:9;28383:4;28379:20;28375:1;28364:9;28360:17;28353:47;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28307:248;;;:::o;28561:419::-;;28765:2;28754:9;28750:18;28742:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28842:131;28968:4;28842:131;:::i;:::-;28834:139;;28732:248;;;:::o;28986:419::-;;29190:2;29179:9;29175:18;29167:26;;29239:9;29233:4;29229:20;29225:1;29214:9;29210:17;29203:47;29267:131;29393:4;29267:131;:::i;:::-;29259:139;;29157:248;;;:::o;29411:419::-;;29615:2;29604:9;29600:18;29592:26;;29664:9;29658:4;29654:20;29650:1;29639:9;29635:17;29628:47;29692:131;29818:4;29692:131;:::i;:::-;29684:139;;29582:248;;;:::o;29836:419::-;;30040:2;30029:9;30025:18;30017:26;;30089:9;30083:4;30079:20;30075:1;30064:9;30060:17;30053:47;30117:131;30243:4;30117:131;:::i;:::-;30109:139;;30007:248;;;:::o;30261:419::-;;30465:2;30454:9;30450:18;30442:26;;30514:9;30508:4;30504:20;30500:1;30489:9;30485:17;30478:47;30542:131;30668:4;30542:131;:::i;:::-;30534:139;;30432:248;;;:::o;30686:419::-;;30890:2;30879:9;30875:18;30867:26;;30939:9;30933:4;30929:20;30925:1;30914:9;30910:17;30903:47;30967:131;31093:4;30967:131;:::i;:::-;30959:139;;30857:248;;;:::o;31111:419::-;;31315:2;31304:9;31300:18;31292:26;;31364:9;31358:4;31354:20;31350:1;31339:9;31335:17;31328:47;31392:131;31518:4;31392:131;:::i;:::-;31384:139;;31282:248;;;:::o;31536:419::-;;31740:2;31729:9;31725:18;31717:26;;31789:9;31783:4;31779:20;31775:1;31764:9;31760:17;31753:47;31817:131;31943:4;31817:131;:::i;:::-;31809:139;;31707:248;;;:::o;31961:419::-;;32165:2;32154:9;32150:18;32142:26;;32214:9;32208:4;32204:20;32200:1;32189:9;32185:17;32178:47;32242:131;32368:4;32242:131;:::i;:::-;32234:139;;32132:248;;;:::o;32386:419::-;;32590:2;32579:9;32575:18;32567:26;;32639:9;32633:4;32629:20;32625:1;32614:9;32610:17;32603:47;32667:131;32793:4;32667:131;:::i;:::-;32659:139;;32557:248;;;:::o;32811:419::-;;33015:2;33004:9;33000:18;32992:26;;33064:9;33058:4;33054:20;33050:1;33039:9;33035:17;33028:47;33092:131;33218:4;33092:131;:::i;:::-;33084:139;;32982:248;;;:::o;33236:419::-;;33440:2;33429:9;33425:18;33417:26;;33489:9;33483:4;33479:20;33475:1;33464:9;33460:17;33453:47;33517:131;33643:4;33517:131;:::i;:::-;33509:139;;33407:248;;;:::o;33661:419::-;;33865:2;33854:9;33850:18;33842:26;;33914:9;33908:4;33904:20;33900:1;33889:9;33885:17;33878:47;33942:131;34068:4;33942:131;:::i;:::-;33934:139;;33832:248;;;:::o;34086:419::-;;34290:2;34279:9;34275:18;34267:26;;34339:9;34333:4;34329:20;34325:1;34314:9;34310:17;34303:47;34367:131;34493:4;34367:131;:::i;:::-;34359:139;;34257:248;;;:::o;34511:419::-;;34715:2;34704:9;34700:18;34692:26;;34764:9;34758:4;34754:20;34750:1;34739:9;34735:17;34728:47;34792:131;34918:4;34792:131;:::i;:::-;34784:139;;34682:248;;;:::o;34936:419::-;;35140:2;35129:9;35125:18;35117:26;;35189:9;35183:4;35179:20;35175:1;35164:9;35160:17;35153:47;35217:131;35343:4;35217:131;:::i;:::-;35209:139;;35107:248;;;:::o;35361:419::-;;35565:2;35554:9;35550:18;35542:26;;35614:9;35608:4;35604:20;35600:1;35589:9;35585:17;35578:47;35642:131;35768:4;35642:131;:::i;:::-;35634:139;;35532:248;;;:::o;35786:419::-;;35990:2;35979:9;35975:18;35967:26;;36039:9;36033:4;36029:20;36025:1;36014:9;36010:17;36003:47;36067:131;36193:4;36067:131;:::i;:::-;36059:139;;35957:248;;;:::o;36211:419::-;;36415:2;36404:9;36400:18;36392:26;;36464:9;36458:4;36454:20;36450:1;36439:9;36435:17;36428:47;36492:131;36618:4;36492:131;:::i;:::-;36484:139;;36382:248;;;:::o;36636:419::-;;36840:2;36829:9;36825:18;36817:26;;36889:9;36883:4;36879:20;36875:1;36864:9;36860:17;36853:47;36917:131;37043:4;36917:131;:::i;:::-;36909:139;;36807:248;;;:::o;37061:419::-;;37265:2;37254:9;37250:18;37242:26;;37314:9;37308:4;37304:20;37300:1;37289:9;37285:17;37278:47;37342:131;37468:4;37342:131;:::i;:::-;37334:139;;37232:248;;;:::o;37486:419::-;;37690:2;37679:9;37675:18;37667:26;;37739:9;37733:4;37729:20;37725:1;37714:9;37710:17;37703:47;37767:131;37893:4;37767:131;:::i;:::-;37759:139;;37657:248;;;:::o;37911:419::-;;38115:2;38104:9;38100:18;38092:26;;38164:9;38158:4;38154:20;38150:1;38139:9;38135:17;38128:47;38192:131;38318:4;38192:131;:::i;:::-;38184:139;;38082:248;;;:::o;38336:222::-;;38467:2;38456:9;38452:18;38444:26;;38480:71;38548:1;38537:9;38533:17;38524:6;38480:71;:::i;:::-;38434:124;;;;:::o;38564:283::-;;38630:2;38624:9;38614:19;;38672:4;38664:6;38660:17;38779:6;38767:10;38764:22;38743:18;38731:10;38728:34;38725:62;38722:2;;;38790:18;;:::i;:::-;38722:2;38830:10;38826:2;38819:22;38604:243;;;;:::o;38853:331::-;;39004:18;38996:6;38993:30;38990:2;;;39026:18;;:::i;:::-;38990:2;39111:4;39107:9;39100:4;39092:6;39088:17;39084:33;39076:41;;39172:4;39166;39162:15;39154:23;;38919:265;;;:::o;39190:332::-;;39342:18;39334:6;39331:30;39328:2;;;39364:18;;:::i;:::-;39328:2;39449:4;39445:9;39438:4;39430:6;39426:17;39422:33;39414:41;;39510:4;39504;39500:15;39492:23;;39257:265;;;:::o;39528:98::-;;39613:5;39607:12;39597:22;;39586:40;;;:::o;39632:99::-;;39718:5;39712:12;39702:22;;39691:40;;;:::o;39737:168::-;;39854:6;39849:3;39842:19;39894:4;39889:3;39885:14;39870:29;;39832:73;;;;:::o;39911:147::-;;40049:3;40034:18;;40024:34;;;;:::o;40064:169::-;;40182:6;40177:3;40170:19;40222:4;40217:3;40213:14;40198:29;;40160:73;;;;:::o;40239:148::-;;40378:3;40363:18;;40353:34;;;;:::o;40393:305::-;;40452:20;40470:1;40452:20;:::i;:::-;40447:25;;40486:20;40504:1;40486:20;:::i;:::-;40481:25;;40640:1;40572:66;40568:74;40565:1;40562:81;40559:2;;;40646:18;;:::i;:::-;40559:2;40690:1;40687;40683:9;40676:16;;40437:261;;;;:::o;40704:185::-;;40761:20;40779:1;40761:20;:::i;:::-;40756:25;;40795:20;40813:1;40795:20;:::i;:::-;40790:25;;40834:1;40824:2;;40839:18;;:::i;:::-;40824:2;40881:1;40878;40874:9;40869:14;;40746:143;;;;:::o;40895:297::-;;40957:19;40974:1;40957:19;:::i;:::-;40952:24;;40990:19;41007:1;40990:19;:::i;:::-;40985:24;;41129:1;41109:18;41105:26;41102:1;41099:33;41094:1;41087:9;41080:17;41076:57;41073:2;;;41136:18;;:::i;:::-;41073:2;41184:1;41181;41177:9;41166:20;;40942:250;;;;:::o;41198:191::-;;41258:20;41276:1;41258:20;:::i;:::-;41253:25;;41292:20;41310:1;41292:20;:::i;:::-;41287:25;;41331:1;41328;41325:8;41322:2;;;41336:18;;:::i;:::-;41322:2;41381:1;41378;41374:9;41366:17;;41243:146;;;;:::o;41395:96::-;;41461:24;41479:5;41461:24;:::i;:::-;41450:35;;41440:51;;;:::o;41497:90::-;;41574:5;41567:13;41560:21;41549:32;;41539:48;;;:::o;41593:77::-;;41659:5;41648:16;;41638:32;;;:::o;41676:149::-;;41752:66;41745:5;41741:78;41730:89;;41720:105;;;:::o;41831:126::-;;41908:42;41901:5;41897:54;41886:65;;41876:81;;;:::o;41963:77::-;;42029:5;42018:16;;42008:32;;;:::o;42046:101::-;;42122:18;42115:5;42111:30;42100:41;;42090:57;;;:::o;42153:154::-;42237:6;42232:3;42227;42214:30;42299:1;42290:6;42285:3;42281:16;42274:27;42204:103;;;:::o;42313:307::-;42381:1;42391:113;42405:6;42402:1;42399:13;42391:113;;;42490:1;42485:3;42481:11;42475:18;42471:1;42466:3;42462:11;42455:39;42427:2;42424:1;42420:10;42415:15;;42391:113;;;42522:6;42519:1;42516:13;42513:2;;;42602:1;42593:6;42588:3;42584:16;42577:27;42513:2;42362:258;;;;:::o;42626:171::-;;42688:24;42706:5;42688:24;:::i;:::-;42679:33;;42734:4;42727:5;42724:15;42721:2;;;42742:18;;:::i;:::-;42721:2;42789:1;42782:5;42778:13;42771:20;;42669:128;;;:::o;42803:320::-;;42884:1;42878:4;42874:12;42864:22;;42931:1;42925:4;42921:12;42952:18;42942:2;;43008:4;43000:6;42996:17;42986:27;;42942:2;43070;43062:6;43059:14;43039:18;43036:38;43033:2;;;43089:18;;:::i;:::-;43033:2;42854:269;;;;:::o;43129:233::-;;43191:24;43209:5;43191:24;:::i;:::-;43182:33;;43237:66;43230:5;43227:77;43224:2;;;43307:18;;:::i;:::-;43224:2;43354:1;43347:5;43343:13;43336:20;;43172:190;;;:::o;43368:100::-;;43436:26;43456:5;43436:26;:::i;:::-;43425:37;;43415:53;;;:::o;43474:79::-;;43542:5;43531:16;;43521:32;;;:::o;43559:94::-;;43627:20;43641:5;43627:20;:::i;:::-;43616:31;;43606:47;;;:::o;43659:176::-;;43708:20;43726:1;43708:20;:::i;:::-;43703:25;;43742:20;43760:1;43742:20;:::i;:::-;43737:25;;43781:1;43771:2;;43786:18;;:::i;:::-;43771:2;43827:1;43824;43820:9;43815:14;;43693:142;;;;:::o;43841:180::-;43889:77;43886:1;43879:88;43986:4;43983:1;43976:15;44010:4;44007:1;44000:15;44027:180;44075:77;44072:1;44065:88;44172:4;44169:1;44162:15;44196:4;44193:1;44186:15;44213:180;44261:77;44258:1;44251:88;44358:4;44355:1;44348:15;44382:4;44379:1;44372:15;44399:180;44447:77;44444:1;44437:88;44544:4;44541:1;44534:15;44568:4;44565:1;44558:15;44585:102;;44677:2;44673:7;44668:2;44661:5;44657:14;44653:28;44643:38;;44633:54;;;:::o;44693:94::-;;44774:5;44770:2;44766:14;44745:35;;44735:52;;;:::o;44793:122::-;44866:24;44884:5;44866:24;:::i;:::-;44859:5;44856:35;44846:2;;44905:1;44902;44895:12;44846:2;44836:79;:::o;44921:116::-;44991:21;45006:5;44991:21;:::i;:::-;44984:5;44981:32;44971:2;;45027:1;45024;45017:12;44971:2;44961:76;:::o;45043:122::-;45116:24;45134:5;45116:24;:::i;:::-;45109:5;45106:35;45096:2;;45155:1;45152;45145:12;45096:2;45086:79;:::o;45171:120::-;45243:23;45260:5;45243:23;:::i;:::-;45236:5;45233:34;45223:2;;45281:1;45278;45271:12;45223:2;45213:78;:::o;45297:122::-;45370:24;45388:5;45370:24;:::i;:::-;45363:5;45360:35;45350:2;;45409:1;45406;45399:12;45350:2;45340:79;:::o;45425:120::-;45497:23;45514:5;45497:23;:::i;:::-;45490:5;45487:34;45477:2;;45535:1;45532;45525:12;45477:2;45467:78;:::o
Swarm Source
ipfs://4780ef46b8211df120be039160cc3dc2d8d0e99292e3c3407ad11edf55f747f6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.