Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,647 CICADAS
Holders
574
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CICADASLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CicadasNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-13 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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); } 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; } 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); } 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); } 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); } 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); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } 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); } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } 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); } } 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 {} } 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(); } } contract ERC721CappedSale is ERC721Enumerable, Ownable, ReentrancyGuard { uint256 public _cap; uint256 public _maxBuyAmount; uint256 public _pricePerToken; // in wei address payable public _wallet; bool private _isSalePaused = false; constructor( string memory name_, string memory symbol_, uint256 initCap, uint256 initMaxBuyAmount, uint256 initPricePerToken, address payable initWallet ) ERC721( name_, symbol_ ) { _cap = initCap; _maxBuyAmount = initMaxBuyAmount; _pricePerToken = initPricePerToken; _wallet = initWallet; _isSalePaused = true; } function mint(uint256 mintAmount) public payable nonReentrant { require(!isSalePaused(), "ERC721CappedSale: sale is paused"); require(mintAmount > 0, "ERC721CappedSale: buy at least 1 NFT"); require(mintAmount <= _maxBuyAmount, "ERC721CappedSale: its not allowed to buy this much"); require(mintAmount <= nftsAvailable(), "ERC721CappedSale: not enough NFTs available"); require((_pricePerToken * mintAmount) == msg.value, "ERC721CappedSale: exact value in ETH needed"); for (uint256 i = 0; i < mintAmount; i++) { _mintToken(_msgSender()); } payable(_wallet).transfer(msg.value); } function nftsAvailable() public view returns(uint256) { return _cap - totalSupply(); } function cap() public view returns(uint256) { return _cap; } function isSalePaused() public view returns(bool) { return _isSalePaused; } function pauseSale() external onlyOwner { _isSalePaused = true; } function resumeSale() external onlyOwner { _isSalePaused = false; } /** * should not be necccesarry as the payed ETH are forwarded on minting **/ function emergencyWithdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** * admin can mint for giveaways, airdrops etc **/ function adminMint(uint256 mintAmount) public onlyOwner { require(mintAmount > 0, "ERC721CappedSale: buy at least 1 NFT"); require(mintAmount <= nftsAvailable(), "ERC721CappedSale: not enough NFTs available"); for (uint256 i = 0; i < mintAmount; i++) { _mintToken(_msgSender()); } } function _mintToken(address destinationAddress) internal { uint256 newTokenID = totalSupply(); require(!_exists(newTokenID), "ERC721CappedSale: Token already exist."); _safeMint(destinationAddress, newTokenID); } } contract CicadasNFT is ERC721CappedSale { using Strings for uint256; string private constant INIT__NFT_NAME = 'Cicadas'; string private constant INIT__NFT_SYMBOL = 'CICADAS'; string private constant INIT__UNREVEAL_URI = 'ipfs://QmYm4WThc5yCApjFTw8bCv5uCSfikheyKko6khSpAxPHPQ'; uint256 private constant INIT__CAP = 10000; uint256 private constant INIT__MAX_BUY_AMOUNT = 20; uint256 private constant INIT__PRICE_PER_TOKEN = 10**17; // update that later address payable private constant INIT__WALLET = payable(0x10E7644e76Dad3684c65946afA762f1d2ff098cD); IERC721 private constant INIT_EA_NFT = IERC721(0xD1CDf1B4784fa299fECef87096E167a48c8BA042); IERC721 public _earlyAdopterNFT; uint256 public _earlyAdopterTime; bool public _isRevealed = false; string public _revealedTokenURI; uint256 public _idShift = 0; bool public _idShiftDone = false; bool public _eaSaleIsDone = false; // Mapping from early adopter token ids to early minted nfts mapping(uint256 => uint256) private _earlyAdoptersMinted; string private _tokenBaseURI = 'ipfs://QmRdCWCYG2NyhKDLoHrLqLvBUUy4MrNeCM8br4UhxzSLsK/'; constructor( ) ERC721CappedSale( INIT__NFT_NAME, INIT__NFT_SYMBOL, INIT__CAP, INIT__MAX_BUY_AMOUNT, INIT__PRICE_PER_TOKEN, payable(msg.sender) // update that later ) { _earlyAdopterNFT = INIT_EA_NFT; } /** * @dev override ERC721 **/ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if(!_isRevealed) { return INIT__UNREVEAL_URI; } string memory baseURI = _baseURI(); uint256 shiftedTokenId = (tokenId+_idShift) % INIT__CAP; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, shiftedTokenId.toString(), string('.json'))) : ""; } /** * @dev based on ERC721CappedSale mint function **/ function earlyAdopterMint(uint256 mintAmount, uint256 earlyAdopterTokenId) public payable nonReentrant { require(!_eaSaleIsDone, "EarlyAdopter: early adopter sale is done"); // @dev changed this line require(!isSalePaused(), "ERC721CappedSale: sale is paused"); require(mintAmount > 0, "ERC721CappedSale: buy at least 1 NFT"); require(mintAmount <= _maxBuyAmount, "ERC721CappedSale: its not allowed to buy this much"); require(mintAmount <= nftsAvailable(), "ERC721CappedSale: not enough NFTs available"); require((_pricePerToken * mintAmount) == msg.value, "ERC721CappedSale: exact value in ETH needed"); // @dev added this require(isOwnerOfTokenId(earlyAdopterTokenId), "EarlyAdopter: You dont own this token"); require(getEarlyAdopterMaxAmount(earlyAdopterTokenId) >= mintAmount, "EarlyAdopter: You cant mint this much"); reduceEarlyAdopterMaxAmount(earlyAdopterTokenId, mintAmount); for (uint256 i = 0; i < mintAmount; i++) { _mintToken(_msgSender()); } payable(_wallet).transfer(msg.value); } function getEarlyAdopterMaxAmount(uint256 earlyAdopterTokenId) public view returns(uint256) { return INIT__MAX_BUY_AMOUNT - _earlyAdoptersMinted[earlyAdopterTokenId]; } function reduceEarlyAdopterMaxAmount(uint256 earlyAdopterTokenId, uint256 mintAmount) internal { _earlyAdoptersMinted[earlyAdopterTokenId] = _earlyAdoptersMinted[earlyAdopterTokenId] + mintAmount; } function isOwnerOfTokenId(uint256 earlyAdopterTokenId) public view returns(bool) { return _msgSender() == _earlyAdopterNFT.ownerOf(earlyAdopterTokenId); } /** * @dev ERC721 override */ function _baseURI() internal view override returns (string memory) { return _tokenBaseURI; } function setTokenBaseURI(string memory newBaseURI) public onlyOwner { _tokenBaseURI = newBaseURI; } function switchEaToRegularSale() public onlyOwner { _eaSaleIsDone = true; } function reveal() public onlyOwner { _isRevealed = true; } function shiftIds() public onlyOwner { require(!_idShiftDone, "ID shift is done"); _idShiftDone = true; _idShift = block.timestamp % INIT__CAP; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":[],"name":"_cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_eaSaleIsDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_earlyAdopterNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_earlyAdopterTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_idShift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_idShiftDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revealedTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"uint256","name":"earlyAdopterTokenId","type":"uint256"}],"name":"earlyAdopterMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"earlyAdopterTokenId","type":"uint256"}],"name":"getEarlyAdopterMaxAmount","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":"uint256","name":"earlyAdopterTokenId","type":"uint256"}],"name":"isOwnerOfTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftsAvailable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","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":"string","name":"newBaseURI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shiftIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchEaToRegularSale","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
60806040526000600f60146101000a81548160ff0219169083151502179055506000601260006101000a81548160ff02191690831515021790555060006014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff021916908315150217905550604051806060016040528060368152602001620055e96036913960179080519060200190620000a69291906200032e565b50348015620000b457600080fd5b506040518060400160405280600781526020017f43696361646173000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4349434144415300000000000000000000000000000000000000000000000000815250612710601467016345785d8a000033858581600090805190602001906200014a9291906200032e565b508060019080519060200190620001639291906200032e565b505050620001866200017a6200026060201b60201c565b6200026860201b60201c565b6001600b8190555083600c8190555082600d8190555081600e8190555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f60146101000a81548160ff02191690831515021790555050505050505073d1cdf1b4784fa299fecef87096e167a48c8ba042601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000443565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033c90620003de565b90600052602060002090601f016020900481019282620003605760008555620003ac565b82601f106200037b57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ab5782518255916020019190600101906200038e565b5b509050620003bb9190620003bf565b5090565b5b80821115620003da576000816000905550600101620003c0565b5090565b60006002820490506001821680620003f757607f821691505b602082108114156200040e576200040d62000414565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61519680620004536000396000f3fe6080604052600436106102715760003560e01c80636eebccfc1161014f578063a4d3f13e116100c1578063db2e21bc1161007a578063db2e21bc14610901578063dbeb5e9214610918578063dfc4c2d414610943578063e0ba7c2a1461096e578063e985e9c514610999578063f2fde38b146109d657610271565b8063a4d3f13e146107f3578063b88d4fde1461080a578063c1f2612314610833578063c87b56dd1461085c578063ca2bbb6f14610899578063ce47a2a8146108c457610271565b806395d89b411161011357806395d89b411461072a5780639835c8e414610755578063a0712d681461076c578063a07c0e4514610788578063a22cb465146107b3578063a475b5dd146107dc57610271565b80636eebccfc1461065757806370a0823114610682578063715018a6146106bf5780638da5cb5b146106d65780638ef79e911461070157610271565b80632f745c59116101e85780634de37d11116101ac5780634de37d11146105545780634f6ccce71461057f57806355367ba9146105bc57806358a54fcd146105d3578063610757e4146105ef5780636352211e1461061a57610271565b80632f745c591461046f57806333e364cb146104ac578063355274ea146104c357806342842e0e146104ee57806342d1adae1461051757610271565b8063081812fc1161023a578063081812fc1461035f578063095ea7b31461039c57806318160ddd146103c55780631f9e4d49146103f057806323b872dd1461041b57806327bc4d0c1461044457610271565b80628ca8161461027657806301ffc9a7146102a15780630492f055146102de578063060cf4e81461030957806306fdde0314610334575b600080fd5b34801561028257600080fd5b5061028b6109ff565b604051610298919061405e565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c391906139ce565b610a16565b6040516102d5919061405e565b60405180910390f35b3480156102ea57600080fd5b506102f3610a90565b6040516103009190614456565b60405180910390f35b34801561031557600080fd5b5061031e610a96565b60405161032b9190614456565b60405180910390f35b34801561034057600080fd5b50610349610a9c565b6040516103569190614094565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190613a61565b610b2e565b6040516103939190613fdc565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190613992565b610bb3565b005b3480156103d157600080fd5b506103da610ccb565b6040516103e79190614456565b60405180910390f35b3480156103fc57600080fd5b50610405610cd8565b6040516104129190614456565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061388c565b610cde565b005b34801561045057600080fd5b50610459610d3e565b6040516104669190614094565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613992565b610dcc565b6040516104a39190614456565b60405180910390f35b3480156104b857600080fd5b506104c1610e71565b005b3480156104cf57600080fd5b506104d8610f0a565b6040516104e59190614456565b60405180910390f35b3480156104fa57600080fd5b506105156004803603810190610510919061388c565b610f14565b005b34801561052357600080fd5b5061053e60048036038101906105399190613a61565b610f34565b60405161054b9190614456565b60405180910390f35b34801561056057600080fd5b50610569610f5d565b6040516105769190614456565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a61565b610f63565b6040516105b39190614456565b60405180910390f35b3480156105c857600080fd5b506105d1610ffa565b005b6105ed60048036038101906105e89190613a8a565b611093565b005b3480156105fb57600080fd5b506106046113db565b6040516106119190613ff7565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613a61565b611401565b60405161064e9190613fdc565b60405180910390f35b34801561066357600080fd5b5061066c6114b3565b604051610679919061405e565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906137fe565b6114c6565b6040516106b69190614456565b60405180910390f35b3480156106cb57600080fd5b506106d461157e565b005b3480156106e257600080fd5b506106eb611606565b6040516106f89190613fdc565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190613a20565b611630565b005b34801561073657600080fd5b5061073f6116c6565b60405161074c9190614094565b60405180910390f35b34801561076157600080fd5b5061076a611758565b005b61078660048036038101906107819190613a61565b611855565b005b34801561079457600080fd5b5061079d611aaf565b6040516107aa9190614456565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613956565b611acb565b005b3480156107e857600080fd5b506107f1611c4c565b005b3480156107ff57600080fd5b50610808611ce5565b005b34801561081657600080fd5b50610831600480360381019061082c91906138db565b611d7e565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613a61565b611de0565b005b34801561086857600080fd5b50610883600480360381019061087e9190613a61565b611f1b565b6040516108909190614094565b60405180910390f35b3480156108a557600080fd5b506108ae61204e565b6040516108bb919061405e565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613a61565b612061565b6040516108f8919061405e565b60405180910390f35b34801561090d57600080fd5b5061091661214a565b005b34801561092457600080fd5b5061092d61220f565b60405161093a9190614456565b60405180910390f35b34801561094f57600080fd5b50610958612215565b6040516109659190614079565b60405180910390f35b34801561097a57600080fd5b5061098361223b565b604051610990919061405e565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb9190613850565b61224e565b6040516109cd919061405e565b60405180910390f35b3480156109e257600080fd5b506109fd60048036038101906109f891906137fe565b6122e2565b005b6000600f60149054906101000a900460ff16905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a895750610a88826123da565b5b9050919050565b600d5481565b600c5481565b606060008054610aab9061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad79061473c565b8015610b245780601f10610af957610100808354040283529160200191610b24565b820191906000526020600020905b815481529060010190602001808311610b0757829003601f168201915b5050505050905090565b6000610b39826124bc565b610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906142b6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbe82611401565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2690614356565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4e612528565b73ffffffffffffffffffffffffffffffffffffffff161480610c7d5750610c7c81610c77612528565b61224e565b5b610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906141f6565b60405180910390fd5b610cc68383612530565b505050565b6000600880549050905090565b600e5481565b610cef610ce9612528565b826125e9565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590614376565b60405180910390fd5b610d398383836126c7565b505050565b60138054610d4b9061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d779061473c565b8015610dc45780601f10610d9957610100808354040283529160200191610dc4565b820191906000526020600020905b815481529060010190602001808311610da757829003601f168201915b505050505081565b6000610dd7836114c6565b8210610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f906140b6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e79612528565b73ffffffffffffffffffffffffffffffffffffffff16610e97611606565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee4906142d6565b60405180910390fd5b6000600f60146101000a81548160ff021916908315150217905550565b6000600c54905090565b610f2f83838360405180602001604052806000815250611d7e565b505050565b600060166000838152602001908152602001600020546014610f56919061461c565b9050919050565b60145481565b6000610f6d610ccb565b8210610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614396565b60405180910390fd5b60088281548110610fe8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611002612528565b73ffffffffffffffffffffffffffffffffffffffff16611020611606565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d906142d6565b60405180910390fd5b6001600f60146101000a81548160ff021916908315150217905550565b6002600b5414156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906143f6565b60405180910390fd5b6002600b81905550601560019054906101000a900460ff1615611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890614276565b60405180910390fd5b6111396109ff565b15611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614416565b60405180910390fd5b600082116111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614296565b60405180910390fd5b600d54821115611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890614196565b60405180910390fd5b611209611aaf565b82111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614336565b60405180910390fd5b3482600e5461125a91906145c2565b1461129a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129190614436565b60405180910390fd5b6112a381612061565b6112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906141d6565b60405180910390fd5b816112ec82610f34565b101561132d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611324906143d6565b60405180910390fd5b6113378183612923565b60005b828110156113655761135261134d612528565b61295d565b808061135d9061479f565b91505061133a565b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156113ce573d6000803e3d6000fd5b506001600b819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190614236565b60405180910390fd5b80915050919050565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614216565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611586612528565b73ffffffffffffffffffffffffffffffffffffffff166115a4611606565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f1906142d6565b60405180910390fd5b61160460006129c0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611638612528565b73ffffffffffffffffffffffffffffffffffffffff16611656611606565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906142d6565b60405180910390fd5b80601790805190602001906116c292919061360d565b5050565b6060600180546116d59061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546117019061473c565b801561174e5780601f106117235761010080835404028352916020019161174e565b820191906000526020600020905b81548152906001019060200180831161173157829003601f168201915b5050505050905090565b611760612528565b73ffffffffffffffffffffffffffffffffffffffff1661177e611606565b73ffffffffffffffffffffffffffffffffffffffff16146117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb906142d6565b60405180910390fd5b601560009054906101000a900460ff1615611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906143b6565b60405180910390fd5b6001601560006101000a81548160ff0219169083151502179055506127104261184d91906147e8565b601481905550565b6002600b54141561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906143f6565b60405180910390fd5b6002600b819055506118ab6109ff565b156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290614416565b60405180910390fd5b6000811161192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614296565b60405180910390fd5b600d54811115611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a90614196565b60405180910390fd5b61197b611aaf565b8111156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b490614336565b60405180910390fd5b3481600e546119cc91906145c2565b14611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614436565b60405180910390fd5b60005b81811015611a3a57611a27611a22612528565b61295d565b8080611a329061479f565b915050611a0f565b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611aa3573d6000803e3d6000fd5b506001600b8190555050565b6000611ab9610ccb565b600c54611ac6919061461c565b905090565b611ad3612528565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890614156565b60405180910390fd5b8060056000611b4e612528565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bfb612528565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c40919061405e565b60405180910390a35050565b611c54612528565b73ffffffffffffffffffffffffffffffffffffffff16611c72611606565b73ffffffffffffffffffffffffffffffffffffffff1614611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906142d6565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611ced612528565b73ffffffffffffffffffffffffffffffffffffffff16611d0b611606565b73ffffffffffffffffffffffffffffffffffffffff1614611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d58906142d6565b60405180910390fd5b6001601560016101000a81548160ff021916908315150217905550565b611d8f611d89612528565b836125e9565b611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc590614376565b60405180910390fd5b611dda84848484612a86565b50505050565b611de8612528565b73ffffffffffffffffffffffffffffffffffffffff16611e06611606565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906142d6565b60405180910390fd5b60008111611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614296565b60405180910390fd5b611ea7611aaf565b811115611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090614336565b60405180910390fd5b60005b81811015611f1757611f04611eff612528565b61295d565b8080611f0f9061479f565b915050611eec565b5050565b6060611f26826124bc565b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90614316565b60405180910390fd5b601260009054906101000a900460ff16611f995760405180606001604052806035815260200161512c603591399050612049565b6000611fa3612ae2565b9050600061271060145485611fb8919061453b565b611fc291906147e8565b90506000825111611fe25760405180602001604052806000815250612044565b81611fec82612b74565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161203493929190613fab565b6040516020818303038152906040525b925050505b919050565b601260009054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016120be9190614456565b60206040518083038186803b1580156120d657600080fd5b505afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613827565b73ffffffffffffffffffffffffffffffffffffffff1661212c612528565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b612152612528565b73ffffffffffffffffffffffffffffffffffffffff16612170611606565b73ffffffffffffffffffffffffffffffffffffffff16146121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd906142d6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561220c573d6000803e3d6000fd5b50565b60115481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122ea612528565b73ffffffffffffffffffffffffffffffffffffffff16612308611606565b73ffffffffffffffffffffffffffffffffffffffff161461235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906142d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c5906140f6565b60405180910390fd5b6123d7816129c0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b557506124b482612d21565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125a383611401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125f4826124bc565b612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614176565b60405180910390fd5b600061263e83611401565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126ad57508373ffffffffffffffffffffffffffffffffffffffff1661269584610b2e565b73ffffffffffffffffffffffffffffffffffffffff16145b806126be57506126bd818561224e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126e782611401565b73ffffffffffffffffffffffffffffffffffffffff161461273d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612734906142f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490614136565b60405180910390fd5b6127b8838383612d8b565b6127c3600082612530565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612813919061461c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461286a919061453b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b806016600084815260200190815260200160002054612942919061453b565b60166000848152602001908152602001600020819055505050565b6000612967610ccb565b9050612972816124bc565b156129b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a9906141b6565b60405180910390fd5b6129bc8282612e9f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a918484846126c7565b612a9d84848484612ebd565b612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad3906140d6565b60405180910390fd5b50505050565b606060178054612af19061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1d9061473c565b8015612b6a5780601f10612b3f57610100808354040283529160200191612b6a565b820191906000526020600020905b815481529060010190602001808311612b4d57829003601f168201915b5050505050905090565b60606000821415612bbc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d1c565b600082905060005b60008214612bee578080612bd79061479f565b915050600a82612be79190614591565b9150612bc4565b60008167ffffffffffffffff811115612c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c625781602001600182028036833780820191505090505b5090505b60008514612d1557600182612c7b919061461c565b9150600a85612c8a91906147e8565b6030612c96919061453b565b60f81b818381518110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d0e9190614591565b9450612c66565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d96838383613054565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd957612dd481613059565b612e18565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e1757612e1683826130a2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5b57612e568161320f565b612e9a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e9957612e988282613352565b5b5b505050565b612eb98282604051806020016040528060008152506133d1565b5050565b6000612ede8473ffffffffffffffffffffffffffffffffffffffff1661342c565b15613047578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f07612528565b8786866040518563ffffffff1660e01b8152600401612f299493929190614012565b602060405180830381600087803b158015612f4357600080fd5b505af1925050508015612f7457506040513d601f19601f82011682018060405250810190612f7191906139f7565b60015b612ff7573d8060008114612fa4576040519150601f19603f3d011682016040523d82523d6000602084013e612fa9565b606091505b50600081511415612fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe6906140d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061304c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130af846114c6565b6130b9919061461c565b905060006007600084815260200190815260200160002054905081811461319e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613223919061461c565b9050600060096000848152602001908152602001600020549050600060088381548110613279577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613336577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061335d836114c6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6133db838361343f565b6133e86000848484612ebd565b613427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341e906140d6565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a690614256565b60405180910390fd5b6134b8816124bc565b156134f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ef90614116565b60405180910390fd5b61350460008383612d8b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613554919061453b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546136199061473c565b90600052602060002090601f01602090048101928261363b5760008555613682565b82601f1061365457805160ff1916838001178555613682565b82800160010185558215613682579182015b82811115613681578251825591602001919060010190613666565b5b50905061368f9190613693565b5090565b5b808211156136ac576000816000905550600101613694565b5090565b60006136c36136be84614496565b614471565b9050828152602081018484840111156136db57600080fd5b6136e68482856146fa565b509392505050565b60006137016136fc846144c7565b614471565b90508281526020810184848401111561371957600080fd5b6137248482856146fa565b509392505050565b60008135905061373b816150cf565b92915050565b600081519050613750816150cf565b92915050565b600081359050613765816150e6565b92915050565b60008135905061377a816150fd565b92915050565b60008151905061378f816150fd565b92915050565b600082601f8301126137a657600080fd5b81356137b68482602086016136b0565b91505092915050565b600082601f8301126137d057600080fd5b81356137e08482602086016136ee565b91505092915050565b6000813590506137f881615114565b92915050565b60006020828403121561381057600080fd5b600061381e8482850161372c565b91505092915050565b60006020828403121561383957600080fd5b600061384784828501613741565b91505092915050565b6000806040838503121561386357600080fd5b60006138718582860161372c565b92505060206138828582860161372c565b9150509250929050565b6000806000606084860312156138a157600080fd5b60006138af8682870161372c565b93505060206138c08682870161372c565b92505060406138d1868287016137e9565b9150509250925092565b600080600080608085870312156138f157600080fd5b60006138ff8782880161372c565b94505060206139108782880161372c565b9350506040613921878288016137e9565b925050606085013567ffffffffffffffff81111561393e57600080fd5b61394a87828801613795565b91505092959194509250565b6000806040838503121561396957600080fd5b60006139778582860161372c565b925050602061398885828601613756565b9150509250929050565b600080604083850312156139a557600080fd5b60006139b38582860161372c565b92505060206139c4858286016137e9565b9150509250929050565b6000602082840312156139e057600080fd5b60006139ee8482850161376b565b91505092915050565b600060208284031215613a0957600080fd5b6000613a1784828501613780565b91505092915050565b600060208284031215613a3257600080fd5b600082013567ffffffffffffffff811115613a4c57600080fd5b613a58848285016137bf565b91505092915050565b600060208284031215613a7357600080fd5b6000613a81848285016137e9565b91505092915050565b60008060408385031215613a9d57600080fd5b6000613aab858286016137e9565b9250506020613abc858286016137e9565b9150509250929050565b613acf81614662565b82525050565b613ade81614650565b82525050565b613aed81614674565b82525050565b6000613afe826144f8565b613b08818561450e565b9350613b18818560208601614709565b613b21816148d5565b840191505092915050565b613b35816146d6565b82525050565b6000613b4682614503565b613b50818561451f565b9350613b60818560208601614709565b613b69816148d5565b840191505092915050565b6000613b7f82614503565b613b898185614530565b9350613b99818560208601614709565b80840191505092915050565b6000613bb2602b8361451f565b9150613bbd826148e6565b604082019050919050565b6000613bd560328361451f565b9150613be082614935565b604082019050919050565b6000613bf860268361451f565b9150613c0382614984565b604082019050919050565b6000613c1b601c8361451f565b9150613c26826149d3565b602082019050919050565b6000613c3e60248361451f565b9150613c49826149fc565b604082019050919050565b6000613c6160198361451f565b9150613c6c82614a4b565b602082019050919050565b6000613c84602c8361451f565b9150613c8f82614a74565b604082019050919050565b6000613ca760328361451f565b9150613cb282614ac3565b604082019050919050565b6000613cca60268361451f565b9150613cd582614b12565b604082019050919050565b6000613ced60258361451f565b9150613cf882614b61565b604082019050919050565b6000613d1060388361451f565b9150613d1b82614bb0565b604082019050919050565b6000613d33602a8361451f565b9150613d3e82614bff565b604082019050919050565b6000613d5660298361451f565b9150613d6182614c4e565b604082019050919050565b6000613d7960208361451f565b9150613d8482614c9d565b602082019050919050565b6000613d9c60288361451f565b9150613da782614cc6565b604082019050919050565b6000613dbf60248361451f565b9150613dca82614d15565b604082019050919050565b6000613de2602c8361451f565b9150613ded82614d64565b604082019050919050565b6000613e0560208361451f565b9150613e1082614db3565b602082019050919050565b6000613e2860298361451f565b9150613e3382614ddc565b604082019050919050565b6000613e4b602f8361451f565b9150613e5682614e2b565b604082019050919050565b6000613e6e602b8361451f565b9150613e7982614e7a565b604082019050919050565b6000613e9160218361451f565b9150613e9c82614ec9565b604082019050919050565b6000613eb460318361451f565b9150613ebf82614f18565b604082019050919050565b6000613ed7602c8361451f565b9150613ee282614f67565b604082019050919050565b6000613efa60108361451f565b9150613f0582614fb6565b602082019050919050565b6000613f1d60258361451f565b9150613f2882614fdf565b604082019050919050565b6000613f40601f8361451f565b9150613f4b8261502e565b602082019050919050565b6000613f6360208361451f565b9150613f6e82615057565b602082019050919050565b6000613f86602b8361451f565b9150613f9182615080565b604082019050919050565b613fa5816146cc565b82525050565b6000613fb78286613b74565b9150613fc38285613b74565b9150613fcf8284613b74565b9150819050949350505050565b6000602082019050613ff16000830184613ad5565b92915050565b600060208201905061400c6000830184613ac6565b92915050565b60006080820190506140276000830187613ad5565b6140346020830186613ad5565b6140416040830185613f9c565b81810360608301526140538184613af3565b905095945050505050565b60006020820190506140736000830184613ae4565b92915050565b600060208201905061408e6000830184613b2c565b92915050565b600060208201905081810360008301526140ae8184613b3b565b905092915050565b600060208201905081810360008301526140cf81613ba5565b9050919050565b600060208201905081810360008301526140ef81613bc8565b9050919050565b6000602082019050818103600083015261410f81613beb565b9050919050565b6000602082019050818103600083015261412f81613c0e565b9050919050565b6000602082019050818103600083015261414f81613c31565b9050919050565b6000602082019050818103600083015261416f81613c54565b9050919050565b6000602082019050818103600083015261418f81613c77565b9050919050565b600060208201905081810360008301526141af81613c9a565b9050919050565b600060208201905081810360008301526141cf81613cbd565b9050919050565b600060208201905081810360008301526141ef81613ce0565b9050919050565b6000602082019050818103600083015261420f81613d03565b9050919050565b6000602082019050818103600083015261422f81613d26565b9050919050565b6000602082019050818103600083015261424f81613d49565b9050919050565b6000602082019050818103600083015261426f81613d6c565b9050919050565b6000602082019050818103600083015261428f81613d8f565b9050919050565b600060208201905081810360008301526142af81613db2565b9050919050565b600060208201905081810360008301526142cf81613dd5565b9050919050565b600060208201905081810360008301526142ef81613df8565b9050919050565b6000602082019050818103600083015261430f81613e1b565b9050919050565b6000602082019050818103600083015261432f81613e3e565b9050919050565b6000602082019050818103600083015261434f81613e61565b9050919050565b6000602082019050818103600083015261436f81613e84565b9050919050565b6000602082019050818103600083015261438f81613ea7565b9050919050565b600060208201905081810360008301526143af81613eca565b9050919050565b600060208201905081810360008301526143cf81613eed565b9050919050565b600060208201905081810360008301526143ef81613f10565b9050919050565b6000602082019050818103600083015261440f81613f33565b9050919050565b6000602082019050818103600083015261442f81613f56565b9050919050565b6000602082019050818103600083015261444f81613f79565b9050919050565b600060208201905061446b6000830184613f9c565b92915050565b600061447b61448c565b9050614487828261476e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144b1576144b06148a6565b5b6144ba826148d5565b9050602081019050919050565b600067ffffffffffffffff8211156144e2576144e16148a6565b5b6144eb826148d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614546826146cc565b9150614551836146cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561458657614585614819565b5b828201905092915050565b600061459c826146cc565b91506145a7836146cc565b9250826145b7576145b6614848565b5b828204905092915050565b60006145cd826146cc565b91506145d8836146cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561461157614610614819565b5b828202905092915050565b6000614627826146cc565b9150614632836146cc565b92508282101561464557614644614819565b5b828203905092915050565b600061465b826146ac565b9050919050565b600061466d826146ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146e1826146e8565b9050919050565b60006146f3826146ac565b9050919050565b82818337600083830152505050565b60005b8381101561472757808201518184015260208101905061470c565b83811115614736576000848401525b50505050565b6000600282049050600182168061475457607f821691505b6020821081141561476857614767614877565b5b50919050565b614777826148d5565b810181811067ffffffffffffffff82111715614796576147956148a6565b5b80604052505050565b60006147aa826146cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147dd576147dc614819565b5b600182019050919050565b60006147f3826146cc565b91506147fe836146cc565b92508261480e5761480d614848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20697473206e6f7420616c6c6f776560008201527f6420746f206275792074686973206d7563680000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20546f6b656e20616c72656164792060008201527f65786973742e0000000000000000000000000000000000000000000000000000602082015250565b7f4561726c7941646f707465723a20596f7520646f6e74206f776e20746869732060008201527f746f6b656e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4561726c7941646f707465723a206561726c792061646f707465722073616c6560008201527f20697320646f6e65000000000000000000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20627579206174206c65617374203160008201527f204e465400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a206e6f7420656e6f756768204e465460008201527f7320617661696c61626c65000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f494420736869667420697320646f6e6500000000000000000000000000000000600082015250565b7f4561726c7941646f707465723a20596f752063616e74206d696e74207468697360008201527f206d756368000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524337323143617070656453616c653a2073616c6520697320706175736564600082015250565b7f45524337323143617070656453616c653a2065786163742076616c756520696e60008201527f20455448206e6565646564000000000000000000000000000000000000000000602082015250565b6150d881614650565b81146150e357600080fd5b50565b6150ef81614674565b81146150fa57600080fd5b50565b61510681614680565b811461511157600080fd5b50565b61511d816146cc565b811461512857600080fd5b5056fe697066733a2f2f516d596d345754686335794341706a465477386243763575435366696b6865794b6b6f366b685370417850485051a2646970667358221220bae9643446eac25a59c32a2a333c4010754044d9a72f020907f58663e809866a64736f6c63430008040033697066733a2f2f516d52644357435947324e79684b444c6f48724c714c7642555579344d724e65434d386272345568787a534c734b2f
Deployed Bytecode
0x6080604052600436106102715760003560e01c80636eebccfc1161014f578063a4d3f13e116100c1578063db2e21bc1161007a578063db2e21bc14610901578063dbeb5e9214610918578063dfc4c2d414610943578063e0ba7c2a1461096e578063e985e9c514610999578063f2fde38b146109d657610271565b8063a4d3f13e146107f3578063b88d4fde1461080a578063c1f2612314610833578063c87b56dd1461085c578063ca2bbb6f14610899578063ce47a2a8146108c457610271565b806395d89b411161011357806395d89b411461072a5780639835c8e414610755578063a0712d681461076c578063a07c0e4514610788578063a22cb465146107b3578063a475b5dd146107dc57610271565b80636eebccfc1461065757806370a0823114610682578063715018a6146106bf5780638da5cb5b146106d65780638ef79e911461070157610271565b80632f745c59116101e85780634de37d11116101ac5780634de37d11146105545780634f6ccce71461057f57806355367ba9146105bc57806358a54fcd146105d3578063610757e4146105ef5780636352211e1461061a57610271565b80632f745c591461046f57806333e364cb146104ac578063355274ea146104c357806342842e0e146104ee57806342d1adae1461051757610271565b8063081812fc1161023a578063081812fc1461035f578063095ea7b31461039c57806318160ddd146103c55780631f9e4d49146103f057806323b872dd1461041b57806327bc4d0c1461044457610271565b80628ca8161461027657806301ffc9a7146102a15780630492f055146102de578063060cf4e81461030957806306fdde0314610334575b600080fd5b34801561028257600080fd5b5061028b6109ff565b604051610298919061405e565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c391906139ce565b610a16565b6040516102d5919061405e565b60405180910390f35b3480156102ea57600080fd5b506102f3610a90565b6040516103009190614456565b60405180910390f35b34801561031557600080fd5b5061031e610a96565b60405161032b9190614456565b60405180910390f35b34801561034057600080fd5b50610349610a9c565b6040516103569190614094565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190613a61565b610b2e565b6040516103939190613fdc565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190613992565b610bb3565b005b3480156103d157600080fd5b506103da610ccb565b6040516103e79190614456565b60405180910390f35b3480156103fc57600080fd5b50610405610cd8565b6040516104129190614456565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d919061388c565b610cde565b005b34801561045057600080fd5b50610459610d3e565b6040516104669190614094565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190613992565b610dcc565b6040516104a39190614456565b60405180910390f35b3480156104b857600080fd5b506104c1610e71565b005b3480156104cf57600080fd5b506104d8610f0a565b6040516104e59190614456565b60405180910390f35b3480156104fa57600080fd5b506105156004803603810190610510919061388c565b610f14565b005b34801561052357600080fd5b5061053e60048036038101906105399190613a61565b610f34565b60405161054b9190614456565b60405180910390f35b34801561056057600080fd5b50610569610f5d565b6040516105769190614456565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a61565b610f63565b6040516105b39190614456565b60405180910390f35b3480156105c857600080fd5b506105d1610ffa565b005b6105ed60048036038101906105e89190613a8a565b611093565b005b3480156105fb57600080fd5b506106046113db565b6040516106119190613ff7565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613a61565b611401565b60405161064e9190613fdc565b60405180910390f35b34801561066357600080fd5b5061066c6114b3565b604051610679919061405e565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906137fe565b6114c6565b6040516106b69190614456565b60405180910390f35b3480156106cb57600080fd5b506106d461157e565b005b3480156106e257600080fd5b506106eb611606565b6040516106f89190613fdc565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190613a20565b611630565b005b34801561073657600080fd5b5061073f6116c6565b60405161074c9190614094565b60405180910390f35b34801561076157600080fd5b5061076a611758565b005b61078660048036038101906107819190613a61565b611855565b005b34801561079457600080fd5b5061079d611aaf565b6040516107aa9190614456565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613956565b611acb565b005b3480156107e857600080fd5b506107f1611c4c565b005b3480156107ff57600080fd5b50610808611ce5565b005b34801561081657600080fd5b50610831600480360381019061082c91906138db565b611d7e565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613a61565b611de0565b005b34801561086857600080fd5b50610883600480360381019061087e9190613a61565b611f1b565b6040516108909190614094565b60405180910390f35b3480156108a557600080fd5b506108ae61204e565b6040516108bb919061405e565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613a61565b612061565b6040516108f8919061405e565b60405180910390f35b34801561090d57600080fd5b5061091661214a565b005b34801561092457600080fd5b5061092d61220f565b60405161093a9190614456565b60405180910390f35b34801561094f57600080fd5b50610958612215565b6040516109659190614079565b60405180910390f35b34801561097a57600080fd5b5061098361223b565b604051610990919061405e565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb9190613850565b61224e565b6040516109cd919061405e565b60405180910390f35b3480156109e257600080fd5b506109fd60048036038101906109f891906137fe565b6122e2565b005b6000600f60149054906101000a900460ff16905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a895750610a88826123da565b5b9050919050565b600d5481565b600c5481565b606060008054610aab9061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad79061473c565b8015610b245780601f10610af957610100808354040283529160200191610b24565b820191906000526020600020905b815481529060010190602001808311610b0757829003601f168201915b5050505050905090565b6000610b39826124bc565b610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906142b6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbe82611401565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2690614356565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4e612528565b73ffffffffffffffffffffffffffffffffffffffff161480610c7d5750610c7c81610c77612528565b61224e565b5b610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906141f6565b60405180910390fd5b610cc68383612530565b505050565b6000600880549050905090565b600e5481565b610cef610ce9612528565b826125e9565b610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590614376565b60405180910390fd5b610d398383836126c7565b505050565b60138054610d4b9061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d779061473c565b8015610dc45780601f10610d9957610100808354040283529160200191610dc4565b820191906000526020600020905b815481529060010190602001808311610da757829003601f168201915b505050505081565b6000610dd7836114c6565b8210610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f906140b6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e79612528565b73ffffffffffffffffffffffffffffffffffffffff16610e97611606565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee4906142d6565b60405180910390fd5b6000600f60146101000a81548160ff021916908315150217905550565b6000600c54905090565b610f2f83838360405180602001604052806000815250611d7e565b505050565b600060166000838152602001908152602001600020546014610f56919061461c565b9050919050565b60145481565b6000610f6d610ccb565b8210610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614396565b60405180910390fd5b60088281548110610fe8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611002612528565b73ffffffffffffffffffffffffffffffffffffffff16611020611606565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d906142d6565b60405180910390fd5b6001600f60146101000a81548160ff021916908315150217905550565b6002600b5414156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906143f6565b60405180910390fd5b6002600b81905550601560019054906101000a900460ff1615611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890614276565b60405180910390fd5b6111396109ff565b15611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614416565b60405180910390fd5b600082116111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614296565b60405180910390fd5b600d54821115611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890614196565b60405180910390fd5b611209611aaf565b82111561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614336565b60405180910390fd5b3482600e5461125a91906145c2565b1461129a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129190614436565b60405180910390fd5b6112a381612061565b6112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906141d6565b60405180910390fd5b816112ec82610f34565b101561132d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611324906143d6565b60405180910390fd5b6113378183612923565b60005b828110156113655761135261134d612528565b61295d565b808061135d9061479f565b91505061133a565b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156113ce573d6000803e3d6000fd5b506001600b819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190614236565b60405180910390fd5b80915050919050565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614216565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611586612528565b73ffffffffffffffffffffffffffffffffffffffff166115a4611606565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f1906142d6565b60405180910390fd5b61160460006129c0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611638612528565b73ffffffffffffffffffffffffffffffffffffffff16611656611606565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a3906142d6565b60405180910390fd5b80601790805190602001906116c292919061360d565b5050565b6060600180546116d59061473c565b80601f01602080910402602001604051908101604052809291908181526020018280546117019061473c565b801561174e5780601f106117235761010080835404028352916020019161174e565b820191906000526020600020905b81548152906001019060200180831161173157829003601f168201915b5050505050905090565b611760612528565b73ffffffffffffffffffffffffffffffffffffffff1661177e611606565b73ffffffffffffffffffffffffffffffffffffffff16146117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb906142d6565b60405180910390fd5b601560009054906101000a900460ff1615611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181b906143b6565b60405180910390fd5b6001601560006101000a81548160ff0219169083151502179055506127104261184d91906147e8565b601481905550565b6002600b54141561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906143f6565b60405180910390fd5b6002600b819055506118ab6109ff565b156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290614416565b60405180910390fd5b6000811161192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614296565b60405180910390fd5b600d54811115611973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196a90614196565b60405180910390fd5b61197b611aaf565b8111156119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b490614336565b60405180910390fd5b3481600e546119cc91906145c2565b14611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0390614436565b60405180910390fd5b60005b81811015611a3a57611a27611a22612528565b61295d565b8080611a329061479f565b915050611a0f565b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611aa3573d6000803e3d6000fd5b506001600b8190555050565b6000611ab9610ccb565b600c54611ac6919061461c565b905090565b611ad3612528565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890614156565b60405180910390fd5b8060056000611b4e612528565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bfb612528565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c40919061405e565b60405180910390a35050565b611c54612528565b73ffffffffffffffffffffffffffffffffffffffff16611c72611606565b73ffffffffffffffffffffffffffffffffffffffff1614611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906142d6565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611ced612528565b73ffffffffffffffffffffffffffffffffffffffff16611d0b611606565b73ffffffffffffffffffffffffffffffffffffffff1614611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d58906142d6565b60405180910390fd5b6001601560016101000a81548160ff021916908315150217905550565b611d8f611d89612528565b836125e9565b611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc590614376565b60405180910390fd5b611dda84848484612a86565b50505050565b611de8612528565b73ffffffffffffffffffffffffffffffffffffffff16611e06611606565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906142d6565b60405180910390fd5b60008111611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614296565b60405180910390fd5b611ea7611aaf565b811115611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090614336565b60405180910390fd5b60005b81811015611f1757611f04611eff612528565b61295d565b8080611f0f9061479f565b915050611eec565b5050565b6060611f26826124bc565b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90614316565b60405180910390fd5b601260009054906101000a900460ff16611f995760405180606001604052806035815260200161512c603591399050612049565b6000611fa3612ae2565b9050600061271060145485611fb8919061453b565b611fc291906147e8565b90506000825111611fe25760405180602001604052806000815250612044565b81611fec82612b74565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161203493929190613fab565b6040516020818303038152906040525b925050505b919050565b601260009054906101000a900460ff1681565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016120be9190614456565b60206040518083038186803b1580156120d657600080fd5b505afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613827565b73ffffffffffffffffffffffffffffffffffffffff1661212c612528565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b612152612528565b73ffffffffffffffffffffffffffffffffffffffff16612170611606565b73ffffffffffffffffffffffffffffffffffffffff16146121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd906142d6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561220c573d6000803e3d6000fd5b50565b60115481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601560009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122ea612528565b73ffffffffffffffffffffffffffffffffffffffff16612308611606565b73ffffffffffffffffffffffffffffffffffffffff161461235e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612355906142d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c5906140f6565b60405180910390fd5b6123d7816129c0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b557506124b482612d21565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125a383611401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125f4826124bc565b612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90614176565b60405180910390fd5b600061263e83611401565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126ad57508373ffffffffffffffffffffffffffffffffffffffff1661269584610b2e565b73ffffffffffffffffffffffffffffffffffffffff16145b806126be57506126bd818561224e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126e782611401565b73ffffffffffffffffffffffffffffffffffffffff161461273d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612734906142f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490614136565b60405180910390fd5b6127b8838383612d8b565b6127c3600082612530565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612813919061461c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461286a919061453b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b806016600084815260200190815260200160002054612942919061453b565b60166000848152602001908152602001600020819055505050565b6000612967610ccb565b9050612972816124bc565b156129b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a9906141b6565b60405180910390fd5b6129bc8282612e9f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a918484846126c7565b612a9d84848484612ebd565b612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad3906140d6565b60405180910390fd5b50505050565b606060178054612af19061473c565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1d9061473c565b8015612b6a5780601f10612b3f57610100808354040283529160200191612b6a565b820191906000526020600020905b815481529060010190602001808311612b4d57829003601f168201915b5050505050905090565b60606000821415612bbc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d1c565b600082905060005b60008214612bee578080612bd79061479f565b915050600a82612be79190614591565b9150612bc4565b60008167ffffffffffffffff811115612c30577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c625781602001600182028036833780820191505090505b5090505b60008514612d1557600182612c7b919061461c565b9150600a85612c8a91906147e8565b6030612c96919061453b565b60f81b818381518110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d0e9190614591565b9450612c66565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d96838383613054565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd957612dd481613059565b612e18565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e1757612e1683826130a2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5b57612e568161320f565b612e9a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e9957612e988282613352565b5b5b505050565b612eb98282604051806020016040528060008152506133d1565b5050565b6000612ede8473ffffffffffffffffffffffffffffffffffffffff1661342c565b15613047578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f07612528565b8786866040518563ffffffff1660e01b8152600401612f299493929190614012565b602060405180830381600087803b158015612f4357600080fd5b505af1925050508015612f7457506040513d601f19601f82011682018060405250810190612f7191906139f7565b60015b612ff7573d8060008114612fa4576040519150601f19603f3d011682016040523d82523d6000602084013e612fa9565b606091505b50600081511415612fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe6906140d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061304c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130af846114c6565b6130b9919061461c565b905060006007600084815260200190815260200160002054905081811461319e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613223919061461c565b9050600060096000848152602001908152602001600020549050600060088381548110613279577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613336577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061335d836114c6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6133db838361343f565b6133e86000848484612ebd565b613427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341e906140d6565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a690614256565b60405180910390fd5b6134b8816124bc565b156134f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ef90614116565b60405180910390fd5b61350460008383612d8b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613554919061453b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546136199061473c565b90600052602060002090601f01602090048101928261363b5760008555613682565b82601f1061365457805160ff1916838001178555613682565b82800160010185558215613682579182015b82811115613681578251825591602001919060010190613666565b5b50905061368f9190613693565b5090565b5b808211156136ac576000816000905550600101613694565b5090565b60006136c36136be84614496565b614471565b9050828152602081018484840111156136db57600080fd5b6136e68482856146fa565b509392505050565b60006137016136fc846144c7565b614471565b90508281526020810184848401111561371957600080fd5b6137248482856146fa565b509392505050565b60008135905061373b816150cf565b92915050565b600081519050613750816150cf565b92915050565b600081359050613765816150e6565b92915050565b60008135905061377a816150fd565b92915050565b60008151905061378f816150fd565b92915050565b600082601f8301126137a657600080fd5b81356137b68482602086016136b0565b91505092915050565b600082601f8301126137d057600080fd5b81356137e08482602086016136ee565b91505092915050565b6000813590506137f881615114565b92915050565b60006020828403121561381057600080fd5b600061381e8482850161372c565b91505092915050565b60006020828403121561383957600080fd5b600061384784828501613741565b91505092915050565b6000806040838503121561386357600080fd5b60006138718582860161372c565b92505060206138828582860161372c565b9150509250929050565b6000806000606084860312156138a157600080fd5b60006138af8682870161372c565b93505060206138c08682870161372c565b92505060406138d1868287016137e9565b9150509250925092565b600080600080608085870312156138f157600080fd5b60006138ff8782880161372c565b94505060206139108782880161372c565b9350506040613921878288016137e9565b925050606085013567ffffffffffffffff81111561393e57600080fd5b61394a87828801613795565b91505092959194509250565b6000806040838503121561396957600080fd5b60006139778582860161372c565b925050602061398885828601613756565b9150509250929050565b600080604083850312156139a557600080fd5b60006139b38582860161372c565b92505060206139c4858286016137e9565b9150509250929050565b6000602082840312156139e057600080fd5b60006139ee8482850161376b565b91505092915050565b600060208284031215613a0957600080fd5b6000613a1784828501613780565b91505092915050565b600060208284031215613a3257600080fd5b600082013567ffffffffffffffff811115613a4c57600080fd5b613a58848285016137bf565b91505092915050565b600060208284031215613a7357600080fd5b6000613a81848285016137e9565b91505092915050565b60008060408385031215613a9d57600080fd5b6000613aab858286016137e9565b9250506020613abc858286016137e9565b9150509250929050565b613acf81614662565b82525050565b613ade81614650565b82525050565b613aed81614674565b82525050565b6000613afe826144f8565b613b08818561450e565b9350613b18818560208601614709565b613b21816148d5565b840191505092915050565b613b35816146d6565b82525050565b6000613b4682614503565b613b50818561451f565b9350613b60818560208601614709565b613b69816148d5565b840191505092915050565b6000613b7f82614503565b613b898185614530565b9350613b99818560208601614709565b80840191505092915050565b6000613bb2602b8361451f565b9150613bbd826148e6565b604082019050919050565b6000613bd560328361451f565b9150613be082614935565b604082019050919050565b6000613bf860268361451f565b9150613c0382614984565b604082019050919050565b6000613c1b601c8361451f565b9150613c26826149d3565b602082019050919050565b6000613c3e60248361451f565b9150613c49826149fc565b604082019050919050565b6000613c6160198361451f565b9150613c6c82614a4b565b602082019050919050565b6000613c84602c8361451f565b9150613c8f82614a74565b604082019050919050565b6000613ca760328361451f565b9150613cb282614ac3565b604082019050919050565b6000613cca60268361451f565b9150613cd582614b12565b604082019050919050565b6000613ced60258361451f565b9150613cf882614b61565b604082019050919050565b6000613d1060388361451f565b9150613d1b82614bb0565b604082019050919050565b6000613d33602a8361451f565b9150613d3e82614bff565b604082019050919050565b6000613d5660298361451f565b9150613d6182614c4e565b604082019050919050565b6000613d7960208361451f565b9150613d8482614c9d565b602082019050919050565b6000613d9c60288361451f565b9150613da782614cc6565b604082019050919050565b6000613dbf60248361451f565b9150613dca82614d15565b604082019050919050565b6000613de2602c8361451f565b9150613ded82614d64565b604082019050919050565b6000613e0560208361451f565b9150613e1082614db3565b602082019050919050565b6000613e2860298361451f565b9150613e3382614ddc565b604082019050919050565b6000613e4b602f8361451f565b9150613e5682614e2b565b604082019050919050565b6000613e6e602b8361451f565b9150613e7982614e7a565b604082019050919050565b6000613e9160218361451f565b9150613e9c82614ec9565b604082019050919050565b6000613eb460318361451f565b9150613ebf82614f18565b604082019050919050565b6000613ed7602c8361451f565b9150613ee282614f67565b604082019050919050565b6000613efa60108361451f565b9150613f0582614fb6565b602082019050919050565b6000613f1d60258361451f565b9150613f2882614fdf565b604082019050919050565b6000613f40601f8361451f565b9150613f4b8261502e565b602082019050919050565b6000613f6360208361451f565b9150613f6e82615057565b602082019050919050565b6000613f86602b8361451f565b9150613f9182615080565b604082019050919050565b613fa5816146cc565b82525050565b6000613fb78286613b74565b9150613fc38285613b74565b9150613fcf8284613b74565b9150819050949350505050565b6000602082019050613ff16000830184613ad5565b92915050565b600060208201905061400c6000830184613ac6565b92915050565b60006080820190506140276000830187613ad5565b6140346020830186613ad5565b6140416040830185613f9c565b81810360608301526140538184613af3565b905095945050505050565b60006020820190506140736000830184613ae4565b92915050565b600060208201905061408e6000830184613b2c565b92915050565b600060208201905081810360008301526140ae8184613b3b565b905092915050565b600060208201905081810360008301526140cf81613ba5565b9050919050565b600060208201905081810360008301526140ef81613bc8565b9050919050565b6000602082019050818103600083015261410f81613beb565b9050919050565b6000602082019050818103600083015261412f81613c0e565b9050919050565b6000602082019050818103600083015261414f81613c31565b9050919050565b6000602082019050818103600083015261416f81613c54565b9050919050565b6000602082019050818103600083015261418f81613c77565b9050919050565b600060208201905081810360008301526141af81613c9a565b9050919050565b600060208201905081810360008301526141cf81613cbd565b9050919050565b600060208201905081810360008301526141ef81613ce0565b9050919050565b6000602082019050818103600083015261420f81613d03565b9050919050565b6000602082019050818103600083015261422f81613d26565b9050919050565b6000602082019050818103600083015261424f81613d49565b9050919050565b6000602082019050818103600083015261426f81613d6c565b9050919050565b6000602082019050818103600083015261428f81613d8f565b9050919050565b600060208201905081810360008301526142af81613db2565b9050919050565b600060208201905081810360008301526142cf81613dd5565b9050919050565b600060208201905081810360008301526142ef81613df8565b9050919050565b6000602082019050818103600083015261430f81613e1b565b9050919050565b6000602082019050818103600083015261432f81613e3e565b9050919050565b6000602082019050818103600083015261434f81613e61565b9050919050565b6000602082019050818103600083015261436f81613e84565b9050919050565b6000602082019050818103600083015261438f81613ea7565b9050919050565b600060208201905081810360008301526143af81613eca565b9050919050565b600060208201905081810360008301526143cf81613eed565b9050919050565b600060208201905081810360008301526143ef81613f10565b9050919050565b6000602082019050818103600083015261440f81613f33565b9050919050565b6000602082019050818103600083015261442f81613f56565b9050919050565b6000602082019050818103600083015261444f81613f79565b9050919050565b600060208201905061446b6000830184613f9c565b92915050565b600061447b61448c565b9050614487828261476e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144b1576144b06148a6565b5b6144ba826148d5565b9050602081019050919050565b600067ffffffffffffffff8211156144e2576144e16148a6565b5b6144eb826148d5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614546826146cc565b9150614551836146cc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561458657614585614819565b5b828201905092915050565b600061459c826146cc565b91506145a7836146cc565b9250826145b7576145b6614848565b5b828204905092915050565b60006145cd826146cc565b91506145d8836146cc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561461157614610614819565b5b828202905092915050565b6000614627826146cc565b9150614632836146cc565b92508282101561464557614644614819565b5b828203905092915050565b600061465b826146ac565b9050919050565b600061466d826146ac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146e1826146e8565b9050919050565b60006146f3826146ac565b9050919050565b82818337600083830152505050565b60005b8381101561472757808201518184015260208101905061470c565b83811115614736576000848401525b50505050565b6000600282049050600182168061475457607f821691505b6020821081141561476857614767614877565b5b50919050565b614777826148d5565b810181811067ffffffffffffffff82111715614796576147956148a6565b5b80604052505050565b60006147aa826146cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147dd576147dc614819565b5b600182019050919050565b60006147f3826146cc565b91506147fe836146cc565b92508261480e5761480d614848565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20697473206e6f7420616c6c6f776560008201527f6420746f206275792074686973206d7563680000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20546f6b656e20616c72656164792060008201527f65786973742e0000000000000000000000000000000000000000000000000000602082015250565b7f4561726c7941646f707465723a20596f7520646f6e74206f776e20746869732060008201527f746f6b656e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4561726c7941646f707465723a206561726c792061646f707465722073616c6560008201527f20697320646f6e65000000000000000000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a20627579206174206c65617374203160008201527f204e465400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45524337323143617070656453616c653a206e6f7420656e6f756768204e465460008201527f7320617661696c61626c65000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f494420736869667420697320646f6e6500000000000000000000000000000000600082015250565b7f4561726c7941646f707465723a20596f752063616e74206d696e74207468697360008201527f206d756368000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524337323143617070656453616c653a2073616c6520697320706175736564600082015250565b7f45524337323143617070656453616c653a2065786163742076616c756520696e60008201527f20455448206e6565646564000000000000000000000000000000000000000000602082015250565b6150d881614650565b81146150e357600080fd5b50565b6150ef81614674565b81146150fa57600080fd5b50565b61510681614680565b811461511157600080fd5b50565b61511d816146cc565b811461512857600080fd5b5056fe697066733a2f2f516d596d345754686335794341706a465477386243763575435366696b6865794b6b6f366b685370417850485051a2646970667358221220bae9643446eac25a59c32a2a333c4010754044d9a72f020907f58663e809866a64736f6c63430008040033
Deployed Bytecode Sourcemap
43604:4515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42441:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34693:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40948:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40922:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22906:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24465:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23988:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35333:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40983:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25355:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44430:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35001:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42627:81;;;;;;;;;;;;;:::i;:::-;;42359:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25765:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46888:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44470:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35523:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42540:79;;;;;;;;;;;;;:::i;:::-;;45740:1136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41029:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22600:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44545:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22330:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20369:94;;;;;;;;;;;;;:::i;:::-;;19718:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47639:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23075:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47937:177;;;;;;;;;;;;;:::i;:::-;;41569:672;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42251:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24758:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47857:72;;;;;;;;;;;;;:::i;:::-;;47760:89;;;;;;;;;;;;;:::i;:::-;;26021:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43005:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45157:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44392:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47300:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42811:116;;;;;;;;;;;;;:::i;:::-;;44351:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44313:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44504:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25124:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20618:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42441:89;42485:4;42509:13;;;;;;;;;;;42502:20;;42441:89;:::o;34693:224::-;34795:4;34834:35;34819:50;;;:11;:50;;;;:90;;;;34873:36;34897:11;34873:23;:36::i;:::-;34819:90;34812:97;;34693:224;;;:::o;40948:28::-;;;;:::o;40922:19::-;;;;:::o;22906:100::-;22960:13;22993:5;22986:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22906:100;:::o;24465:221::-;24541:7;24569:16;24577:7;24569;:16::i;:::-;24561:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24654:15;:24;24670:7;24654:24;;;;;;;;;;;;;;;;;;;;;24647:31;;24465:221;;;:::o;23988:411::-;24069:13;24085:23;24100:7;24085:14;:23::i;:::-;24069:39;;24133:5;24127:11;;:2;:11;;;;24119:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24227:5;24211:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24236:37;24253:5;24260:12;:10;:12::i;:::-;24236:16;:37::i;:::-;24211:62;24189:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24370:21;24379:2;24383:7;24370:8;:21::i;:::-;23988:411;;;:::o;35333:113::-;35394:7;35421:10;:17;;;;35414:24;;35333:113;:::o;40983:29::-;;;;:::o;25355:339::-;25550:41;25569:12;:10;:12::i;:::-;25583:7;25550:18;:41::i;:::-;25542:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25658:28;25668:4;25674:2;25678:7;25658:9;:28::i;:::-;25355:339;;;:::o;44430:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35001:256::-;35098:7;35134:23;35151:5;35134:16;:23::i;:::-;35126:5;:31;35118:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35223:12;:19;35236:5;35223:19;;;;;;;;;;;;;;;:26;35243:5;35223:26;;;;;;;;;;;;35216:33;;35001:256;;;;:::o;42627:81::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42695:5:::1;42679:13;;:21;;;;;;;;;;;;;;;;;;42627:81::o:0;42359:74::-;42394:7;42421:4;;42414:11;;42359:74;:::o;25765:185::-;25903:39;25920:4;25926:2;25930:7;25903:39;;;;;;;;;;;;:16;:39::i;:::-;25765:185;;;:::o;46888:184::-;46971:7;47021:20;:41;47042:19;47021:41;;;;;;;;;;;;44005:2;46998:64;;;;:::i;:::-;46991:71;;46888:184;;;:::o;44470:27::-;;;;:::o;35523:233::-;35598:7;35634:30;:28;:30::i;:::-;35626:5;:38;35618:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35731:10;35742:5;35731:17;;;;;;;;;;;;;;;;;;;;;;;;35724:24;;35523:233;;;:::o;42540:79::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42607:4:::1;42591:13;;:20;;;;;;;;;;;;;;;;;;42540:79::o:0;45740:1136::-;16152:1;16748:7;;:19;;16740:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;16152:1;16881:7;:18;;;;45863:13:::1;;;;;;;;;;;45862:14;45854:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45967:14;:12;:14::i;:::-;45966:15;45958:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;46050:1;46037:10;:14;46029:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46125:13;;46111:10;:27;;46103:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;46226:15;:13;:15::i;:::-;46212:10;:29;;46204:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46341:9;46326:10;46309:14;;:27;;;;:::i;:::-;46308:42;46300:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;46447:37;46464:19;46447:16;:37::i;:::-;46439:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46594:10;46545:45;46570:19;46545:24;:45::i;:::-;:59;;46537:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;46657:60;46685:19;46706:10;46657:27;:60::i;:::-;46735:9;46730:92;46754:10;46750:1;:14;46730:92;;;46786:24;46797:12;:10;:12::i;:::-;46786:10;:24::i;:::-;46766:3;;;;;:::i;:::-;;;;46730:92;;;;46840:7;;;;;;;;;;;46832:25;;:36;46858:9;46832:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;16108:1:::0;17060:7;:22;;;;45740:1136;;:::o;41029:30::-;;;;;;;;;;;;;:::o;22600:239::-;22672:7;22692:13;22708:7;:16;22716:7;22708:16;;;;;;;;;;;;;;;;;;;;;22692:32;;22760:1;22743:19;;:5;:19;;;;22735:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22826:5;22819:12;;;22600:239;;;:::o;44545:33::-;;;;;;;;;;;;;:::o;22330:208::-;22402:7;22447:1;22430:19;;:5;:19;;;;22422:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22514:9;:16;22524:5;22514:16;;;;;;;;;;;;;;;;22507:23;;22330:208;;;:::o;20369:94::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20434:21:::1;20452:1;20434:9;:21::i;:::-;20369:94::o:0;19718:87::-;19764:7;19791:6;;;;;;;;;;;19784:13;;19718:87;:::o;47639:113::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47734:10:::1;47718:13;:26;;;;;;;;;;;;:::i;:::-;;47639:113:::0;:::o;23075:104::-;23131:13;23164:7;23157:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23075:104;:::o;47937:177::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47994:12:::1;;;;;;;;;;;47993:13;47985:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;48053:4;48038:12;;:19;;;;;;;;;;;;;;;;;;43945:5;48079:15;:27;;;;:::i;:::-;48068:8;:38;;;;47937:177::o:0;41569:672::-;16152:1;16748:7;;:19;;16740:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;16152:1;16881:7;:18;;;;41651:14:::1;:12;:14::i;:::-;41650:15;41642:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41734:1;41721:10;:14;41713:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41809:13;;41795:10;:27;;41787:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41910:15;:13;:15::i;:::-;41896:10;:29;;41888:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42025:9;42010:10;41993:14;;:27;;;;:::i;:::-;41992:42;41984:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;42100:9;42095:92;42119:10;42115:1;:14;42095:92;;;42151:24;42162:12;:10;:12::i;:::-;42151:10;:24::i;:::-;42131:3;;;;;:::i;:::-;;;;42095:92;;;;42205:7;;;;;;;;;;;42197:25;;:36;42223:9;42197:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;16108:1:::0;17060:7;:22;;;;41569:672;:::o;42251:100::-;42296:7;42330:13;:11;:13::i;:::-;42323:4;;:20;;;;:::i;:::-;42316:27;;42251:100;:::o;24758:295::-;24873:12;:10;:12::i;:::-;24861:24;;:8;:24;;;;24853:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24973:8;24928:18;:32;24947:12;:10;:12::i;:::-;24928:32;;;;;;;;;;;;;;;:42;24961:8;24928:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25026:8;24997:48;;25012:12;:10;:12::i;:::-;24997:48;;;25036:8;24997:48;;;;;;:::i;:::-;;;;;;;;24758:295;;:::o;47857:72::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47917:4:::1;47903:11;;:18;;;;;;;;;;;;;;;;;;47857:72::o:0;47760:89::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47837:4:::1;47821:13;;:20;;;;;;;;;;;;;;;;;;47760:89::o:0;26021:328::-;26196:41;26215:12;:10;:12::i;:::-;26229:7;26196:18;:41::i;:::-;26188:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26302:39;26316:4;26322:2;26326:7;26335:5;26302:13;:39::i;:::-;26021:328;;;;:::o;43005:336::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43093:1:::1;43080:10;:14;43072:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43168:15;:13;:15::i;:::-;43154:10;:29;;43146:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43247:9;43242:92;43266:10;43262:1;:14;43242:92;;;43298:24;43309:12;:10;:12::i;:::-;43298:10;:24::i;:::-;43278:3;;;;;:::i;:::-;;;;43242:92;;;;43005:336:::0;:::o;45157:503::-;45230:13;45264:16;45272:7;45264;:16::i;:::-;45256:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45349:11;;;;;;;;;;;45345:69;;45384:18;;;;;;;;;;;;;;;;;45377:25;;;;45345:69;45424:21;45448:10;:8;:10::i;:::-;45424:34;;45469:22;43945:5;45503:8;;45495:7;:16;;;;:::i;:::-;45494:30;;;;:::i;:::-;45469:55;;45566:1;45548:7;45542:21;:25;:110;;;;;;;;;;;;;;;;;45594:7;45603:25;:14;:23;:25::i;:::-;45630:15;;;;;;;;;;;;;;;;;45577:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45542:110;45535:117;;;;45157:503;;;;:::o;44392:31::-;;;;;;;;;;;;;:::o;47300:168::-;47375:4;47415:16;;;;;;;;;;;:24;;;47440:19;47415:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47399:61;;:12;:10;:12::i;:::-;:61;;;47392:68;;47300:168;;;:::o;42811:116::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42876:10:::1;42868:28;;:51;42897:21;42868:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42811:116::o:0;44351:32::-;;;;:::o;44313:31::-;;;;;;;;;;;;;:::o;44504:32::-;;;;;;;;;;;;;:::o;25124:164::-;25221:4;25245:18;:25;25264:5;25245:25;;;;;;;;;;;;;;;:35;25271:8;25245:35;;;;;;;;;;;;;;;;;;;;;;;;;25238:42;;25124:164;;;;:::o;20618:192::-;19949:12;:10;:12::i;:::-;19938:23;;:7;:5;:7::i;:::-;:23;;;19930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20727:1:::1;20707:22;;:8;:22;;;;20699:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20783:19;20793:8;20783:9;:19::i;:::-;20618:192:::0;:::o;21973:293::-;22075:4;22123:25;22108:40;;;:11;:40;;;;:101;;;;22176:33;22161:48;;;:11;:48;;;;22108:101;:150;;;;22222:36;22246:11;22222:23;:36::i;:::-;22108:150;22092:166;;21973:293;;;:::o;27859:127::-;27924:4;27976:1;27948:30;;:7;:16;27956:7;27948:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27941:37;;27859:127;;;:::o;15054:98::-;15107:7;15134:10;15127:17;;15054:98;:::o;31841:174::-;31943:2;31916:15;:24;31932:7;31916:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31999:7;31995:2;31961:46;;31970:23;31985:7;31970:14;:23::i;:::-;31961:46;;;;;;;;;;;;31841:174;;:::o;28153:348::-;28246:4;28271:16;28279:7;28271;:16::i;:::-;28263:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28347:13;28363:23;28378:7;28363:14;:23::i;:::-;28347:39;;28416:5;28405:16;;:7;:16;;;:51;;;;28449:7;28425:31;;:20;28437:7;28425:11;:20::i;:::-;:31;;;28405:51;:87;;;;28460:32;28477:5;28484:7;28460:16;:32::i;:::-;28405:87;28397:96;;;28153:348;;;;:::o;31145:578::-;31304:4;31277:31;;:23;31292:7;31277:14;:23::i;:::-;:31;;;31269:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31387:1;31373:16;;:2;:16;;;;31365:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31443:39;31464:4;31470:2;31474:7;31443:20;:39::i;:::-;31547:29;31564:1;31568:7;31547:8;:29::i;:::-;31608:1;31589:9;:15;31599:4;31589:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31637:1;31620:9;:13;31630:2;31620:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31668:2;31649:7;:16;31657:7;31649:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31707:7;31703:2;31688:27;;31697:4;31688:27;;;;;;;;;;;;31145:578;;;:::o;47080:212::-;47274:10;47230:20;:41;47251:19;47230:41;;;;;;;;;;;;:54;;;;:::i;:::-;47186:20;:41;47207:19;47186:41;;;;;;;;;;;:98;;;;47080:212;;:::o;43351:244::-;43419:18;43440:13;:11;:13::i;:::-;43419:34;;43473:19;43481:10;43473:7;:19::i;:::-;43472:20;43464:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43546:41;43556:18;43576:10;43546:9;:41::i;:::-;43351:244;;:::o;20818:173::-;20874:16;20893:6;;;;;;;;;;;20874:25;;20919:8;20910:6;;:17;;;;;;;;;;;;;;;;;;20974:8;20943:40;;20964:8;20943:40;;;;;;;;;;;;20818:173;;:::o;27231:315::-;27388:28;27398:4;27404:2;27408:7;27388:9;:28::i;:::-;27435:48;27458:4;27464:2;27468:7;27477:5;27435:22;:48::i;:::-;27427:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27231:315;;;;:::o;47525:106::-;47577:13;47610;47603:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47525:106;:::o;17285:723::-;17341:13;17571:1;17562:5;:10;17558:53;;;17589:10;;;;;;;;;;;;;;;;;;;;;17558:53;17621:12;17636:5;17621:20;;17652:14;17677:78;17692:1;17684:4;:9;17677:78;;17710:8;;;;;:::i;:::-;;;;17741:2;17733:10;;;;;:::i;:::-;;;17677:78;;;17765:19;17797:6;17787:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17765:39;;17815:154;17831:1;17822:5;:10;17815:154;;17859:1;17849:11;;;;;:::i;:::-;;;17926:2;17918:5;:10;;;;:::i;:::-;17905:2;:24;;;;:::i;:::-;17892:39;;17875:6;17882;17875:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17955:2;17946:11;;;;;:::i;:::-;;;17815:154;;;17993:6;17979:21;;;;;17285:723;;;;:::o;19151:157::-;19236:4;19275:25;19260:40;;;:11;:40;;;;19253:47;;19151:157;;;:::o;36369:589::-;36513:45;36540:4;36546:2;36550:7;36513:26;:45::i;:::-;36591:1;36575:18;;:4;:18;;;36571:187;;;36610:40;36642:7;36610:31;:40::i;:::-;36571:187;;;36680:2;36672:10;;:4;:10;;;36668:90;;36699:47;36732:4;36738:7;36699:32;:47::i;:::-;36668:90;36571:187;36786:1;36772:16;;:2;:16;;;36768:183;;;36805:45;36842:7;36805:36;:45::i;:::-;36768:183;;;36878:4;36872:10;;:2;:10;;;36868:83;;36899:40;36927:2;36931:7;36899:27;:40::i;:::-;36868:83;36768:183;36369:589;;;:::o;28843:110::-;28919:26;28929:2;28933:7;28919:26;;;;;;;;;;;;:9;:26::i;:::-;28843:110;;:::o;32580:799::-;32735:4;32756:15;:2;:13;;;:15::i;:::-;32752:620;;;32808:2;32792:36;;;32829:12;:10;:12::i;:::-;32843:4;32849:7;32858:5;32792:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32788:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33051:1;33034:6;:13;:18;33030:272;;;33077:60;;;;;;;;;;:::i;:::-;;;;;;;;33030:272;33252:6;33246:13;33237:6;33233:2;33229:15;33222:38;32788:529;32925:41;;;32915:51;;;:6;:51;;;;32908:58;;;;;32752:620;33356:4;33349:11;;32580:799;;;;;;;:::o;33951:126::-;;;;:::o;37681:164::-;37785:10;:17;;;;37758:15;:24;37774:7;37758:24;;;;;;;;;;;:44;;;;37813:10;37829:7;37813:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37681:164;:::o;38472:988::-;38738:22;38788:1;38763:22;38780:4;38763:16;:22::i;:::-;:26;;;;:::i;:::-;38738:51;;38800:18;38821:17;:26;38839:7;38821:26;;;;;;;;;;;;38800:47;;38968:14;38954:10;:28;38950:328;;38999:19;39021:12;:18;39034:4;39021:18;;;;;;;;;;;;;;;:34;39040:14;39021:34;;;;;;;;;;;;38999:56;;39105:11;39072:12;:18;39085:4;39072:18;;;;;;;;;;;;;;;:30;39091:10;39072:30;;;;;;;;;;;:44;;;;39222:10;39189:17;:30;39207:11;39189:30;;;;;;;;;;;:43;;;;38950:328;;39374:17;:26;39392:7;39374:26;;;;;;;;;;;39367:33;;;39418:12;:18;39431:4;39418:18;;;;;;;;;;;;;;;:34;39437:14;39418:34;;;;;;;;;;;39411:41;;;38472:988;;;;:::o;39755:1079::-;40008:22;40053:1;40033:10;:17;;;;:21;;;;:::i;:::-;40008:46;;40065:18;40086:15;:24;40102:7;40086:24;;;;;;;;;;;;40065:45;;40437:19;40459:10;40470:14;40459:26;;;;;;;;;;;;;;;;;;;;;;;;40437:48;;40523:11;40498:10;40509;40498:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40634:10;40603:15;:28;40619:11;40603:28;;;;;;;;;;;:41;;;;40775:15;:24;40791:7;40775:24;;;;;;;;;;;40768:31;;;40810:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39755:1079;;;;:::o;37259:221::-;37344:14;37361:20;37378:2;37361:16;:20::i;:::-;37344:37;;37419:7;37392:12;:16;37405:2;37392:16;;;;;;;;;;;;;;;:24;37409:6;37392:24;;;;;;;;;;;:34;;;;37466:6;37437:17;:26;37455:7;37437:26;;;;;;;;;;;:35;;;;37259:221;;;:::o;29180:321::-;29310:18;29316:2;29320:7;29310:5;:18::i;:::-;29361:54;29392:1;29396:2;29400:7;29409:5;29361:22;:54::i;:::-;29339:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29180:321;;;:::o;7690:387::-;7750:4;7958:12;8025:7;8013:20;8005:28;;8068:1;8061:4;:8;8054:15;;;7690:387;;;:::o;29837:382::-;29931:1;29917:16;;:2;:16;;;;29909:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29990:16;29998:7;29990;:16::i;:::-;29989:17;29981:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30052:45;30081:1;30085:2;30089:7;30052:20;:45::i;:::-;30127:1;30110:9;:13;30120:2;30110:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30158:2;30139:7;:16;30147:7;30139:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30203:7;30199:2;30178:33;;30195:1;30178:33;;;;;;;;;;;;29837:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;909:5;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1001:133::-;1044:5;1082:6;1069:20;1060:29;;1098:30;1122:5;1098:30;:::i;:::-;1050:84;;;;:::o;1140:137::-;1185:5;1223:6;1210:20;1201:29;;1239:32;1265:5;1239:32;:::i;:::-;1191:86;;;;:::o;1283:141::-;1339:5;1370:6;1364:13;1355:22;;1386:32;1412:5;1386:32;:::i;:::-;1345:79;;;;:::o;1443:271::-;1498:5;1547:3;1540:4;1532:6;1528:17;1524:27;1514:2;;1565:1;1562;1555:12;1514:2;1605:6;1592:20;1630:78;1704:3;1696:6;1689:4;1681:6;1677:17;1630:78;:::i;:::-;1621:87;;1504:210;;;;;:::o;1734:273::-;1790:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:2;;1857:1;1854;1847:12;1806:2;1897:6;1884:20;1922:79;1997:3;1989:6;1982:4;1974:6;1970:17;1922:79;:::i;:::-;1913:88;;1796:211;;;;;:::o;2013:139::-;2059:5;2097:6;2084:20;2075:29;;2113:33;2140:5;2113:33;:::i;:::-;2065:87;;;;:::o;2158:262::-;2217:6;2266:2;2254:9;2245:7;2241:23;2237:32;2234:2;;;2282:1;2279;2272:12;2234:2;2325:1;2350:53;2395:7;2386:6;2375:9;2371:22;2350:53;:::i;:::-;2340:63;;2296:117;2224:196;;;;:::o;2426:284::-;2496:6;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:64;2685:7;2676:6;2665:9;2661:22;2629:64;:::i;:::-;2619:74;;2575:128;2503:207;;;;:::o;2716:407::-;2784:6;2792;2841:2;2829:9;2820:7;2816:23;2812:32;2809:2;;;2857:1;2854;2847:12;2809:2;2900:1;2925:53;2970:7;2961:6;2950:9;2946:22;2925:53;:::i;:::-;2915:63;;2871:117;3027:2;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2998:118;2799:324;;;;;:::o;3129:552::-;3206:6;3214;3222;3271:2;3259:9;3250:7;3246:23;3242:32;3239:2;;;3287:1;3284;3277:12;3239:2;3330:1;3355:53;3400:7;3391:6;3380:9;3376:22;3355:53;:::i;:::-;3345:63;;3301:117;3457:2;3483:53;3528:7;3519:6;3508:9;3504:22;3483:53;:::i;:::-;3473:63;;3428:118;3585:2;3611:53;3656:7;3647:6;3636:9;3632:22;3611:53;:::i;:::-;3601:63;;3556:118;3229:452;;;;;:::o;3687:809::-;3782:6;3790;3798;3806;3855:3;3843:9;3834:7;3830:23;3826:33;3823:2;;;3872:1;3869;3862:12;3823:2;3915:1;3940:53;3985:7;3976:6;3965:9;3961:22;3940:53;:::i;:::-;3930:63;;3886:117;4042:2;4068:53;4113:7;4104:6;4093:9;4089:22;4068:53;:::i;:::-;4058:63;;4013:118;4170:2;4196:53;4241:7;4232:6;4221:9;4217:22;4196:53;:::i;:::-;4186:63;;4141:118;4326:2;4315:9;4311:18;4298:32;4357:18;4349:6;4346:30;4343:2;;;4389:1;4386;4379:12;4343:2;4417:62;4471:7;4462:6;4451:9;4447:22;4417:62;:::i;:::-;4407:72;;4269:220;3813:683;;;;;;;:::o;4502:401::-;4567:6;4575;4624:2;4612:9;4603:7;4599:23;4595:32;4592:2;;;4640:1;4637;4630:12;4592:2;4683:1;4708:53;4753:7;4744:6;4733:9;4729:22;4708:53;:::i;:::-;4698:63;;4654:117;4810:2;4836:50;4878:7;4869:6;4858:9;4854:22;4836:50;:::i;:::-;4826:60;;4781:115;4582:321;;;;;:::o;4909:407::-;4977:6;4985;5034:2;5022:9;5013:7;5009:23;5005:32;5002:2;;;5050:1;5047;5040:12;5002:2;5093:1;5118:53;5163:7;5154:6;5143:9;5139:22;5118:53;:::i;:::-;5108:63;;5064:117;5220:2;5246:53;5291:7;5282:6;5271:9;5267:22;5246:53;:::i;:::-;5236:63;;5191:118;4992:324;;;;;:::o;5322:260::-;5380:6;5429:2;5417:9;5408:7;5404:23;5400:32;5397:2;;;5445:1;5442;5435:12;5397:2;5488:1;5513:52;5557:7;5548:6;5537:9;5533:22;5513:52;:::i;:::-;5503:62;;5459:116;5387:195;;;;:::o;5588:282::-;5657:6;5706:2;5694:9;5685:7;5681:23;5677:32;5674:2;;;5722:1;5719;5712:12;5674:2;5765:1;5790:63;5845:7;5836:6;5825:9;5821:22;5790:63;:::i;:::-;5780:73;;5736:127;5664:206;;;;:::o;5876:375::-;5945:6;5994:2;5982:9;5973:7;5969:23;5965:32;5962:2;;;6010:1;6007;6000:12;5962:2;6081:1;6070:9;6066:17;6053:31;6111:18;6103:6;6100:30;6097:2;;;6143:1;6140;6133:12;6097:2;6171:63;6226:7;6217:6;6206:9;6202:22;6171:63;:::i;:::-;6161:73;;6024:220;5952:299;;;;:::o;6257:262::-;6316:6;6365:2;6353:9;6344:7;6340:23;6336:32;6333:2;;;6381:1;6378;6371:12;6333:2;6424:1;6449:53;6494:7;6485:6;6474:9;6470:22;6449:53;:::i;:::-;6439:63;;6395:117;6323:196;;;;:::o;6525:407::-;6593:6;6601;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6666:1;6663;6656:12;6618:2;6709:1;6734:53;6779:7;6770:6;6759:9;6755:22;6734:53;:::i;:::-;6724:63;;6680:117;6836:2;6862:53;6907:7;6898:6;6887:9;6883:22;6862:53;:::i;:::-;6852:63;;6807:118;6608:324;;;;;:::o;6938:142::-;7041:32;7067:5;7041:32;:::i;:::-;7036:3;7029:45;7019:61;;:::o;7086:118::-;7173:24;7191:5;7173:24;:::i;:::-;7168:3;7161:37;7151:53;;:::o;7210:109::-;7291:21;7306:5;7291:21;:::i;:::-;7286:3;7279:34;7269:50;;:::o;7325:360::-;7411:3;7439:38;7471:5;7439:38;:::i;:::-;7493:70;7556:6;7551:3;7493:70;:::i;:::-;7486:77;;7572:52;7617:6;7612:3;7605:4;7598:5;7594:16;7572:52;:::i;:::-;7649:29;7671:6;7649:29;:::i;:::-;7644:3;7640:39;7633:46;;7415:270;;;;;:::o;7691:161::-;7793:52;7839:5;7793:52;:::i;:::-;7788:3;7781:65;7771:81;;:::o;7858:364::-;7946:3;7974:39;8007:5;7974:39;:::i;:::-;8029:71;8093:6;8088:3;8029:71;:::i;:::-;8022:78;;8109:52;8154:6;8149:3;8142:4;8135:5;8131:16;8109:52;:::i;:::-;8186:29;8208:6;8186:29;:::i;:::-;8181:3;8177:39;8170:46;;7950:272;;;;;:::o;8228:377::-;8334:3;8362:39;8395:5;8362:39;:::i;:::-;8417:89;8499:6;8494:3;8417:89;:::i;:::-;8410:96;;8515:52;8560:6;8555:3;8548:4;8541:5;8537:16;8515:52;:::i;:::-;8592:6;8587:3;8583:16;8576:23;;8338:267;;;;;:::o;8611:366::-;8753:3;8774:67;8838:2;8833:3;8774:67;:::i;:::-;8767:74;;8850:93;8939:3;8850:93;:::i;:::-;8968:2;8963:3;8959:12;8952:19;;8757:220;;;:::o;8983:366::-;9125:3;9146:67;9210:2;9205:3;9146:67;:::i;:::-;9139:74;;9222:93;9311:3;9222:93;:::i;:::-;9340:2;9335:3;9331:12;9324:19;;9129:220;;;:::o;9355:366::-;9497:3;9518:67;9582:2;9577:3;9518:67;:::i;:::-;9511:74;;9594:93;9683:3;9594:93;:::i;:::-;9712:2;9707:3;9703:12;9696:19;;9501:220;;;:::o;9727:366::-;9869:3;9890:67;9954:2;9949:3;9890:67;:::i;:::-;9883:74;;9966:93;10055:3;9966:93;:::i;:::-;10084:2;10079:3;10075:12;10068:19;;9873:220;;;:::o;10099:366::-;10241:3;10262:67;10326:2;10321:3;10262:67;:::i;:::-;10255:74;;10338:93;10427:3;10338:93;:::i;:::-;10456:2;10451:3;10447:12;10440:19;;10245:220;;;:::o;10471:366::-;10613:3;10634:67;10698:2;10693:3;10634:67;:::i;:::-;10627:74;;10710:93;10799:3;10710:93;:::i;:::-;10828:2;10823:3;10819:12;10812:19;;10617:220;;;:::o;10843:366::-;10985:3;11006:67;11070:2;11065:3;11006:67;:::i;:::-;10999:74;;11082:93;11171:3;11082:93;:::i;:::-;11200:2;11195:3;11191:12;11184:19;;10989:220;;;:::o;11215:366::-;11357:3;11378:67;11442:2;11437:3;11378:67;:::i;:::-;11371:74;;11454:93;11543:3;11454:93;:::i;:::-;11572:2;11567:3;11563:12;11556:19;;11361:220;;;:::o;11587:366::-;11729:3;11750:67;11814:2;11809:3;11750:67;:::i;:::-;11743:74;;11826:93;11915:3;11826:93;:::i;:::-;11944:2;11939:3;11935:12;11928:19;;11733:220;;;:::o;11959:366::-;12101:3;12122:67;12186:2;12181:3;12122:67;:::i;:::-;12115:74;;12198:93;12287:3;12198:93;:::i;:::-;12316:2;12311:3;12307:12;12300:19;;12105:220;;;:::o;12331:366::-;12473:3;12494:67;12558:2;12553:3;12494:67;:::i;:::-;12487:74;;12570:93;12659:3;12570:93;:::i;:::-;12688:2;12683:3;12679:12;12672:19;;12477:220;;;:::o;12703:366::-;12845:3;12866:67;12930:2;12925:3;12866:67;:::i;:::-;12859:74;;12942:93;13031:3;12942:93;:::i;:::-;13060:2;13055:3;13051:12;13044:19;;12849:220;;;:::o;13075:366::-;13217:3;13238:67;13302:2;13297:3;13238:67;:::i;:::-;13231:74;;13314:93;13403:3;13314:93;:::i;:::-;13432:2;13427:3;13423:12;13416:19;;13221:220;;;:::o;13447:366::-;13589:3;13610:67;13674:2;13669:3;13610:67;:::i;:::-;13603:74;;13686:93;13775:3;13686:93;:::i;:::-;13804:2;13799:3;13795:12;13788:19;;13593:220;;;:::o;13819:366::-;13961:3;13982:67;14046:2;14041:3;13982:67;:::i;:::-;13975:74;;14058:93;14147:3;14058:93;:::i;:::-;14176:2;14171:3;14167:12;14160:19;;13965:220;;;:::o;14191:366::-;14333:3;14354:67;14418:2;14413:3;14354:67;:::i;:::-;14347:74;;14430:93;14519:3;14430:93;:::i;:::-;14548:2;14543:3;14539:12;14532:19;;14337:220;;;:::o;14563:366::-;14705:3;14726:67;14790:2;14785:3;14726:67;:::i;:::-;14719:74;;14802:93;14891:3;14802:93;:::i;:::-;14920:2;14915:3;14911:12;14904:19;;14709:220;;;:::o;14935:366::-;15077:3;15098:67;15162:2;15157:3;15098:67;:::i;:::-;15091:74;;15174:93;15263:3;15174:93;:::i;:::-;15292:2;15287:3;15283:12;15276:19;;15081:220;;;:::o;15307:366::-;15449:3;15470:67;15534:2;15529:3;15470:67;:::i;:::-;15463:74;;15546:93;15635:3;15546:93;:::i;:::-;15664:2;15659:3;15655:12;15648:19;;15453:220;;;:::o;15679:366::-;15821:3;15842:67;15906:2;15901:3;15842:67;:::i;:::-;15835:74;;15918:93;16007:3;15918:93;:::i;:::-;16036:2;16031:3;16027:12;16020:19;;15825:220;;;:::o;16051:366::-;16193:3;16214:67;16278:2;16273:3;16214:67;:::i;:::-;16207:74;;16290:93;16379:3;16290:93;:::i;:::-;16408:2;16403:3;16399:12;16392:19;;16197:220;;;:::o;16423:366::-;16565:3;16586:67;16650:2;16645:3;16586:67;:::i;:::-;16579:74;;16662:93;16751:3;16662:93;:::i;:::-;16780:2;16775:3;16771:12;16764:19;;16569:220;;;:::o;16795:366::-;16937:3;16958:67;17022:2;17017:3;16958:67;:::i;:::-;16951:74;;17034:93;17123:3;17034:93;:::i;:::-;17152:2;17147:3;17143:12;17136:19;;16941:220;;;:::o;17167:366::-;17309:3;17330:67;17394:2;17389:3;17330:67;:::i;:::-;17323:74;;17406:93;17495:3;17406:93;:::i;:::-;17524:2;17519:3;17515:12;17508:19;;17313:220;;;:::o;17539:366::-;17681:3;17702:67;17766:2;17761:3;17702:67;:::i;:::-;17695:74;;17778:93;17867:3;17778:93;:::i;:::-;17896:2;17891:3;17887:12;17880:19;;17685:220;;;:::o;17911:366::-;18053:3;18074:67;18138:2;18133:3;18074:67;:::i;:::-;18067:74;;18150:93;18239:3;18150:93;:::i;:::-;18268:2;18263:3;18259:12;18252:19;;18057:220;;;:::o;18283:366::-;18425:3;18446:67;18510:2;18505:3;18446:67;:::i;:::-;18439:74;;18522:93;18611:3;18522:93;:::i;:::-;18640:2;18635:3;18631:12;18624:19;;18429:220;;;:::o;18655:366::-;18797:3;18818:67;18882:2;18877:3;18818:67;:::i;:::-;18811:74;;18894:93;18983:3;18894:93;:::i;:::-;19012:2;19007:3;19003:12;18996:19;;18801:220;;;:::o;19027:366::-;19169:3;19190:67;19254:2;19249:3;19190:67;:::i;:::-;19183:74;;19266:93;19355:3;19266:93;:::i;:::-;19384:2;19379:3;19375:12;19368:19;;19173:220;;;:::o;19399:118::-;19486:24;19504:5;19486:24;:::i;:::-;19481:3;19474:37;19464:53;;:::o;19523:595::-;19751:3;19773:95;19864:3;19855:6;19773:95;:::i;:::-;19766:102;;19885:95;19976:3;19967:6;19885:95;:::i;:::-;19878:102;;19997:95;20088:3;20079:6;19997:95;:::i;:::-;19990:102;;20109:3;20102:10;;19755:363;;;;;;:::o;20124:222::-;20217:4;20255:2;20244:9;20240:18;20232:26;;20268:71;20336:1;20325:9;20321:17;20312:6;20268:71;:::i;:::-;20222:124;;;;:::o;20352:254::-;20461:4;20499:2;20488:9;20484:18;20476:26;;20512:87;20596:1;20585:9;20581:17;20572:6;20512:87;:::i;:::-;20466:140;;;;:::o;20612:640::-;20807:4;20845:3;20834:9;20830:19;20822:27;;20859:71;20927:1;20916:9;20912:17;20903:6;20859:71;:::i;:::-;20940:72;21008:2;20997:9;20993:18;20984:6;20940:72;:::i;:::-;21022;21090:2;21079:9;21075:18;21066:6;21022:72;:::i;:::-;21141:9;21135:4;21131:20;21126:2;21115:9;21111:18;21104:48;21169:76;21240:4;21231:6;21169:76;:::i;:::-;21161:84;;20812:440;;;;;;;:::o;21258:210::-;21345:4;21383:2;21372:9;21368:18;21360:26;;21396:65;21458:1;21447:9;21443:17;21434:6;21396:65;:::i;:::-;21350:118;;;;:::o;21474:252::-;21582:4;21620:2;21609:9;21605:18;21597:26;;21633:86;21716:1;21705:9;21701:17;21692:6;21633:86;:::i;:::-;21587:139;;;;:::o;21732:313::-;21845:4;21883:2;21872:9;21868:18;21860:26;;21932:9;21926:4;21922:20;21918:1;21907:9;21903:17;21896:47;21960:78;22033:4;22024:6;21960:78;:::i;:::-;21952:86;;21850:195;;;;:::o;22051:419::-;22217:4;22255:2;22244:9;22240:18;22232:26;;22304:9;22298:4;22294:20;22290:1;22279:9;22275:17;22268:47;22332:131;22458:4;22332:131;:::i;:::-;22324:139;;22222:248;;;:::o;22476:419::-;22642:4;22680:2;22669:9;22665:18;22657:26;;22729:9;22723:4;22719:20;22715:1;22704:9;22700:17;22693:47;22757:131;22883:4;22757:131;:::i;:::-;22749:139;;22647:248;;;:::o;22901:419::-;23067:4;23105:2;23094:9;23090:18;23082:26;;23154:9;23148:4;23144:20;23140:1;23129:9;23125:17;23118:47;23182:131;23308:4;23182:131;:::i;:::-;23174:139;;23072:248;;;:::o;23326:419::-;23492:4;23530:2;23519:9;23515:18;23507:26;;23579:9;23573:4;23569:20;23565:1;23554:9;23550:17;23543:47;23607:131;23733:4;23607:131;:::i;:::-;23599:139;;23497:248;;;:::o;23751:419::-;23917:4;23955:2;23944:9;23940:18;23932:26;;24004:9;23998:4;23994:20;23990:1;23979:9;23975:17;23968:47;24032:131;24158:4;24032:131;:::i;:::-;24024:139;;23922:248;;;:::o;24176:419::-;24342:4;24380:2;24369:9;24365:18;24357:26;;24429:9;24423:4;24419:20;24415:1;24404:9;24400:17;24393:47;24457:131;24583:4;24457:131;:::i;:::-;24449:139;;24347:248;;;:::o;24601:419::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24772:248;;;:::o;25026:419::-;25192:4;25230:2;25219:9;25215:18;25207:26;;25279:9;25273:4;25269:20;25265:1;25254:9;25250:17;25243:47;25307:131;25433:4;25307:131;:::i;:::-;25299:139;;25197:248;;;:::o;25451:419::-;25617:4;25655:2;25644:9;25640:18;25632:26;;25704:9;25698:4;25694:20;25690:1;25679:9;25675:17;25668:47;25732:131;25858:4;25732:131;:::i;:::-;25724:139;;25622:248;;;:::o;25876:419::-;26042:4;26080:2;26069:9;26065:18;26057:26;;26129:9;26123:4;26119:20;26115:1;26104:9;26100:17;26093:47;26157:131;26283:4;26157:131;:::i;:::-;26149:139;;26047:248;;;:::o;26301:419::-;26467:4;26505:2;26494:9;26490:18;26482:26;;26554:9;26548:4;26544:20;26540:1;26529:9;26525:17;26518:47;26582:131;26708:4;26582:131;:::i;:::-;26574:139;;26472:248;;;:::o;26726:419::-;26892:4;26930:2;26919:9;26915:18;26907:26;;26979:9;26973:4;26969:20;26965:1;26954:9;26950:17;26943:47;27007:131;27133:4;27007:131;:::i;:::-;26999:139;;26897:248;;;:::o;27151:419::-;27317:4;27355:2;27344:9;27340:18;27332:26;;27404:9;27398:4;27394:20;27390:1;27379:9;27375:17;27368:47;27432:131;27558:4;27432:131;:::i;:::-;27424:139;;27322:248;;;:::o;27576:419::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27829:9;27823:4;27819:20;27815:1;27804:9;27800:17;27793:47;27857:131;27983:4;27857:131;:::i;:::-;27849:139;;27747:248;;;:::o;28001:419::-;28167:4;28205:2;28194:9;28190:18;28182:26;;28254:9;28248:4;28244:20;28240:1;28229:9;28225:17;28218:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28172:248;;;:::o;28426:419::-;28592:4;28630:2;28619:9;28615:18;28607:26;;28679:9;28673:4;28669:20;28665:1;28654:9;28650:17;28643:47;28707:131;28833:4;28707:131;:::i;:::-;28699:139;;28597:248;;;:::o;28851:419::-;29017:4;29055:2;29044:9;29040:18;29032:26;;29104:9;29098:4;29094:20;29090:1;29079:9;29075:17;29068:47;29132:131;29258:4;29132:131;:::i;:::-;29124:139;;29022:248;;;:::o;29276:419::-;29442:4;29480:2;29469:9;29465:18;29457:26;;29529:9;29523:4;29519:20;29515:1;29504:9;29500:17;29493:47;29557:131;29683:4;29557:131;:::i;:::-;29549:139;;29447:248;;;:::o;29701:419::-;29867:4;29905:2;29894:9;29890:18;29882:26;;29954:9;29948:4;29944:20;29940:1;29929:9;29925:17;29918:47;29982:131;30108:4;29982:131;:::i;:::-;29974:139;;29872:248;;;:::o;30126:419::-;30292:4;30330:2;30319:9;30315:18;30307:26;;30379:9;30373:4;30369:20;30365:1;30354:9;30350:17;30343:47;30407:131;30533:4;30407:131;:::i;:::-;30399:139;;30297:248;;;:::o;30551:419::-;30717:4;30755:2;30744:9;30740:18;30732:26;;30804:9;30798:4;30794:20;30790:1;30779:9;30775:17;30768:47;30832:131;30958:4;30832:131;:::i;:::-;30824:139;;30722:248;;;:::o;30976:419::-;31142:4;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;31147:248;;;:::o;31401:419::-;31567:4;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31572:248;;;:::o;31826:419::-;31992:4;32030:2;32019:9;32015:18;32007:26;;32079:9;32073:4;32069:20;32065:1;32054:9;32050:17;32043:47;32107:131;32233:4;32107:131;:::i;:::-;32099:139;;31997:248;;;:::o;32251:419::-;32417:4;32455:2;32444:9;32440:18;32432:26;;32504:9;32498:4;32494:20;32490:1;32479:9;32475:17;32468:47;32532:131;32658:4;32532:131;:::i;:::-;32524:139;;32422:248;;;:::o;32676:419::-;32842:4;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32847:248;;;:::o;33101:419::-;33267:4;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33272:248;;;:::o;33526:419::-;33692:4;33730:2;33719:9;33715:18;33707:26;;33779:9;33773:4;33769:20;33765:1;33754:9;33750:17;33743:47;33807:131;33933:4;33807:131;:::i;:::-;33799:139;;33697:248;;;:::o;33951:419::-;34117:4;34155:2;34144:9;34140:18;34132:26;;34204:9;34198:4;34194:20;34190:1;34179:9;34175:17;34168:47;34232:131;34358:4;34232:131;:::i;:::-;34224:139;;34122:248;;;:::o;34376:222::-;34469:4;34507:2;34496:9;34492:18;34484:26;;34520:71;34588:1;34577:9;34573:17;34564:6;34520:71;:::i;:::-;34474:124;;;;:::o;34604:129::-;34638:6;34665:20;;:::i;:::-;34655:30;;34694:33;34722:4;34714:6;34694:33;:::i;:::-;34645:88;;;:::o;34739:75::-;34772:6;34805:2;34799:9;34789:19;;34779:35;:::o;34820:307::-;34881:4;34971:18;34963:6;34960:30;34957:2;;;34993:18;;:::i;:::-;34957:2;35031:29;35053:6;35031:29;:::i;:::-;35023:37;;35115:4;35109;35105:15;35097:23;;34886:241;;;:::o;35133:308::-;35195:4;35285:18;35277:6;35274:30;35271:2;;;35307:18;;:::i;:::-;35271:2;35345:29;35367:6;35345:29;:::i;:::-;35337:37;;35429:4;35423;35419:15;35411:23;;35200:241;;;:::o;35447:98::-;35498:6;35532:5;35526:12;35516:22;;35505:40;;;:::o;35551:99::-;35603:6;35637:5;35631:12;35621:22;;35610:40;;;:::o;35656:168::-;35739:11;35773:6;35768:3;35761:19;35813:4;35808:3;35804:14;35789:29;;35751:73;;;;:::o;35830:169::-;35914:11;35948:6;35943:3;35936:19;35988:4;35983:3;35979:14;35964:29;;35926:73;;;;:::o;36005:148::-;36107:11;36144:3;36129:18;;36119:34;;;;:::o;36159:305::-;36199:3;36218:20;36236:1;36218:20;:::i;:::-;36213:25;;36252:20;36270:1;36252:20;:::i;:::-;36247:25;;36406:1;36338:66;36334:74;36331:1;36328:81;36325:2;;;36412:18;;:::i;:::-;36325:2;36456:1;36453;36449:9;36442:16;;36203:261;;;;:::o;36470:185::-;36510:1;36527:20;36545:1;36527:20;:::i;:::-;36522:25;;36561:20;36579:1;36561:20;:::i;:::-;36556:25;;36600:1;36590:2;;36605:18;;:::i;:::-;36590:2;36647:1;36644;36640:9;36635:14;;36512:143;;;;:::o;36661:348::-;36701:7;36724:20;36742:1;36724:20;:::i;:::-;36719:25;;36758:20;36776:1;36758:20;:::i;:::-;36753:25;;36946:1;36878:66;36874:74;36871:1;36868:81;36863:1;36856:9;36849:17;36845:105;36842:2;;;36953:18;;:::i;:::-;36842:2;37001:1;36998;36994:9;36983:20;;36709:300;;;;:::o;37015:191::-;37055:4;37075:20;37093:1;37075:20;:::i;:::-;37070:25;;37109:20;37127:1;37109:20;:::i;:::-;37104:25;;37148:1;37145;37142:8;37139:2;;;37153:18;;:::i;:::-;37139:2;37198:1;37195;37191:9;37183:17;;37060:146;;;;:::o;37212:96::-;37249:7;37278:24;37296:5;37278:24;:::i;:::-;37267:35;;37257:51;;;:::o;37314:104::-;37359:7;37388:24;37406:5;37388:24;:::i;:::-;37377:35;;37367:51;;;:::o;37424:90::-;37458:7;37501:5;37494:13;37487:21;37476:32;;37466:48;;;:::o;37520:149::-;37556:7;37596:66;37589:5;37585:78;37574:89;;37564:105;;;:::o;37675:126::-;37712:7;37752:42;37745:5;37741:54;37730:65;;37720:81;;;:::o;37807:77::-;37844:7;37873:5;37862:16;;37852:32;;;:::o;37890:156::-;37955:9;37988:52;38034:5;37988:52;:::i;:::-;37975:65;;37965:81;;;:::o;38052:128::-;38117:9;38150:24;38168:5;38150:24;:::i;:::-;38137:37;;38127:53;;;:::o;38186:154::-;38270:6;38265:3;38260;38247:30;38332:1;38323:6;38318:3;38314:16;38307:27;38237:103;;;:::o;38346:307::-;38414:1;38424:113;38438:6;38435:1;38432:13;38424:113;;;38523:1;38518:3;38514:11;38508:18;38504:1;38499:3;38495:11;38488:39;38460:2;38457:1;38453:10;38448:15;;38424:113;;;38555:6;38552:1;38549:13;38546:2;;;38635:1;38626:6;38621:3;38617:16;38610:27;38546:2;38395:258;;;;:::o;38659:320::-;38703:6;38740:1;38734:4;38730:12;38720:22;;38787:1;38781:4;38777:12;38808:18;38798:2;;38864:4;38856:6;38852:17;38842:27;;38798:2;38926;38918:6;38915:14;38895:18;38892:38;38889:2;;;38945:18;;:::i;:::-;38889:2;38710:269;;;;:::o;38985:281::-;39068:27;39090:4;39068:27;:::i;:::-;39060:6;39056:40;39198:6;39186:10;39183:22;39162:18;39150:10;39147:34;39144:62;39141:2;;;39209:18;;:::i;:::-;39141:2;39249:10;39245:2;39238:22;39028:238;;;:::o;39272:233::-;39311:3;39334:24;39352:5;39334:24;:::i;:::-;39325:33;;39380:66;39373:5;39370:77;39367:2;;;39450:18;;:::i;:::-;39367:2;39497:1;39490:5;39486:13;39479:20;;39315:190;;;:::o;39511:176::-;39543:1;39560:20;39578:1;39560:20;:::i;:::-;39555:25;;39594:20;39612:1;39594:20;:::i;:::-;39589:25;;39633:1;39623:2;;39638:18;;:::i;:::-;39623:2;39679:1;39676;39672:9;39667:14;;39545:142;;;;:::o;39693:180::-;39741:77;39738:1;39731:88;39838:4;39835:1;39828:15;39862:4;39859:1;39852:15;39879:180;39927:77;39924:1;39917:88;40024:4;40021:1;40014:15;40048:4;40045:1;40038:15;40065:180;40113:77;40110:1;40103:88;40210:4;40207:1;40200:15;40234:4;40231:1;40224:15;40251:180;40299:77;40296:1;40289:88;40396:4;40393:1;40386:15;40420:4;40417:1;40410:15;40437:102;40478:6;40529:2;40525:7;40520:2;40513:5;40509:14;40505:28;40495:38;;40485:54;;;:::o;40545:230::-;40685:34;40681:1;40673:6;40669:14;40662:58;40754:13;40749:2;40741:6;40737:15;40730:38;40651:124;:::o;40781:237::-;40921:34;40917:1;40909:6;40905:14;40898:58;40990:20;40985:2;40977:6;40973:15;40966:45;40887:131;:::o;41024:225::-;41164:34;41160:1;41152:6;41148:14;41141:58;41233:8;41228:2;41220:6;41216:15;41209:33;41130:119;:::o;41255:178::-;41395:30;41391:1;41383:6;41379:14;41372:54;41361:72;:::o;41439:223::-;41579:34;41575:1;41567:6;41563:14;41556:58;41648:6;41643:2;41635:6;41631:15;41624:31;41545:117;:::o;41668:175::-;41808:27;41804:1;41796:6;41792:14;41785:51;41774:69;:::o;41849:231::-;41989:34;41985:1;41977:6;41973:14;41966:58;42058:14;42053:2;42045:6;42041:15;42034:39;41955:125;:::o;42086:237::-;42226:34;42222:1;42214:6;42210:14;42203:58;42295:20;42290:2;42282:6;42278:15;42271:45;42192:131;:::o;42329:225::-;42469:34;42465:1;42457:6;42453:14;42446:58;42538:8;42533:2;42525:6;42521:15;42514:33;42435:119;:::o;42560:224::-;42700:34;42696:1;42688:6;42684:14;42677:58;42769:7;42764:2;42756:6;42752:15;42745:32;42666:118;:::o;42790:243::-;42930:34;42926:1;42918:6;42914:14;42907:58;42999:26;42994:2;42986:6;42982:15;42975:51;42896:137;:::o;43039:229::-;43179:34;43175:1;43167:6;43163:14;43156:58;43248:12;43243:2;43235:6;43231:15;43224:37;43145:123;:::o;43274:228::-;43414:34;43410:1;43402:6;43398:14;43391:58;43483:11;43478:2;43470:6;43466:15;43459:36;43380:122;:::o;43508:182::-;43648:34;43644:1;43636:6;43632:14;43625:58;43614:76;:::o;43696:227::-;43836:34;43832:1;43824:6;43820:14;43813:58;43905:10;43900:2;43892:6;43888:15;43881:35;43802:121;:::o;43929:223::-;44069:34;44065:1;44057:6;44053:14;44046:58;44138:6;44133:2;44125:6;44121:15;44114:31;44035:117;:::o;44158:231::-;44298:34;44294:1;44286:6;44282:14;44275:58;44367:14;44362:2;44354:6;44350:15;44343:39;44264:125;:::o;44395:182::-;44535:34;44531:1;44523:6;44519:14;44512:58;44501:76;:::o;44583:228::-;44723:34;44719:1;44711:6;44707:14;44700:58;44792:11;44787:2;44779:6;44775:15;44768:36;44689:122;:::o;44817:234::-;44957:34;44953:1;44945:6;44941:14;44934:58;45026:17;45021:2;45013:6;45009:15;45002:42;44923:128;:::o;45057:230::-;45197:34;45193:1;45185:6;45181:14;45174:58;45266:13;45261:2;45253:6;45249:15;45242:38;45163:124;:::o;45293:220::-;45433:34;45429:1;45421:6;45417:14;45410:58;45502:3;45497:2;45489:6;45485:15;45478:28;45399:114;:::o;45519:236::-;45659:34;45655:1;45647:6;45643:14;45636:58;45728:19;45723:2;45715:6;45711:15;45704:44;45625:130;:::o;45761:231::-;45901:34;45897:1;45889:6;45885:14;45878:58;45970:14;45965:2;45957:6;45953:15;45946:39;45867:125;:::o;45998:166::-;46138:18;46134:1;46126:6;46122:14;46115:42;46104:60;:::o;46170:224::-;46310:34;46306:1;46298:6;46294:14;46287:58;46379:7;46374:2;46366:6;46362:15;46355:32;46276:118;:::o;46400:181::-;46540:33;46536:1;46528:6;46524:14;46517:57;46506:75;:::o;46587:182::-;46727:34;46723:1;46715:6;46711:14;46704:58;46693:76;:::o;46775:230::-;46915:34;46911:1;46903:6;46899:14;46892:58;46984:13;46979:2;46971:6;46967:15;46960:38;46881:124;:::o;47011:122::-;47084:24;47102:5;47084:24;:::i;:::-;47077:5;47074:35;47064:2;;47123:1;47120;47113:12;47064:2;47054:79;:::o;47139:116::-;47209:21;47224:5;47209:21;:::i;:::-;47202:5;47199:32;47189:2;;47245:1;47242;47235:12;47189:2;47179:76;:::o;47261:120::-;47333:23;47350:5;47333:23;:::i;:::-;47326:5;47323:34;47313:2;;47371:1;47368;47361:12;47313:2;47303:78;:::o;47387:122::-;47460:24;47478:5;47460:24;:::i;:::-;47453:5;47450:35;47440:2;;47499:1;47496;47489:12;47440:2;47430:79;:::o
Swarm Source
ipfs://bae9643446eac25a59c32a2a333c4010754044d9a72f020907f58663e809866a
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.