ERC-721
Overview
Max Total Supply
812 BPYC
Holders
357
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
12 BPYCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BoredPunkYachtClub
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-07 */ // SPDX-License-Identifier: GPL-3.0 /** Created by 0xfoobar in collab with Bored Punk Yacht Club ________ ________ ________ _______ ________ ________ ___ ___ ________ ___ __ ___ ___ ________ ________ ___ ___ _________ ________ ___ ___ ___ ________ |\ __ \|\ __ \|\ __ \|\ ___ \ |\ ___ \ |\ __ \|\ \|\ \|\ ___ \|\ \|\ \ |\ \ / /|\ __ \|\ ____\|\ \|\ \|\___ ___\ |\ ____\|\ \ |\ \|\ \|\ __ \ \ \ \|\ /\ \ \|\ \ \ \|\ \ \ __/|\ \ \_|\ \ \ \ \|\ \ \ \\\ \ \ \\ \ \ \ \/ /|_ \ \ \/ / | \ \|\ \ \ \___|\ \ \\\ \|___ \ \_| \ \ \___|\ \ \ \ \ \\\ \ \ \|\ /_ \ \ __ \ \ \\\ \ \ _ _\ \ \_|/_\ \ \ \\ \ \ \ ____\ \ \\\ \ \ \\ \ \ \ ___ \ \ \ / / \ \ __ \ \ \ \ \ __ \ \ \ \ \ \ \ \ \ \ \ \ \\\ \ \ __ \ \ \ \|\ \ \ \\\ \ \ \\ \\ \ \_|\ \ \ \_\\ \ \ \ \___|\ \ \\\ \ \ \\ \ \ \ \\ \ \ \/ / / \ \ \ \ \ \ \____\ \ \ \ \ \ \ \ \ \ \____\ \ \____\ \ \\\ \ \ \|\ \ \ \_______\ \_______\ \__\\ _\\ \_______\ \_______\ \ \__\ \ \_______\ \__\\ \__\ \__\\ \__\ __/ / / \ \__\ \__\ \_______\ \__\ \__\ \ \__\ \ \_______\ \_______\ \_______\ \_______\ \|_______|\|_______|\|__|\|__|\|_______|\|_______| \|__| \|_______|\|__| \|__|\|__| \|__| |\___/ / \|__|\|__|\|_______|\|__|\|__| \|__| \|_______|\|_______|\|_______|\|_______| \|___|/ */ // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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 { } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: contracts/BoredPunk.sol pragma solidity ^0.8.4; interface IERC20 { function currentSupply() external view returns (uint); function balanceOf(address tokenOwner) external view returns (uint balance); function allowance(address tokenOwner, address spender) external view returns (uint remaining); function transfer(address to, uint tokens) external returns (bool success); function approve(address spender, uint tokens) external returns (bool success); function transferFrom(address from, address to, uint tokens) external returns (bool success); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); } interface Opensea { function balanceOf(address tokenOwner, uint tokenId) external view returns (bool); function safeTransferFrom(address _from, address _to, uint _id, uint _value, bytes memory _data) external; } contract BoredPunkYachtClub is ERC721, Ownable { event Mint(address indexed _to, uint indexed _tokenId); bytes32 public merkleRoot = ""; // Construct this from (oldId, newId) tuple elements address public openseaSharedAddress = 0x495f947276749Ce646f68AC8c248420045cb7b5e; address public burnAddress = 0x000000000000000000000000000000000000dEaD; uint public maxSupply = 888; // Maximum tokens that can be minted uint public totalSupply = 0; // This is our mint counter as well string public _baseTokenURI; // Royalty variables below uint public spoofInitBalance = 1 ether; uint constant public PRECISION = 1000000; // million uint public curMul = 1 * PRECISION; mapping(uint => uint) public tokenMultipliers; // Maps token id to last withdrawal multiplier constructor() payable ERC721("BoredPunkYachtClub", "BPYC") {} receive() external payable { // As of July 2021, OpenSea distributes royalties if the gas fee is less than 0.04 eth curMul += (msg.value * PRECISION) / (spoofInitBalance * totalSupply); // This could round down to 0 if not careful; only greater if msg.value > 0.001 eth } function claimMultipleRewards(uint[] memory tokenIds) public { for (uint i = 0; i < tokenIds.length; i++) { claimRewards(tokenIds[i]); } } function claimRewards(uint tokenId) public { address tokenOwner = ownerOf(tokenId); // require(tokenOwner == msg.sender, "Only tokenholder can claim rewards"); uint weiReward = (curMul - tokenMultipliers[tokenId]) * spoofInitBalance / PRECISION; tokenMultipliers[tokenId] = curMul; (bool success,) = tokenOwner.call{value: weiReward}(""); require(success, "Failed to send ether"); } function mintAndBurn(uint256 oldId, uint256 newId, bytes32 leaf, bytes32[] memory proof) external { // Don't allow reminting require(!_exists(newId), "Token already minted"); // Verify that (oldId, newId) correspond to the Merkle leaf require(keccak256(abi.encodePacked(oldId, newId)) == leaf, "Ids don't match Merkle leaf"); // Verify that (oldId, newId) is a valid pair in the Merkle tree require(verify(merkleRoot, leaf, proof), "Not a valid element in the Merkle tree"); // Verify that msg.sender is the owner of the old token require(Opensea(openseaSharedAddress).balanceOf(msg.sender, oldId), "Only token owner can mintAndBurn"); // Error coming here // Transfer the old OpenSea Shared Storefront token to this contract (with ability for owner to retrieve in case of error) Opensea(openseaSharedAddress).safeTransferFrom(msg.sender, burnAddress, oldId, 1, ""); // Mint new token _mint(msg.sender, newId); emit Mint(msg.sender, newId); totalSupply += 1; // Initialize the rewards multiplier tokenMultipliers[newId] = curMul; } function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) public returns (bytes4) { return 0xf0b9e5ba; } function verify(bytes32 root, bytes32 leaf, bytes32[] memory proof) public pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } /** * @dev Returns a URI for a given token ID's metadata */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId))); } /** * @dev Updates the base token URI for the metadata */ function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner { _baseTokenURI = __baseTokenURI; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","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":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Mint","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":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimMultipleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"curMul","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"oldId","type":"uint256"},{"internalType":"uint256","name":"newId","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openseaSharedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spoofInitBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMultipliers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600060075573495f947276749ce646f68ac8c248420045cb7b5e600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610378600a556000600b55670de0b6b3a7640000600d55620f42406001620000ca9190620002dc565b600e556040518060400160405280601281526020017f426f72656450756e6b5961636874436c756200000000000000000000000000008152506040518060400160405280600481526020017f42505943000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001519291906200022c565b5080600190805190602001906200016a9291906200022c565b50505060006200017f6200022460201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620003db565b600033905090565b8280546200023a9062000347565b90600052602060002090601f0160209004810192826200025e5760008555620002aa565b82601f106200027957805160ff1916838001178555620002aa565b82800160010185558215620002aa579182015b82811115620002a95782518255916020019190600101906200028c565b5b509050620002b99190620002bd565b5090565b5b80821115620002d8576000816000905550600101620002be565b5090565b6000620002e9826200033d565b9150620002f6836200033d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200033257620003316200037d565b5b828202905092915050565b6000819050919050565b600060028204905060018216806200036057607f821691505b60208210811415620003775762000376620003ac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61416180620003eb6000396000f3fe6080604052600436106101f25760003560e01c80636352211e1161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610749578063cfc86f7b14610786578063d5abeb01146107b1578063e985e9c5146107dc578063f2fde38b146108195761023a565b8063a22cb465146106a1578063aaf5eb68146106ca578063b48aff39146106f5578063b88d4fde146107205761023a565b8063729d0a8a116100dc578063729d0a8a146105f95780637cb64759146106225780638da5cb5b1461064b57806395d89b41146106765761023a565b80636352211e1461053d57806370a082311461057a57806370d5ae05146105b7578063715018a6146105e25761023a565b806316d8c5ef1161018557806330176e131161015457806330176e13146104855780633423e548146104ae5780633bfebe01146104eb57806342842e0e146105145761023a565b806316d8c5ef146103c957806318160ddd1461040657806323b872dd146104315780632eb4a7ab1461045a5761023a565b80630962ef79116101c15780630962ef791461030d5780630f7b90b21461033657806312c1329914610361578063150b7a021461038c5761023a565b806301ffc9a71461023f57806306fdde031461027c578063081812fc146102a7578063095ea7b3146102e45761023a565b3661023a57600b54600d54610207919061389b565b620f424034610216919061389b565b610220919061386a565b600e60008282546102319190613814565b92505081905550005b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190612c68565b610842565b60405161027391906133c4565b60405180910390f35b34801561028857600080fd5b50610291610924565b60405161029e9190613415565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190612cfb565b6109b6565b6040516102db91906132dc565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190612b32565b610a3b565b005b34801561031957600080fd5b50610334600480360381019061032f9190612cfb565b610b53565b005b34801561034257600080fd5b5061034b610c6c565b60405161035891906136b7565b60405180910390f35b34801561036d57600080fd5b50610376610c72565b60405161038391906132dc565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906129fb565b610c98565b6040516103c091906133fa565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612cfb565b610cad565b6040516103fd91906136b7565b60405180910390f35b34801561041257600080fd5b5061041b610cc5565b60405161042891906136b7565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906129ac565b610ccb565b005b34801561046657600080fd5b5061046f610d2b565b60405161047c91906133df565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190612cba565b610d31565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612c01565b610dc7565b6040516104e291906133c4565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612d24565b610ddd565b005b34801561052057600080fd5b5061053b600480360381019061053691906129ac565b611105565b005b34801561054957600080fd5b50610564600480360381019061055f9190612cfb565b611125565b60405161057191906132dc565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612947565b6111d7565b6040516105ae91906136b7565b60405180910390f35b3480156105c357600080fd5b506105cc61128f565b6040516105d991906132dc565b60405180910390f35b3480156105ee57600080fd5b506105f76112b5565b005b34801561060557600080fd5b50610620600480360381019061061b9190612b6e565b6113f2565b005b34801561062e57600080fd5b5061064960048036038101906106449190612bd8565b61145e565b005b34801561065757600080fd5b506106606114e4565b60405161066d91906132dc565b60405180910390f35b34801561068257600080fd5b5061068b61150e565b6040516106989190613415565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612af6565b6115a0565b005b3480156106d657600080fd5b506106df611721565b6040516106ec91906136b7565b60405180910390f35b34801561070157600080fd5b5061070a611728565b60405161071791906136b7565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190612a7b565b61172e565b005b34801561075557600080fd5b50610770600480360381019061076b9190612cfb565b611790565b60405161077d9190613415565b60405180910390f35b34801561079257600080fd5b5061079b6117c4565b6040516107a89190613415565b60405180910390f35b3480156107bd57600080fd5b506107c6611852565b6040516107d391906136b7565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612970565b611858565b60405161081091906133c4565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190612947565b6118ec565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611a98565b5b9050919050565b606060008054610933906139fb565b80601f016020809104026020016040519081016040528092919081815260200182805461095f906139fb565b80156109ac5780601f10610981576101008083540402835291602001916109ac565b820191906000526020600020905b81548152906001019060200180831161098f57829003601f168201915b5050505050905090565b60006109c182611b02565b610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f7906135f7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4682611125565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90613677565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611b6e565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611b6e565b611858565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613577565b60405180910390fd5b610b4e8383611b76565b505050565b6000610b5e82611125565b90506000620f4240600d54600f600086815260200190815260200160002054600e54610b8a91906138f5565b610b94919061389b565b610b9e919061386a565b9050600e54600f60008581526020019081526020016000208190555060008273ffffffffffffffffffffffffffffffffffffffff1682604051610be09061329b565b60006040518083038185875af1925050503d8060008114610c1d576040519150601f19603f3d011682016040523d82523d6000602084013e610c22565b606091505b5050905080610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90613637565b60405180910390fd5b50505050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063f0b9e5ba60e01b905095945050505050565b600f6020528060005260406000206000915090505481565b600b5481565b610cdc610cd6611b6e565b82611c2f565b610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290613697565b60405180910390fd5b610d26838383611d0d565b505050565b60075481565b610d39611b6e565b73ffffffffffffffffffffffffffffffffffffffff16610d576114e4565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613617565b60405180910390fd5b80600c9080519060200190610dc39291906125cb565b5050565b6000610dd4828585611f69565b90509392505050565b610de683611b02565b15610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90613477565b60405180910390fd5b818484604051602001610e3a9291906132b0565b6040516020818303038152906040528051906020012014610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613557565b60405180910390fd5b610e9d6007548383610dc7565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390613457565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33866040518363ffffffff1660e01b8152600401610f3892919061339b565b60206040518083038186803b158015610f5057600080fd5b505afa158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190612baf565b610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90613437565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a33600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760016040518563ffffffff1660e01b815260040161104b9493929190613343565b600060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506110873384612045565b823373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001600b60008282546110de9190613814565b92505081905550600e54600f60008581526020019081526020016000208190555050505050565b6111208383836040518060200160405280600081525061172e565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c5906135b7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613597565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112bd611b6e565b73ffffffffffffffffffffffffffffffffffffffff166112db6114e4565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60005b815181101561145a5761144782828151811061143a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610b53565b808061145290613a5e565b9150506113f5565b5050565b611466611b6e565b73ffffffffffffffffffffffffffffffffffffffff166114846114e4565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613617565b60405180910390fd5b8060078190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461151d906139fb565b80601f0160208091040260200160405190810160405280929190818152602001828054611549906139fb565b80156115965780601f1061156b57610100808354040283529160200191611596565b820191906000526020600020905b81548152906001019060200180831161157957829003601f168201915b5050505050905090565b6115a8611b6e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613517565b60405180910390fd5b8060056000611623611b6e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d0611b6e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171591906133c4565b60405180910390a35050565b620f424081565b600e5481565b61173f611739611b6e565b83611c2f565b61177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590613697565b60405180910390fd5b61178a84848484612213565b50505050565b6060600c61179d8361226f565b6040516020016117ae929190613277565b6040516020818303038152906040529050919050565b600c80546117d1906139fb565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd906139fb565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b505050505081565b600a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118f4611b6e565b73ffffffffffffffffffffffffffffffffffffffff166119126114e4565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906134b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be983611125565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3a82611b02565b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090613537565b60405180910390fd5b6000611c8483611125565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cf357508373ffffffffffffffffffffffffffffffffffffffff16611cdb846109b6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d045750611d038185611858565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2d82611125565b73ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613657565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea906134f7565b60405180910390fd5b611dfe83838361241c565b611e09600082611b76565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5991906138f5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb09190613814565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b8551811015612037576000868281518110611fb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611ff7578281604051602001611fda92919061324b565b604051602081830303815290604052805190602001209250612023565b808360405160200161200a92919061324b565b6040516020818303038152906040528051906020012092505b50808061202f90613a5e565b915050611f72565b508381149150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac906135d7565b60405180910390fd5b6120be81611b02565b156120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906134d7565b60405180910390fd5b61210a6000838361241c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215a9190613814565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61221e848484611d0d565b61222a84848484612421565b612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090613497565b60405180910390fd5b50505050565b606060008214156122b7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612417565b600082905060005b600082146122e95780806122d290613a5e565b915050600a826122e2919061386a565b91506122bf565b60008167ffffffffffffffff81111561232b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561235d5781602001600182028036833780820191505090505b5090505b600085146124105760018261237691906138f5565b9150600a856123859190613abb565b60306123919190613814565b60f81b8183815181106123cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612409919061386a565b9450612361565b8093505050505b919050565b505050565b60006124428473ffffffffffffffffffffffffffffffffffffffff166125b8565b156125ab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261246b611b6e565b8786866040518563ffffffff1660e01b815260040161248d94939291906132f7565b602060405180830381600087803b1580156124a757600080fd5b505af19250505080156124d857506040513d601f19601f820116820180604052508101906124d59190612c91565b60015b61255b573d8060008114612508576040519150601f19603f3d011682016040523d82523d6000602084013e61250d565b606091505b50600081511415612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90613497565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125b0565b600190505b949350505050565b600080823b905060008111915050919050565b8280546125d7906139fb565b90600052602060002090601f0160209004810192826125f95760008555612640565b82601f1061261257805160ff1916838001178555612640565b82800160010185558215612640579182015b8281111561263f578251825591602001919060010190612624565b5b50905061264d9190612651565b5090565b5b8082111561266a576000816000905550600101612652565b5090565b600061268161267c846136f7565b6136d2565b905080838252602082019050828560208602820111156126a057600080fd5b60005b858110156126d057816126b68882612855565b8452602084019350602083019250506001810190506126a3565b5050509392505050565b60006126ed6126e884613723565b6136d2565b9050808382526020820190508285602086028201111561270c57600080fd5b60005b8581101561273c57816127228882612932565b84526020840193506020830192505060018101905061270f565b5050509392505050565b60006127596127548461374f565b6136d2565b90508281526020810184848401111561277157600080fd5b61277c8482856139b9565b509392505050565b600061279761279284613780565b6136d2565b9050828152602081018484840111156127af57600080fd5b6127ba8482856139b9565b509392505050565b6000813590506127d1816140b8565b92915050565b600082601f8301126127e857600080fd5b81356127f884826020860161266e565b91505092915050565b600082601f83011261281257600080fd5b81356128228482602086016126da565b91505092915050565b60008135905061283a816140cf565b92915050565b60008151905061284f816140cf565b92915050565b600081359050612864816140e6565b92915050565b600081359050612879816140fd565b92915050565b60008151905061288e816140fd565b92915050565b60008083601f8401126128a657600080fd5b8235905067ffffffffffffffff8111156128bf57600080fd5b6020830191508360018202830111156128d757600080fd5b9250929050565b600082601f8301126128ef57600080fd5b81356128ff848260208601612746565b91505092915050565b600082601f83011261291957600080fd5b8135612929848260208601612784565b91505092915050565b60008135905061294181614114565b92915050565b60006020828403121561295957600080fd5b6000612967848285016127c2565b91505092915050565b6000806040838503121561298357600080fd5b6000612991858286016127c2565b92505060206129a2858286016127c2565b9150509250929050565b6000806000606084860312156129c157600080fd5b60006129cf868287016127c2565b93505060206129e0868287016127c2565b92505060406129f186828701612932565b9150509250925092565b600080600080600060808688031215612a1357600080fd5b6000612a21888289016127c2565b9550506020612a32888289016127c2565b9450506040612a4388828901612932565b935050606086013567ffffffffffffffff811115612a6057600080fd5b612a6c88828901612894565b92509250509295509295909350565b60008060008060808587031215612a9157600080fd5b6000612a9f878288016127c2565b9450506020612ab0878288016127c2565b9350506040612ac187828801612932565b925050606085013567ffffffffffffffff811115612ade57600080fd5b612aea878288016128de565b91505092959194509250565b60008060408385031215612b0957600080fd5b6000612b17858286016127c2565b9250506020612b288582860161282b565b9150509250929050565b60008060408385031215612b4557600080fd5b6000612b53858286016127c2565b9250506020612b6485828601612932565b9150509250929050565b600060208284031215612b8057600080fd5b600082013567ffffffffffffffff811115612b9a57600080fd5b612ba684828501612801565b91505092915050565b600060208284031215612bc157600080fd5b6000612bcf84828501612840565b91505092915050565b600060208284031215612bea57600080fd5b6000612bf884828501612855565b91505092915050565b600080600060608486031215612c1657600080fd5b6000612c2486828701612855565b9350506020612c3586828701612855565b925050604084013567ffffffffffffffff811115612c5257600080fd5b612c5e868287016127d7565b9150509250925092565b600060208284031215612c7a57600080fd5b6000612c888482850161286a565b91505092915050565b600060208284031215612ca357600080fd5b6000612cb18482850161287f565b91505092915050565b600060208284031215612ccc57600080fd5b600082013567ffffffffffffffff811115612ce657600080fd5b612cf284828501612908565b91505092915050565b600060208284031215612d0d57600080fd5b6000612d1b84828501612932565b91505092915050565b60008060008060808587031215612d3a57600080fd5b6000612d4887828801612932565b9450506020612d5987828801612932565b9350506040612d6a87828801612855565b925050606085013567ffffffffffffffff811115612d8757600080fd5b612d93878288016127d7565b91505092959194509250565b612da881613929565b82525050565b612db78161393b565b82525050565b612dc681613947565b82525050565b612ddd612dd882613947565b613aa7565b82525050565b612dec81613951565b82525050565b6000612dfd826137c6565b612e0781856137dc565b9350612e178185602086016139c8565b612e2081613ba8565b840191505092915050565b612e34816139a7565b82525050565b6000612e45826137d1565b612e4f81856137f8565b9350612e5f8185602086016139c8565b612e6881613ba8565b840191505092915050565b6000612e7e826137d1565b612e888185613809565b9350612e988185602086016139c8565b80840191505092915050565b60008154612eb1816139fb565b612ebb8186613809565b94506001821660008114612ed65760018114612ee757612f1a565b60ff19831686528186019350612f1a565b612ef0856137b1565b60005b83811015612f1257815481890152600182019150602081019050612ef3565b838801955050505b50505092915050565b6000612f306020836137f8565b9150612f3b82613bb9565b602082019050919050565b6000612f536026836137f8565b9150612f5e82613be2565b604082019050919050565b6000612f766014836137f8565b9150612f8182613c31565b602082019050919050565b6000612f996032836137f8565b9150612fa482613c5a565b604082019050919050565b6000612fbc6026836137f8565b9150612fc782613ca9565b604082019050919050565b6000612fdf601c836137f8565b9150612fea82613cf8565b602082019050919050565b60006130026024836137f8565b915061300d82613d21565b604082019050919050565b60006130256019836137f8565b915061303082613d70565b602082019050919050565b6000613048602c836137f8565b915061305382613d99565b604082019050919050565b600061306b601b836137f8565b915061307682613de8565b602082019050919050565b600061308e6038836137f8565b915061309982613e11565b604082019050919050565b60006130b1602a836137f8565b91506130bc82613e60565b604082019050919050565b60006130d46029836137f8565b91506130df82613eaf565b604082019050919050565b60006130f76020836137f8565b915061310282613efe565b602082019050919050565b600061311a602c836137f8565b915061312582613f27565b604082019050919050565b600061313d6020836137f8565b915061314882613f76565b602082019050919050565b60006131606014836137f8565b915061316b82613f9f565b602082019050919050565b60006131836029836137f8565b915061318e82613fc8565b604082019050919050565b60006131a66021836137f8565b91506131b182614017565b604082019050919050565b60006131c96000836137dc565b91506131d482614066565b600082019050919050565b60006131ec6000836137ed565b91506131f782614066565b600082019050919050565b600061320f6031836137f8565b915061321a82614069565b604082019050919050565b61322e8161399d565b82525050565b6132456132408261399d565b613ab1565b82525050565b60006132578285612dcc565b6020820191506132678284612dcc565b6020820191508190509392505050565b60006132838285612ea4565b915061328f8284612e73565b91508190509392505050565b60006132a6826131df565b9150819050919050565b60006132bc8285613234565b6020820191506132cc8284613234565b6020820191508190509392505050565b60006020820190506132f16000830184612d9f565b92915050565b600060808201905061330c6000830187612d9f565b6133196020830186612d9f565b6133266040830185613225565b81810360608301526133388184612df2565b905095945050505050565b600060a0820190506133586000830187612d9f565b6133656020830186612d9f565b6133726040830185613225565b61337f6060830184612e2b565b8181036080830152613390816131bc565b905095945050505050565b60006040820190506133b06000830185612d9f565b6133bd6020830184613225565b9392505050565b60006020820190506133d96000830184612dae565b92915050565b60006020820190506133f46000830184612dbd565b92915050565b600060208201905061340f6000830184612de3565b92915050565b6000602082019050818103600083015261342f8184612e3a565b905092915050565b6000602082019050818103600083015261345081612f23565b9050919050565b6000602082019050818103600083015261347081612f46565b9050919050565b6000602082019050818103600083015261349081612f69565b9050919050565b600060208201905081810360008301526134b081612f8c565b9050919050565b600060208201905081810360008301526134d081612faf565b9050919050565b600060208201905081810360008301526134f081612fd2565b9050919050565b6000602082019050818103600083015261351081612ff5565b9050919050565b6000602082019050818103600083015261353081613018565b9050919050565b600060208201905081810360008301526135508161303b565b9050919050565b600060208201905081810360008301526135708161305e565b9050919050565b6000602082019050818103600083015261359081613081565b9050919050565b600060208201905081810360008301526135b0816130a4565b9050919050565b600060208201905081810360008301526135d0816130c7565b9050919050565b600060208201905081810360008301526135f0816130ea565b9050919050565b600060208201905081810360008301526136108161310d565b9050919050565b6000602082019050818103600083015261363081613130565b9050919050565b6000602082019050818103600083015261365081613153565b9050919050565b6000602082019050818103600083015261367081613176565b9050919050565b6000602082019050818103600083015261369081613199565b9050919050565b600060208201905081810360008301526136b081613202565b9050919050565b60006020820190506136cc6000830184613225565b92915050565b60006136dc6136ed565b90506136e88282613a2d565b919050565b6000604051905090565b600067ffffffffffffffff82111561371257613711613b79565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561373e5761373d613b79565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561376a57613769613b79565b5b61377382613ba8565b9050602081019050919050565b600067ffffffffffffffff82111561379b5761379a613b79565b5b6137a482613ba8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061381f8261399d565b915061382a8361399d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561385f5761385e613aec565b5b828201905092915050565b60006138758261399d565b91506138808361399d565b9250826138905761388f613b1b565b5b828204905092915050565b60006138a68261399d565b91506138b18361399d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138ea576138e9613aec565b5b828202905092915050565b60006139008261399d565b915061390b8361399d565b92508282101561391e5761391d613aec565b5b828203905092915050565b60006139348261397d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006139b28261399d565b9050919050565b82818337600083830152505050565b60005b838110156139e65780820151818401526020810190506139cb565b838111156139f5576000848401525b50505050565b60006002820490506001821680613a1357607f821691505b60208210811415613a2757613a26613b4a565b5b50919050565b613a3682613ba8565b810181811067ffffffffffffffff82111715613a5557613a54613b79565b5b80604052505050565b6000613a698261399d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613aec565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000613ac68261399d565b9150613ad18361399d565b925082613ae157613ae0613b1b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f6e6c7920746f6b656e206f776e65722063616e206d696e74416e644275726e600082015250565b7f4e6f7420612076616c696420656c656d656e7420696e20746865204d65726b6c60008201527f6520747265650000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f49647320646f6e2774206d61746368204d65726b6c65206c6561660000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6140c181613929565b81146140cc57600080fd5b50565b6140d88161393b565b81146140e357600080fd5b50565b6140ef81613947565b81146140fa57600080fd5b50565b61410681613951565b811461411157600080fd5b50565b61411d8161399d565b811461412857600080fd5b5056fea26469706673582212209191939e9c4dab14b2c8f6569da8674f717d0aa71e49260fcbb8170b0395244364736f6c63430008040033
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80636352211e1161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610749578063cfc86f7b14610786578063d5abeb01146107b1578063e985e9c5146107dc578063f2fde38b146108195761023a565b8063a22cb465146106a1578063aaf5eb68146106ca578063b48aff39146106f5578063b88d4fde146107205761023a565b8063729d0a8a116100dc578063729d0a8a146105f95780637cb64759146106225780638da5cb5b1461064b57806395d89b41146106765761023a565b80636352211e1461053d57806370a082311461057a57806370d5ae05146105b7578063715018a6146105e25761023a565b806316d8c5ef1161018557806330176e131161015457806330176e13146104855780633423e548146104ae5780633bfebe01146104eb57806342842e0e146105145761023a565b806316d8c5ef146103c957806318160ddd1461040657806323b872dd146104315780632eb4a7ab1461045a5761023a565b80630962ef79116101c15780630962ef791461030d5780630f7b90b21461033657806312c1329914610361578063150b7a021461038c5761023a565b806301ffc9a71461023f57806306fdde031461027c578063081812fc146102a7578063095ea7b3146102e45761023a565b3661023a57600b54600d54610207919061389b565b620f424034610216919061389b565b610220919061386a565b600e60008282546102319190613814565b92505081905550005b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190612c68565b610842565b60405161027391906133c4565b60405180910390f35b34801561028857600080fd5b50610291610924565b60405161029e9190613415565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190612cfb565b6109b6565b6040516102db91906132dc565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190612b32565b610a3b565b005b34801561031957600080fd5b50610334600480360381019061032f9190612cfb565b610b53565b005b34801561034257600080fd5b5061034b610c6c565b60405161035891906136b7565b60405180910390f35b34801561036d57600080fd5b50610376610c72565b60405161038391906132dc565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906129fb565b610c98565b6040516103c091906133fa565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612cfb565b610cad565b6040516103fd91906136b7565b60405180910390f35b34801561041257600080fd5b5061041b610cc5565b60405161042891906136b7565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906129ac565b610ccb565b005b34801561046657600080fd5b5061046f610d2b565b60405161047c91906133df565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190612cba565b610d31565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612c01565b610dc7565b6040516104e291906133c4565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612d24565b610ddd565b005b34801561052057600080fd5b5061053b600480360381019061053691906129ac565b611105565b005b34801561054957600080fd5b50610564600480360381019061055f9190612cfb565b611125565b60405161057191906132dc565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612947565b6111d7565b6040516105ae91906136b7565b60405180910390f35b3480156105c357600080fd5b506105cc61128f565b6040516105d991906132dc565b60405180910390f35b3480156105ee57600080fd5b506105f76112b5565b005b34801561060557600080fd5b50610620600480360381019061061b9190612b6e565b6113f2565b005b34801561062e57600080fd5b5061064960048036038101906106449190612bd8565b61145e565b005b34801561065757600080fd5b506106606114e4565b60405161066d91906132dc565b60405180910390f35b34801561068257600080fd5b5061068b61150e565b6040516106989190613415565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612af6565b6115a0565b005b3480156106d657600080fd5b506106df611721565b6040516106ec91906136b7565b60405180910390f35b34801561070157600080fd5b5061070a611728565b60405161071791906136b7565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190612a7b565b61172e565b005b34801561075557600080fd5b50610770600480360381019061076b9190612cfb565b611790565b60405161077d9190613415565b60405180910390f35b34801561079257600080fd5b5061079b6117c4565b6040516107a89190613415565b60405180910390f35b3480156107bd57600080fd5b506107c6611852565b6040516107d391906136b7565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612970565b611858565b60405161081091906133c4565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190612947565b6118ec565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091d575061091c82611a98565b5b9050919050565b606060008054610933906139fb565b80601f016020809104026020016040519081016040528092919081815260200182805461095f906139fb565b80156109ac5780601f10610981576101008083540402835291602001916109ac565b820191906000526020600020905b81548152906001019060200180831161098f57829003601f168201915b5050505050905090565b60006109c182611b02565b610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f7906135f7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4682611125565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90613677565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611b6e565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611b6e565b611858565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613577565b60405180910390fd5b610b4e8383611b76565b505050565b6000610b5e82611125565b90506000620f4240600d54600f600086815260200190815260200160002054600e54610b8a91906138f5565b610b94919061389b565b610b9e919061386a565b9050600e54600f60008581526020019081526020016000208190555060008273ffffffffffffffffffffffffffffffffffffffff1682604051610be09061329b565b60006040518083038185875af1925050503d8060008114610c1d576040519150601f19603f3d011682016040523d82523d6000602084013e610c22565b606091505b5050905080610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90613637565b60405180910390fd5b50505050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063f0b9e5ba60e01b905095945050505050565b600f6020528060005260406000206000915090505481565b600b5481565b610cdc610cd6611b6e565b82611c2f565b610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290613697565b60405180910390fd5b610d26838383611d0d565b505050565b60075481565b610d39611b6e565b73ffffffffffffffffffffffffffffffffffffffff16610d576114e4565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613617565b60405180910390fd5b80600c9080519060200190610dc39291906125cb565b5050565b6000610dd4828585611f69565b90509392505050565b610de683611b02565b15610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90613477565b60405180910390fd5b818484604051602001610e3a9291906132b0565b6040516020818303038152906040528051906020012014610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613557565b60405180910390fd5b610e9d6007548383610dc7565b610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390613457565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e33866040518363ffffffff1660e01b8152600401610f3892919061339b565b60206040518083038186803b158015610f5057600080fd5b505afa158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190612baf565b610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90613437565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a33600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760016040518563ffffffff1660e01b815260040161104b9493929190613343565b600060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506110873384612045565b823373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a36001600b60008282546110de9190613814565b92505081905550600e54600f60008581526020019081526020016000208190555050505050565b6111208383836040518060200160405280600081525061172e565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c5906135b7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613597565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112bd611b6e565b73ffffffffffffffffffffffffffffffffffffffff166112db6114e4565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60005b815181101561145a5761144782828151811061143a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610b53565b808061145290613a5e565b9150506113f5565b5050565b611466611b6e565b73ffffffffffffffffffffffffffffffffffffffff166114846114e4565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613617565b60405180910390fd5b8060078190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461151d906139fb565b80601f0160208091040260200160405190810160405280929190818152602001828054611549906139fb565b80156115965780601f1061156b57610100808354040283529160200191611596565b820191906000526020600020905b81548152906001019060200180831161157957829003601f168201915b5050505050905090565b6115a8611b6e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613517565b60405180910390fd5b8060056000611623611b6e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d0611b6e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171591906133c4565b60405180910390a35050565b620f424081565b600e5481565b61173f611739611b6e565b83611c2f565b61177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590613697565b60405180910390fd5b61178a84848484612213565b50505050565b6060600c61179d8361226f565b6040516020016117ae929190613277565b6040516020818303038152906040529050919050565b600c80546117d1906139fb565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd906139fb565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b505050505081565b600a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118f4611b6e565b73ffffffffffffffffffffffffffffffffffffffff166119126114e4565b73ffffffffffffffffffffffffffffffffffffffff1614611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906134b7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be983611125565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3a82611b02565b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7090613537565b60405180910390fd5b6000611c8483611125565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cf357508373ffffffffffffffffffffffffffffffffffffffff16611cdb846109b6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d045750611d038185611858565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2d82611125565b73ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613657565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea906134f7565b60405180910390fd5b611dfe83838361241c565b611e09600082611b76565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e5991906138f5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb09190613814565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b8551811015612037576000868281518110611fb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611ff7578281604051602001611fda92919061324b565b604051602081830303815290604052805190602001209250612023565b808360405160200161200a92919061324b565b6040516020818303038152906040528051906020012092505b50808061202f90613a5e565b915050611f72565b508381149150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac906135d7565b60405180910390fd5b6120be81611b02565b156120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906134d7565b60405180910390fd5b61210a6000838361241c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215a9190613814565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61221e848484611d0d565b61222a84848484612421565b612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090613497565b60405180910390fd5b50505050565b606060008214156122b7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612417565b600082905060005b600082146122e95780806122d290613a5e565b915050600a826122e2919061386a565b91506122bf565b60008167ffffffffffffffff81111561232b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561235d5781602001600182028036833780820191505090505b5090505b600085146124105760018261237691906138f5565b9150600a856123859190613abb565b60306123919190613814565b60f81b8183815181106123cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612409919061386a565b9450612361565b8093505050505b919050565b505050565b60006124428473ffffffffffffffffffffffffffffffffffffffff166125b8565b156125ab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261246b611b6e565b8786866040518563ffffffff1660e01b815260040161248d94939291906132f7565b602060405180830381600087803b1580156124a757600080fd5b505af19250505080156124d857506040513d601f19601f820116820180604052508101906124d59190612c91565b60015b61255b573d8060008114612508576040519150601f19603f3d011682016040523d82523d6000602084013e61250d565b606091505b50600081511415612553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254a90613497565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125b0565b600190505b949350505050565b600080823b905060008111915050919050565b8280546125d7906139fb565b90600052602060002090601f0160209004810192826125f95760008555612640565b82601f1061261257805160ff1916838001178555612640565b82800160010185558215612640579182015b8281111561263f578251825591602001919060010190612624565b5b50905061264d9190612651565b5090565b5b8082111561266a576000816000905550600101612652565b5090565b600061268161267c846136f7565b6136d2565b905080838252602082019050828560208602820111156126a057600080fd5b60005b858110156126d057816126b68882612855565b8452602084019350602083019250506001810190506126a3565b5050509392505050565b60006126ed6126e884613723565b6136d2565b9050808382526020820190508285602086028201111561270c57600080fd5b60005b8581101561273c57816127228882612932565b84526020840193506020830192505060018101905061270f565b5050509392505050565b60006127596127548461374f565b6136d2565b90508281526020810184848401111561277157600080fd5b61277c8482856139b9565b509392505050565b600061279761279284613780565b6136d2565b9050828152602081018484840111156127af57600080fd5b6127ba8482856139b9565b509392505050565b6000813590506127d1816140b8565b92915050565b600082601f8301126127e857600080fd5b81356127f884826020860161266e565b91505092915050565b600082601f83011261281257600080fd5b81356128228482602086016126da565b91505092915050565b60008135905061283a816140cf565b92915050565b60008151905061284f816140cf565b92915050565b600081359050612864816140e6565b92915050565b600081359050612879816140fd565b92915050565b60008151905061288e816140fd565b92915050565b60008083601f8401126128a657600080fd5b8235905067ffffffffffffffff8111156128bf57600080fd5b6020830191508360018202830111156128d757600080fd5b9250929050565b600082601f8301126128ef57600080fd5b81356128ff848260208601612746565b91505092915050565b600082601f83011261291957600080fd5b8135612929848260208601612784565b91505092915050565b60008135905061294181614114565b92915050565b60006020828403121561295957600080fd5b6000612967848285016127c2565b91505092915050565b6000806040838503121561298357600080fd5b6000612991858286016127c2565b92505060206129a2858286016127c2565b9150509250929050565b6000806000606084860312156129c157600080fd5b60006129cf868287016127c2565b93505060206129e0868287016127c2565b92505060406129f186828701612932565b9150509250925092565b600080600080600060808688031215612a1357600080fd5b6000612a21888289016127c2565b9550506020612a32888289016127c2565b9450506040612a4388828901612932565b935050606086013567ffffffffffffffff811115612a6057600080fd5b612a6c88828901612894565b92509250509295509295909350565b60008060008060808587031215612a9157600080fd5b6000612a9f878288016127c2565b9450506020612ab0878288016127c2565b9350506040612ac187828801612932565b925050606085013567ffffffffffffffff811115612ade57600080fd5b612aea878288016128de565b91505092959194509250565b60008060408385031215612b0957600080fd5b6000612b17858286016127c2565b9250506020612b288582860161282b565b9150509250929050565b60008060408385031215612b4557600080fd5b6000612b53858286016127c2565b9250506020612b6485828601612932565b9150509250929050565b600060208284031215612b8057600080fd5b600082013567ffffffffffffffff811115612b9a57600080fd5b612ba684828501612801565b91505092915050565b600060208284031215612bc157600080fd5b6000612bcf84828501612840565b91505092915050565b600060208284031215612bea57600080fd5b6000612bf884828501612855565b91505092915050565b600080600060608486031215612c1657600080fd5b6000612c2486828701612855565b9350506020612c3586828701612855565b925050604084013567ffffffffffffffff811115612c5257600080fd5b612c5e868287016127d7565b9150509250925092565b600060208284031215612c7a57600080fd5b6000612c888482850161286a565b91505092915050565b600060208284031215612ca357600080fd5b6000612cb18482850161287f565b91505092915050565b600060208284031215612ccc57600080fd5b600082013567ffffffffffffffff811115612ce657600080fd5b612cf284828501612908565b91505092915050565b600060208284031215612d0d57600080fd5b6000612d1b84828501612932565b91505092915050565b60008060008060808587031215612d3a57600080fd5b6000612d4887828801612932565b9450506020612d5987828801612932565b9350506040612d6a87828801612855565b925050606085013567ffffffffffffffff811115612d8757600080fd5b612d93878288016127d7565b91505092959194509250565b612da881613929565b82525050565b612db78161393b565b82525050565b612dc681613947565b82525050565b612ddd612dd882613947565b613aa7565b82525050565b612dec81613951565b82525050565b6000612dfd826137c6565b612e0781856137dc565b9350612e178185602086016139c8565b612e2081613ba8565b840191505092915050565b612e34816139a7565b82525050565b6000612e45826137d1565b612e4f81856137f8565b9350612e5f8185602086016139c8565b612e6881613ba8565b840191505092915050565b6000612e7e826137d1565b612e888185613809565b9350612e988185602086016139c8565b80840191505092915050565b60008154612eb1816139fb565b612ebb8186613809565b94506001821660008114612ed65760018114612ee757612f1a565b60ff19831686528186019350612f1a565b612ef0856137b1565b60005b83811015612f1257815481890152600182019150602081019050612ef3565b838801955050505b50505092915050565b6000612f306020836137f8565b9150612f3b82613bb9565b602082019050919050565b6000612f536026836137f8565b9150612f5e82613be2565b604082019050919050565b6000612f766014836137f8565b9150612f8182613c31565b602082019050919050565b6000612f996032836137f8565b9150612fa482613c5a565b604082019050919050565b6000612fbc6026836137f8565b9150612fc782613ca9565b604082019050919050565b6000612fdf601c836137f8565b9150612fea82613cf8565b602082019050919050565b60006130026024836137f8565b915061300d82613d21565b604082019050919050565b60006130256019836137f8565b915061303082613d70565b602082019050919050565b6000613048602c836137f8565b915061305382613d99565b604082019050919050565b600061306b601b836137f8565b915061307682613de8565b602082019050919050565b600061308e6038836137f8565b915061309982613e11565b604082019050919050565b60006130b1602a836137f8565b91506130bc82613e60565b604082019050919050565b60006130d46029836137f8565b91506130df82613eaf565b604082019050919050565b60006130f76020836137f8565b915061310282613efe565b602082019050919050565b600061311a602c836137f8565b915061312582613f27565b604082019050919050565b600061313d6020836137f8565b915061314882613f76565b602082019050919050565b60006131606014836137f8565b915061316b82613f9f565b602082019050919050565b60006131836029836137f8565b915061318e82613fc8565b604082019050919050565b60006131a66021836137f8565b91506131b182614017565b604082019050919050565b60006131c96000836137dc565b91506131d482614066565b600082019050919050565b60006131ec6000836137ed565b91506131f782614066565b600082019050919050565b600061320f6031836137f8565b915061321a82614069565b604082019050919050565b61322e8161399d565b82525050565b6132456132408261399d565b613ab1565b82525050565b60006132578285612dcc565b6020820191506132678284612dcc565b6020820191508190509392505050565b60006132838285612ea4565b915061328f8284612e73565b91508190509392505050565b60006132a6826131df565b9150819050919050565b60006132bc8285613234565b6020820191506132cc8284613234565b6020820191508190509392505050565b60006020820190506132f16000830184612d9f565b92915050565b600060808201905061330c6000830187612d9f565b6133196020830186612d9f565b6133266040830185613225565b81810360608301526133388184612df2565b905095945050505050565b600060a0820190506133586000830187612d9f565b6133656020830186612d9f565b6133726040830185613225565b61337f6060830184612e2b565b8181036080830152613390816131bc565b905095945050505050565b60006040820190506133b06000830185612d9f565b6133bd6020830184613225565b9392505050565b60006020820190506133d96000830184612dae565b92915050565b60006020820190506133f46000830184612dbd565b92915050565b600060208201905061340f6000830184612de3565b92915050565b6000602082019050818103600083015261342f8184612e3a565b905092915050565b6000602082019050818103600083015261345081612f23565b9050919050565b6000602082019050818103600083015261347081612f46565b9050919050565b6000602082019050818103600083015261349081612f69565b9050919050565b600060208201905081810360008301526134b081612f8c565b9050919050565b600060208201905081810360008301526134d081612faf565b9050919050565b600060208201905081810360008301526134f081612fd2565b9050919050565b6000602082019050818103600083015261351081612ff5565b9050919050565b6000602082019050818103600083015261353081613018565b9050919050565b600060208201905081810360008301526135508161303b565b9050919050565b600060208201905081810360008301526135708161305e565b9050919050565b6000602082019050818103600083015261359081613081565b9050919050565b600060208201905081810360008301526135b0816130a4565b9050919050565b600060208201905081810360008301526135d0816130c7565b9050919050565b600060208201905081810360008301526135f0816130ea565b9050919050565b600060208201905081810360008301526136108161310d565b9050919050565b6000602082019050818103600083015261363081613130565b9050919050565b6000602082019050818103600083015261365081613153565b9050919050565b6000602082019050818103600083015261367081613176565b9050919050565b6000602082019050818103600083015261369081613199565b9050919050565b600060208201905081810360008301526136b081613202565b9050919050565b60006020820190506136cc6000830184613225565b92915050565b60006136dc6136ed565b90506136e88282613a2d565b919050565b6000604051905090565b600067ffffffffffffffff82111561371257613711613b79565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561373e5761373d613b79565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561376a57613769613b79565b5b61377382613ba8565b9050602081019050919050565b600067ffffffffffffffff82111561379b5761379a613b79565b5b6137a482613ba8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061381f8261399d565b915061382a8361399d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561385f5761385e613aec565b5b828201905092915050565b60006138758261399d565b91506138808361399d565b9250826138905761388f613b1b565b5b828204905092915050565b60006138a68261399d565b91506138b18361399d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138ea576138e9613aec565b5b828202905092915050565b60006139008261399d565b915061390b8361399d565b92508282101561391e5761391d613aec565b5b828203905092915050565b60006139348261397d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006139b28261399d565b9050919050565b82818337600083830152505050565b60005b838110156139e65780820151818401526020810190506139cb565b838111156139f5576000848401525b50505050565b60006002820490506001821680613a1357607f821691505b60208210811415613a2757613a26613b4a565b5b50919050565b613a3682613ba8565b810181811067ffffffffffffffff82111715613a5557613a54613b79565b5b80604052505050565b6000613a698261399d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a9c57613a9b613aec565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000613ac68261399d565b9150613ad18361399d565b925082613ae157613ae0613b1b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f6e6c7920746f6b656e206f776e65722063616e206d696e74416e644275726e600082015250565b7f4e6f7420612076616c696420656c656d656e7420696e20746865204d65726b6c60008201527f6520747265650000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f49647320646f6e2774206d61746368204d65726b6c65206c6561660000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6140c181613929565b81146140cc57600080fd5b50565b6140d88161393b565b81146140e357600080fd5b50565b6140ef81613947565b81146140fa57600080fd5b50565b61410681613951565b811461411157600080fd5b50565b61411d8161399d565b811461412857600080fd5b5056fea26469706673582212209191939e9c4dab14b2c8f6569da8674f717d0aa71e49260fcbb8170b0395244364736f6c63430008040033
Deployed Bytecode Sourcemap
38995:3981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40084:11;;40065:16;;:30;;;;:::i;:::-;39656:7;40039:9;:21;;;;:::i;:::-;40038:58;;;;:::i;:::-;40028:6;;:68;;;;;;;:::i;:::-;;;;;;;;38995:3981;;;;;24570:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25502:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26962:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26499:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40378:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39578:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39204:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42033:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39722:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39440:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27852:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39114:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42740:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42240:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40833:1192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28228:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25196:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24926:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39291:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:148;;;;;;;;;;;;;:::i;:::-;;40196:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42869:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3771:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25671:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27255:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39623:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39681:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28450:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42483:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39510:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39369;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27621:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4725:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24570:292;24672:4;24711:25;24696:40;;;:11;:40;;;;:105;;;;24768:33;24753:48;;;:11;:48;;;;24696:105;:158;;;;24818:36;24842:11;24818:23;:36::i;:::-;24696:158;24689:165;;24570:292;;;:::o;25502:100::-;25556:13;25589:5;25582:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25502:100;:::o;26962:221::-;27038:7;27066:16;27074:7;27066;:16::i;:::-;27058:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27151:15;:24;27167:7;27151:24;;;;;;;;;;;;;;;;;;;;;27144:31;;26962:221;;;:::o;26499:397::-;26580:13;26596:23;26611:7;26596:14;:23::i;:::-;26580:39;;26644:5;26638:11;;:2;:11;;;;26630:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26724:5;26708:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26733:37;26750:5;26757:12;:10;:12::i;:::-;26733:16;:37::i;:::-;26708:62;26700:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26867:21;26876:2;26880:7;26867:8;:21::i;:::-;26499:397;;;:::o;40378:445::-;40432:18;40453:16;40461:7;40453;:16::i;:::-;40432:37;;40567:14;39656:7;40623:16;;40594;:25;40611:7;40594:25;;;;;;;;;;;;40585:6;;:34;;;;:::i;:::-;40584:55;;;;:::i;:::-;:67;;;;:::i;:::-;40567:84;;40690:6;;40662:16;:25;40679:7;40662:25;;;;;;;;;;;:34;;;;40710:12;40727:10;:15;;40750:9;40727:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40709:55;;;40783:7;40775:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;40378:445;;;;:::o;39578:38::-;;;;:::o;39204:80::-;;;;;;;;;;;;;:::o;42033:199::-;42188:6;42214:10;42207:17;;;;42033:199;;;;;;;:::o;39722:45::-;;;;;;;;;;;;;;;;;:::o;39440:27::-;;;;:::o;27852:305::-;28013:41;28032:12;:10;:12::i;:::-;28046:7;28013:18;:41::i;:::-;28005:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28121:28;28131:4;28137:2;28141:7;28121:9;:28::i;:::-;27852:305;;;:::o;39114:30::-;;;;:::o;42740:121::-;4002:12;:10;:12::i;:::-;3991:23;;:7;:5;:7::i;:::-;:23;;;3983:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42839:14:::1;42823:13;:30;;;;;;;;;;;;:::i;:::-;;42740:121:::0;:::o;42240:158::-;42329:4;42353:37;42372:5;42379:4;42385;42353:18;:37::i;:::-;42346:44;;42240:158;;;;;:::o;40833:1192::-;40985:14;40993:5;40985:7;:14::i;:::-;40984:15;40976:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41159:4;41141:5;41148;41124:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41114:41;;;;;;:49;41106:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;41290:31;41297:10;;41309:4;41315:5;41290:6;:31::i;:::-;41282:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;41458:20;;;;;;;;;;;41450:39;;;41490:10;41502:5;41450:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41442:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;41719:20;;;;;;;;;;;41711:46;;;41758:10;41770:11;;;;;;;;;;;41783:5;41790:1;41711:85;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41836:24;41842:10;41854:5;41836;:24::i;:::-;41893:5;41881:10;41876:23;;;;;;;;;;;;41925:1;41910:11;;:16;;;;;;;:::i;:::-;;;;;;;;42011:6;;41985:16;:23;42002:5;41985:23;;;;;;;;;;;:32;;;;40833:1192;;;;:::o;28228:151::-;28332:39;28349:4;28355:2;28359:7;28332:39;;;;;;;;;;;;:16;:39::i;:::-;28228:151;;;:::o;25196:239::-;25268:7;25288:13;25304:7;:16;25312:7;25304:16;;;;;;;;;;;;;;;;;;;;;25288:32;;25356:1;25339:19;;:5;:19;;;;25331:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25422:5;25415:12;;;25196:239;;;:::o;24926:208::-;24998:7;25043:1;25026:19;;:5;:19;;;;25018:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25110:9;:16;25120:5;25110:16;;;;;;;;;;;;;;;;25103:23;;24926:208;;;:::o;39291:71::-;;;;;;;;;;;;;:::o;4422:148::-;4002:12;:10;:12::i;:::-;3991:23;;:7;:5;:7::i;:::-;:23;;;3983:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4529:1:::1;4492:40;;4513:6;;;;;;;;;;;4492:40;;;;;;;;;;;;4560:1;4543:6;;:19;;;;;;;;;;;;;;;;;;4422:148::o:0;40196:174::-;40273:6;40268:95;40289:8;:15;40285:1;:19;40268:95;;;40326:25;40339:8;40348:1;40339:11;;;;;;;;;;;;;;;;;;;;;;40326:12;:25::i;:::-;40306:3;;;;;:::i;:::-;;;;40268:95;;;;40196:174;:::o;42869:104::-;4002:12;:10;:12::i;:::-;3991:23;;:7;:5;:7::i;:::-;:23;;;3983:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42954:11:::1;42941:10;:24;;;;42869:104:::0;:::o;3771:87::-;3817:7;3844:6;;;;;;;;;;;3837:13;;3771:87;:::o;25671:104::-;25727:13;25760:7;25753:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25671:104;:::o;27255:295::-;27370:12;:10;:12::i;:::-;27358:24;;:8;:24;;;;27350:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27470:8;27425:18;:32;27444:12;:10;:12::i;:::-;27425:32;;;;;;;;;;;;;;;:42;27458:8;27425:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27523:8;27494:48;;27509:12;:10;:12::i;:::-;27494:48;;;27533:8;27494:48;;;;;;:::i;:::-;;;;;;;;27255:295;;:::o;39623:40::-;39656:7;39623:40;:::o;39681:34::-;;;;:::o;28450:285::-;28582:41;28601:12;:10;:12::i;:::-;28615:7;28582:18;:41::i;:::-;28574:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28688:39;28702:4;28708:2;28712:7;28721:5;28688:13;:39::i;:::-;28450:285;;;;:::o;42483:174::-;42549:13;42606;42621:26;42638:8;42621:16;:26::i;:::-;42589:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42575:74;;42483:174;;;:::o;39510:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39369:::-;;;;:::o;27621:164::-;27718:4;27742:18;:25;27761:5;27742:25;;;;;;;;;;;;;;;:35;27768:8;27742:35;;;;;;;;;;;;;;;;;;;;;;;;;27735:42;;27621:164;;;;:::o;4725:244::-;4002:12;:10;:12::i;:::-;3991:23;;:7;:5;:7::i;:::-;:23;;;3983:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4834:1:::1;4814:22;;:8;:22;;;;4806:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4924:8;4895:38;;4916:6;;;;;;;;;;;4895:38;;;;;;;;;;;;4953:8;4944:6;;:17;;;;;;;;;;;;;;;;;;4725:244:::0;:::o;23068:157::-;23153:4;23192:25;23177:40;;;:11;:40;;;;23170:47;;23068:157;;;:::o;30202:127::-;30267:4;30319:1;30291:30;;:7;:16;30299:7;30291:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30284:37;;30202:127;;;:::o;2329:98::-;2382:7;2409:10;2402:17;;2329:98;:::o;34079:174::-;34181:2;34154:15;:24;34170:7;34154:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34237:7;34233:2;34199:46;;34208:23;34223:7;34208:14;:23::i;:::-;34199:46;;;;;;;;;;;;34079:174;;:::o;30496:348::-;30589:4;30614:16;30622:7;30614;:16::i;:::-;30606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:13;30706:23;30721:7;30706:14;:23::i;:::-;30690:39;;30759:5;30748:16;;:7;:16;;;:51;;;;30792:7;30768:31;;:20;30780:7;30768:11;:20::i;:::-;:31;;;30748:51;:87;;;;30803:32;30820:5;30827:7;30803:16;:32::i;:::-;30748:87;30740:96;;;30496:348;;;;:::o;33417:544::-;33542:4;33515:31;;:23;33530:7;33515:14;:23::i;:::-;:31;;;33507:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33625:1;33611:16;;:2;:16;;;;33603:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33681:39;33702:4;33708:2;33712:7;33681:20;:39::i;:::-;33785:29;33802:1;33806:7;33785:8;:29::i;:::-;33846:1;33827:9;:15;33837:4;33827:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33875:1;33858:9;:13;33868:2;33858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33906:2;33887:7;:16;33895:7;33887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33945:7;33941:2;33926:27;;33935:4;33926:27;;;;;;;;;;;;33417:544;;;:::o;37211:796::-;37302:4;37319:20;37342:4;37319:27;;37364:9;37359:525;37383:5;:12;37379:1;:16;37359:525;;;37417:20;37440:5;37446:1;37440:8;;;;;;;;;;;;;;;;;;;;;;37417:31;;37485:12;37469;:28;37465:408;;37639:12;37653;37622:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37612:55;;;;;;37597:70;;37465:408;;;37829:12;37843;37812:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37802:55;;;;;;37787:70;;37465:408;37359:525;37397:3;;;;;:::i;:::-;;;;37359:525;;;;37995:4;37979:12;:20;37972:27;;;37211:796;;;;;:::o;32109:382::-;32203:1;32189:16;;:2;:16;;;;32181:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:16;32270:7;32262;:16::i;:::-;32261:17;32253:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32324:45;32353:1;32357:2;32361:7;32324:20;:45::i;:::-;32399:1;32382:9;:13;32392:2;32382:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32430:2;32411:7;:16;32419:7;32411:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32475:7;32471:2;32450:33;;32467:1;32450:33;;;;;;;;;;;;32109:382;;:::o;29617:272::-;29731:28;29741:4;29747:2;29751:7;29731:9;:28::i;:::-;29778:48;29801:4;29807:2;29811:7;29820:5;29778:22;:48::i;:::-;29770:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29617:272;;;;:::o;20513:723::-;20569:13;20799:1;20790:5;:10;20786:53;;;20817:10;;;;;;;;;;;;;;;;;;;;;20786:53;20849:12;20864:5;20849:20;;20880:14;20905:78;20920:1;20912:4;:9;20905:78;;20938:8;;;;;:::i;:::-;;;;20969:2;20961:10;;;;;:::i;:::-;;;20905:78;;;20993:19;21025:6;21015:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20993:39;;21043:154;21059:1;21050:5;:10;21043:154;;21087:1;21077:11;;;;;:::i;:::-;;;21154:2;21146:5;:10;;;;:::i;:::-;21133:2;:24;;;;:::i;:::-;21120:39;;21103:6;21110;21103:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;21183:2;21174:11;;;;;:::i;:::-;;;21043:154;;;21221:6;21207:21;;;;;20513:723;;;;:::o;36274:93::-;;;;:::o;34818:843::-;34939:4;34965:15;:2;:13;;;:15::i;:::-;34961:693;;;35017:2;35001:36;;;35038:12;:10;:12::i;:::-;35052:4;35058:7;35067:5;35001:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34997:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35264:1;35247:6;:13;:18;35243:341;;;35290:60;;;;;;;;;;:::i;:::-;;;;;;;;35243:341;35534:6;35528:13;35519:6;35515:2;35511:15;35504:38;34997:602;35134:45;;;35124:55;;;:6;:55;;;;35117:62;;;;;34961:693;35638:4;35631:11;;34818:843;;;;;;;:::o;12947:422::-;13007:4;13215:12;13326:7;13314:20;13306:28;;13360:1;13353:4;:8;13346:15;;;12947:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3053:5;3084:6;3078:13;3069:22;;3100:30;3124:5;3100:30;:::i;:::-;3059:77;;;;:::o;3142:139::-;3188:5;3226:6;3213:20;3204:29;;3242:33;3269:5;3242:33;:::i;:::-;3194:87;;;;:::o;3287:137::-;3332:5;3370:6;3357:20;3348:29;;3386:32;3412:5;3386:32;:::i;:::-;3338:86;;;;:::o;3430:141::-;3486:5;3517:6;3511:13;3502:22;;3533:32;3559:5;3533:32;:::i;:::-;3492:79;;;;:::o;3590:351::-;3647:8;3657:6;3707:3;3700:4;3692:6;3688:17;3684:27;3674:2;;3725:1;3722;3715:12;3674:2;3761:6;3748:20;3738:30;;3791:18;3783:6;3780:30;3777:2;;;3823:1;3820;3813:12;3777:2;3860:4;3852:6;3848:17;3836:29;;3914:3;3906:4;3898:6;3894:17;3884:8;3880:32;3877:41;3874:2;;;3931:1;3928;3921:12;3874:2;3664:277;;;;;:::o;3960:271::-;4015:5;4064:3;4057:4;4049:6;4045:17;4041:27;4031:2;;4082:1;4079;4072:12;4031:2;4122:6;4109:20;4147:78;4221:3;4213:6;4206:4;4198:6;4194:17;4147:78;:::i;:::-;4138:87;;4021:210;;;;;:::o;4251:273::-;4307:5;4356:3;4349:4;4341:6;4337:17;4333:27;4323:2;;4374:1;4371;4364:12;4323:2;4414:6;4401:20;4439:79;4514:3;4506:6;4499:4;4491:6;4487:17;4439:79;:::i;:::-;4430:88;;4313:211;;;;;:::o;4530:139::-;4576:5;4614:6;4601:20;4592:29;;4630:33;4657:5;4630:33;:::i;:::-;4582:87;;;;:::o;4675:262::-;4734:6;4783:2;4771:9;4762:7;4758:23;4754:32;4751:2;;;4799:1;4796;4789:12;4751:2;4842:1;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4813:117;4741:196;;;;:::o;4943:407::-;5011:6;5019;5068:2;5056:9;5047:7;5043:23;5039:32;5036:2;;;5084:1;5081;5074:12;5036:2;5127:1;5152:53;5197:7;5188:6;5177:9;5173:22;5152:53;:::i;:::-;5142:63;;5098:117;5254:2;5280:53;5325:7;5316:6;5305:9;5301:22;5280:53;:::i;:::-;5270:63;;5225:118;5026:324;;;;;:::o;5356:552::-;5433:6;5441;5449;5498:2;5486:9;5477:7;5473:23;5469:32;5466:2;;;5514:1;5511;5504:12;5466:2;5557:1;5582:53;5627:7;5618:6;5607:9;5603:22;5582:53;:::i;:::-;5572:63;;5528:117;5684:2;5710:53;5755:7;5746:6;5735:9;5731:22;5710:53;:::i;:::-;5700:63;;5655:118;5812:2;5838:53;5883:7;5874:6;5863:9;5859:22;5838:53;:::i;:::-;5828:63;;5783:118;5456:452;;;;;:::o;5914:829::-;6011:6;6019;6027;6035;6043;6092:3;6080:9;6071:7;6067:23;6063:33;6060:2;;;6109:1;6106;6099:12;6060:2;6152:1;6177:53;6222:7;6213:6;6202:9;6198:22;6177:53;:::i;:::-;6167:63;;6123:117;6279:2;6305:53;6350:7;6341:6;6330:9;6326:22;6305:53;:::i;:::-;6295:63;;6250:118;6407:2;6433:53;6478:7;6469:6;6458:9;6454:22;6433:53;:::i;:::-;6423:63;;6378:118;6563:2;6552:9;6548:18;6535:32;6594:18;6586:6;6583:30;6580:2;;;6626:1;6623;6616:12;6580:2;6662:64;6718:7;6709:6;6698:9;6694:22;6662:64;:::i;:::-;6644:82;;;;6506:230;6050:693;;;;;;;;:::o;6749:809::-;6844:6;6852;6860;6868;6917:3;6905:9;6896:7;6892:23;6888:33;6885:2;;;6934:1;6931;6924:12;6885:2;6977:1;7002:53;7047:7;7038:6;7027:9;7023:22;7002:53;:::i;:::-;6992:63;;6948:117;7104:2;7130:53;7175:7;7166:6;7155:9;7151:22;7130:53;:::i;:::-;7120:63;;7075:118;7232:2;7258:53;7303:7;7294:6;7283:9;7279:22;7258:53;:::i;:::-;7248:63;;7203:118;7388:2;7377:9;7373:18;7360:32;7419:18;7411:6;7408:30;7405:2;;;7451:1;7448;7441:12;7405:2;7479:62;7533:7;7524:6;7513:9;7509:22;7479:62;:::i;:::-;7469:72;;7331:220;6875:683;;;;;;;:::o;7564:401::-;7629:6;7637;7686:2;7674:9;7665:7;7661:23;7657:32;7654:2;;;7702:1;7699;7692:12;7654:2;7745:1;7770:53;7815:7;7806:6;7795:9;7791:22;7770:53;:::i;:::-;7760:63;;7716:117;7872:2;7898:50;7940:7;7931:6;7920:9;7916:22;7898:50;:::i;:::-;7888:60;;7843:115;7644:321;;;;;:::o;7971:407::-;8039:6;8047;8096:2;8084:9;8075:7;8071:23;8067:32;8064:2;;;8112:1;8109;8102:12;8064:2;8155:1;8180:53;8225:7;8216:6;8205:9;8201:22;8180:53;:::i;:::-;8170:63;;8126:117;8282:2;8308:53;8353:7;8344:6;8333:9;8329:22;8308:53;:::i;:::-;8298:63;;8253:118;8054:324;;;;;:::o;8384:405::-;8468:6;8517:2;8505:9;8496:7;8492:23;8488:32;8485:2;;;8533:1;8530;8523:12;8485:2;8604:1;8593:9;8589:17;8576:31;8634:18;8626:6;8623:30;8620:2;;;8666:1;8663;8656:12;8620:2;8694:78;8764:7;8755:6;8744:9;8740:22;8694:78;:::i;:::-;8684:88;;8547:235;8475:314;;;;:::o;8795:278::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:2;;;8927:1;8924;8917:12;8879:2;8970:1;8995:61;9048:7;9039:6;9028:9;9024:22;8995:61;:::i;:::-;8985:71;;8941:125;8869:204;;;;:::o;9079:262::-;9138:6;9187:2;9175:9;9166:7;9162:23;9158:32;9155:2;;;9203:1;9200;9193:12;9155:2;9246:1;9271:53;9316:7;9307:6;9296:9;9292:22;9271:53;:::i;:::-;9261:63;;9217:117;9145:196;;;;:::o;9347:695::-;9449:6;9457;9465;9514:2;9502:9;9493:7;9489:23;9485:32;9482:2;;;9530:1;9527;9520:12;9482:2;9573:1;9598:53;9643:7;9634:6;9623:9;9619:22;9598:53;:::i;:::-;9588:63;;9544:117;9700:2;9726:53;9771:7;9762:6;9751:9;9747:22;9726:53;:::i;:::-;9716:63;;9671:118;9856:2;9845:9;9841:18;9828:32;9887:18;9879:6;9876:30;9873:2;;;9919:1;9916;9909:12;9873:2;9947:78;10017:7;10008:6;9997:9;9993:22;9947:78;:::i;:::-;9937:88;;9799:236;9472:570;;;;;:::o;10048:260::-;10106:6;10155:2;10143:9;10134:7;10130:23;10126:32;10123:2;;;10171:1;10168;10161:12;10123:2;10214:1;10239:52;10283:7;10274:6;10263:9;10259:22;10239:52;:::i;:::-;10229:62;;10185:116;10113:195;;;;:::o;10314:282::-;10383:6;10432:2;10420:9;10411:7;10407:23;10403:32;10400:2;;;10448:1;10445;10438:12;10400:2;10491:1;10516:63;10571:7;10562:6;10551:9;10547:22;10516:63;:::i;:::-;10506:73;;10462:127;10390:206;;;;:::o;10602:375::-;10671:6;10720:2;10708:9;10699:7;10695:23;10691:32;10688:2;;;10736:1;10733;10726:12;10688:2;10807:1;10796:9;10792:17;10779:31;10837:18;10829:6;10826:30;10823:2;;;10869:1;10866;10859:12;10823:2;10897:63;10952:7;10943:6;10932:9;10928:22;10897:63;:::i;:::-;10887:73;;10750:220;10678:299;;;;:::o;10983:262::-;11042:6;11091:2;11079:9;11070:7;11066:23;11062:32;11059:2;;;11107:1;11104;11097:12;11059:2;11150:1;11175:53;11220:7;11211:6;11200:9;11196:22;11175:53;:::i;:::-;11165:63;;11121:117;11049:196;;;;:::o;11251:841::-;11362:6;11370;11378;11386;11435:3;11423:9;11414:7;11410:23;11406:33;11403:2;;;11452:1;11449;11442:12;11403:2;11495:1;11520:53;11565:7;11556:6;11545:9;11541:22;11520:53;:::i;:::-;11510:63;;11466:117;11622:2;11648:53;11693:7;11684:6;11673:9;11669:22;11648:53;:::i;:::-;11638:63;;11593:118;11750:2;11776:53;11821:7;11812:6;11801:9;11797:22;11776:53;:::i;:::-;11766:63;;11721:118;11906:2;11895:9;11891:18;11878:32;11937:18;11929:6;11926:30;11923:2;;;11969:1;11966;11959:12;11923:2;11997:78;12067:7;12058:6;12047:9;12043:22;11997:78;:::i;:::-;11987:88;;11849:236;11393:699;;;;;;;:::o;12098:118::-;12185:24;12203:5;12185:24;:::i;:::-;12180:3;12173:37;12163:53;;:::o;12222:109::-;12303:21;12318:5;12303:21;:::i;:::-;12298:3;12291:34;12281:50;;:::o;12337:118::-;12424:24;12442:5;12424:24;:::i;:::-;12419:3;12412:37;12402:53;;:::o;12461:157::-;12566:45;12586:24;12604:5;12586:24;:::i;:::-;12566:45;:::i;:::-;12561:3;12554:58;12544:74;;:::o;12624:115::-;12709:23;12726:5;12709:23;:::i;:::-;12704:3;12697:36;12687:52;;:::o;12745:360::-;12831:3;12859:38;12891:5;12859:38;:::i;:::-;12913:70;12976:6;12971:3;12913:70;:::i;:::-;12906:77;;12992:52;13037:6;13032:3;13025:4;13018:5;13014:16;12992:52;:::i;:::-;13069:29;13091:6;13069:29;:::i;:::-;13064:3;13060:39;13053:46;;12835:270;;;;;:::o;13111:147::-;13206:45;13245:5;13206:45;:::i;:::-;13201:3;13194:58;13184:74;;:::o;13264:364::-;13352:3;13380:39;13413:5;13380:39;:::i;:::-;13435:71;13499:6;13494:3;13435:71;:::i;:::-;13428:78;;13515:52;13560:6;13555:3;13548:4;13541:5;13537:16;13515:52;:::i;:::-;13592:29;13614:6;13592:29;:::i;:::-;13587:3;13583:39;13576:46;;13356:272;;;;;:::o;13634:377::-;13740:3;13768:39;13801:5;13768:39;:::i;:::-;13823:89;13905:6;13900:3;13823:89;:::i;:::-;13816:96;;13921:52;13966:6;13961:3;13954:4;13947:5;13943:16;13921:52;:::i;:::-;13998:6;13993:3;13989:16;13982:23;;13744:267;;;;;:::o;14041:845::-;14144:3;14181:5;14175:12;14210:36;14236:9;14210:36;:::i;:::-;14262:89;14344:6;14339:3;14262:89;:::i;:::-;14255:96;;14382:1;14371:9;14367:17;14398:1;14393:137;;;;14544:1;14539:341;;;;14360:520;;14393:137;14477:4;14473:9;14462;14458:25;14453:3;14446:38;14513:6;14508:3;14504:16;14497:23;;14393:137;;14539:341;14606:38;14638:5;14606:38;:::i;:::-;14666:1;14680:154;14694:6;14691:1;14688:13;14680:154;;;14768:7;14762:14;14758:1;14753:3;14749:11;14742:35;14818:1;14809:7;14805:15;14794:26;;14716:4;14713:1;14709:12;14704:17;;14680:154;;;14863:6;14858:3;14854:16;14847:23;;14546:334;;14360:520;;14148:738;;;;;;:::o;14892:366::-;15034:3;15055:67;15119:2;15114:3;15055:67;:::i;:::-;15048:74;;15131:93;15220:3;15131:93;:::i;:::-;15249:2;15244:3;15240:12;15233:19;;15038:220;;;:::o;15264:366::-;15406:3;15427:67;15491:2;15486:3;15427:67;:::i;:::-;15420:74;;15503:93;15592:3;15503:93;:::i;:::-;15621:2;15616:3;15612:12;15605:19;;15410:220;;;:::o;15636:366::-;15778:3;15799:67;15863:2;15858:3;15799:67;:::i;:::-;15792:74;;15875:93;15964:3;15875:93;:::i;:::-;15993:2;15988:3;15984:12;15977:19;;15782:220;;;:::o;16008:366::-;16150:3;16171:67;16235:2;16230:3;16171:67;:::i;:::-;16164:74;;16247:93;16336:3;16247:93;:::i;:::-;16365:2;16360:3;16356:12;16349:19;;16154:220;;;:::o;16380:366::-;16522:3;16543:67;16607:2;16602:3;16543:67;:::i;:::-;16536:74;;16619:93;16708:3;16619:93;:::i;:::-;16737:2;16732:3;16728:12;16721:19;;16526:220;;;:::o;16752:366::-;16894:3;16915:67;16979:2;16974:3;16915:67;:::i;:::-;16908:74;;16991:93;17080:3;16991:93;:::i;:::-;17109:2;17104:3;17100:12;17093:19;;16898:220;;;:::o;17124:366::-;17266:3;17287:67;17351:2;17346:3;17287:67;:::i;:::-;17280:74;;17363:93;17452:3;17363:93;:::i;:::-;17481:2;17476:3;17472:12;17465:19;;17270:220;;;:::o;17496:366::-;17638:3;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17735:93;17824:3;17735:93;:::i;:::-;17853:2;17848:3;17844:12;17837:19;;17642:220;;;:::o;17868:366::-;18010:3;18031:67;18095:2;18090:3;18031:67;:::i;:::-;18024:74;;18107:93;18196:3;18107:93;:::i;:::-;18225:2;18220:3;18216:12;18209:19;;18014:220;;;:::o;18240:366::-;18382:3;18403:67;18467:2;18462:3;18403:67;:::i;:::-;18396:74;;18479:93;18568:3;18479:93;:::i;:::-;18597:2;18592:3;18588:12;18581:19;;18386:220;;;:::o;18612:366::-;18754:3;18775:67;18839:2;18834:3;18775:67;:::i;:::-;18768:74;;18851:93;18940:3;18851:93;:::i;:::-;18969:2;18964:3;18960:12;18953:19;;18758:220;;;:::o;18984:366::-;19126:3;19147:67;19211:2;19206:3;19147:67;:::i;:::-;19140:74;;19223:93;19312:3;19223:93;:::i;:::-;19341:2;19336:3;19332:12;19325:19;;19130:220;;;:::o;19356:366::-;19498:3;19519:67;19583:2;19578:3;19519:67;:::i;:::-;19512:74;;19595:93;19684:3;19595:93;:::i;:::-;19713:2;19708:3;19704:12;19697:19;;19502:220;;;:::o;19728:366::-;19870:3;19891:67;19955:2;19950:3;19891:67;:::i;:::-;19884:74;;19967:93;20056:3;19967:93;:::i;:::-;20085:2;20080:3;20076:12;20069:19;;19874:220;;;:::o;20100:366::-;20242:3;20263:67;20327:2;20322:3;20263:67;:::i;:::-;20256:74;;20339:93;20428:3;20339:93;:::i;:::-;20457:2;20452:3;20448:12;20441:19;;20246:220;;;:::o;20472:366::-;20614:3;20635:67;20699:2;20694:3;20635:67;:::i;:::-;20628:74;;20711:93;20800:3;20711:93;:::i;:::-;20829:2;20824:3;20820:12;20813:19;;20618:220;;;:::o;20844:366::-;20986:3;21007:67;21071:2;21066:3;21007:67;:::i;:::-;21000:74;;21083:93;21172:3;21083:93;:::i;:::-;21201:2;21196:3;21192:12;21185:19;;20990:220;;;:::o;21216:366::-;21358:3;21379:67;21443:2;21438:3;21379:67;:::i;:::-;21372:74;;21455:93;21544:3;21455:93;:::i;:::-;21573:2;21568:3;21564:12;21557:19;;21362:220;;;:::o;21588:366::-;21730:3;21751:67;21815:2;21810:3;21751:67;:::i;:::-;21744:74;;21827:93;21916:3;21827:93;:::i;:::-;21945:2;21940:3;21936:12;21929:19;;21734:220;;;:::o;21960:362::-;22101:3;22122:65;22185:1;22180:3;22122:65;:::i;:::-;22115:72;;22196:93;22285:3;22196:93;:::i;:::-;22314:1;22309:3;22305:11;22298:18;;22105:217;;;:::o;22328:398::-;22487:3;22508:83;22589:1;22584:3;22508:83;:::i;:::-;22501:90;;22600:93;22689:3;22600:93;:::i;:::-;22718:1;22713:3;22709:11;22702:18;;22491:235;;;:::o;22732:366::-;22874:3;22895:67;22959:2;22954:3;22895:67;:::i;:::-;22888:74;;22971:93;23060:3;22971:93;:::i;:::-;23089:2;23084:3;23080:12;23073:19;;22878:220;;;:::o;23104:118::-;23191:24;23209:5;23191:24;:::i;:::-;23186:3;23179:37;23169:53;;:::o;23228:157::-;23333:45;23353:24;23371:5;23353:24;:::i;:::-;23333:45;:::i;:::-;23328:3;23321:58;23311:74;;:::o;23391:397::-;23531:3;23546:75;23617:3;23608:6;23546:75;:::i;:::-;23646:2;23641:3;23637:12;23630:19;;23659:75;23730:3;23721:6;23659:75;:::i;:::-;23759:2;23754:3;23750:12;23743:19;;23779:3;23772:10;;23535:253;;;;;:::o;23794:429::-;23971:3;23993:92;24081:3;24072:6;23993:92;:::i;:::-;23986:99;;24102:95;24193:3;24184:6;24102:95;:::i;:::-;24095:102;;24214:3;24207:10;;23975:248;;;;;:::o;24229:379::-;24413:3;24435:147;24578:3;24435:147;:::i;:::-;24428:154;;24599:3;24592:10;;24417:191;;;:::o;24614:397::-;24754:3;24769:75;24840:3;24831:6;24769:75;:::i;:::-;24869:2;24864:3;24860:12;24853:19;;24882:75;24953:3;24944:6;24882:75;:::i;:::-;24982:2;24977:3;24973:12;24966:19;;25002:3;24995:10;;24758:253;;;;;:::o;25017:222::-;25110:4;25148:2;25137:9;25133:18;25125:26;;25161:71;25229:1;25218:9;25214:17;25205:6;25161:71;:::i;:::-;25115:124;;;;:::o;25245:640::-;25440:4;25478:3;25467:9;25463:19;25455:27;;25492:71;25560:1;25549:9;25545:17;25536:6;25492:71;:::i;:::-;25573:72;25641:2;25630:9;25626:18;25617:6;25573:72;:::i;:::-;25655;25723:2;25712:9;25708:18;25699:6;25655:72;:::i;:::-;25774:9;25768:4;25764:20;25759:2;25748:9;25744:18;25737:48;25802:76;25873:4;25864:6;25802:76;:::i;:::-;25794:84;;25445:440;;;;;;;:::o;25891:875::-;26176:4;26214:3;26203:9;26199:19;26191:27;;26228:71;26296:1;26285:9;26281:17;26272:6;26228:71;:::i;:::-;26309:72;26377:2;26366:9;26362:18;26353:6;26309:72;:::i;:::-;26391;26459:2;26448:9;26444:18;26435:6;26391:72;:::i;:::-;26473:80;26549:2;26538:9;26534:18;26525:6;26473:80;:::i;:::-;26601:9;26595:4;26591:20;26585:3;26574:9;26570:19;26563:49;26629:130;26754:4;26629:130;:::i;:::-;26621:138;;26181:585;;;;;;;:::o;26772:332::-;26893:4;26931:2;26920:9;26916:18;26908:26;;26944:71;27012:1;27001:9;26997:17;26988:6;26944:71;:::i;:::-;27025:72;27093:2;27082:9;27078:18;27069:6;27025:72;:::i;:::-;26898:206;;;;;:::o;27110:210::-;27197:4;27235:2;27224:9;27220:18;27212:26;;27248:65;27310:1;27299:9;27295:17;27286:6;27248:65;:::i;:::-;27202:118;;;;:::o;27326:222::-;27419:4;27457:2;27446:9;27442:18;27434:26;;27470:71;27538:1;27527:9;27523:17;27514:6;27470:71;:::i;:::-;27424:124;;;;:::o;27554:218::-;27645:4;27683:2;27672:9;27668:18;27660:26;;27696:69;27762:1;27751:9;27747:17;27738:6;27696:69;:::i;:::-;27650:122;;;;:::o;27778:313::-;27891:4;27929:2;27918:9;27914:18;27906:26;;27978:9;27972:4;27968:20;27964:1;27953:9;27949:17;27942:47;28006:78;28079:4;28070:6;28006:78;:::i;:::-;27998:86;;27896:195;;;;:::o;28097:419::-;28263:4;28301:2;28290:9;28286:18;28278:26;;28350:9;28344:4;28340:20;28336:1;28325:9;28321:17;28314:47;28378:131;28504:4;28378:131;:::i;:::-;28370:139;;28268:248;;;:::o;28522:419::-;28688:4;28726:2;28715:9;28711:18;28703:26;;28775:9;28769:4;28765:20;28761:1;28750:9;28746:17;28739:47;28803:131;28929:4;28803:131;:::i;:::-;28795:139;;28693:248;;;:::o;28947:419::-;29113:4;29151:2;29140:9;29136:18;29128:26;;29200:9;29194:4;29190:20;29186:1;29175:9;29171:17;29164:47;29228:131;29354:4;29228:131;:::i;:::-;29220:139;;29118:248;;;:::o;29372:419::-;29538:4;29576:2;29565:9;29561:18;29553:26;;29625:9;29619:4;29615:20;29611:1;29600:9;29596:17;29589:47;29653:131;29779:4;29653:131;:::i;:::-;29645:139;;29543:248;;;:::o;29797:419::-;29963:4;30001:2;29990:9;29986:18;29978:26;;30050:9;30044:4;30040:20;30036:1;30025:9;30021:17;30014:47;30078:131;30204:4;30078:131;:::i;:::-;30070:139;;29968:248;;;:::o;30222:419::-;30388:4;30426:2;30415:9;30411:18;30403:26;;30475:9;30469:4;30465:20;30461:1;30450:9;30446:17;30439:47;30503:131;30629:4;30503:131;:::i;:::-;30495:139;;30393:248;;;:::o;30647:419::-;30813:4;30851:2;30840:9;30836:18;30828:26;;30900:9;30894:4;30890:20;30886:1;30875:9;30871:17;30864:47;30928:131;31054:4;30928:131;:::i;:::-;30920:139;;30818:248;;;:::o;31072:419::-;31238:4;31276:2;31265:9;31261:18;31253:26;;31325:9;31319:4;31315:20;31311:1;31300:9;31296:17;31289:47;31353:131;31479:4;31353:131;:::i;:::-;31345:139;;31243:248;;;:::o;31497:419::-;31663:4;31701:2;31690:9;31686:18;31678:26;;31750:9;31744:4;31740:20;31736:1;31725:9;31721:17;31714:47;31778:131;31904:4;31778:131;:::i;:::-;31770:139;;31668:248;;;:::o;31922:419::-;32088:4;32126:2;32115:9;32111:18;32103:26;;32175:9;32169:4;32165:20;32161:1;32150:9;32146:17;32139:47;32203:131;32329:4;32203:131;:::i;:::-;32195:139;;32093:248;;;:::o;32347:419::-;32513:4;32551:2;32540:9;32536:18;32528:26;;32600:9;32594:4;32590:20;32586:1;32575:9;32571:17;32564:47;32628:131;32754:4;32628:131;:::i;:::-;32620:139;;32518:248;;;:::o;32772:419::-;32938:4;32976:2;32965:9;32961:18;32953:26;;33025:9;33019:4;33015:20;33011:1;33000:9;32996:17;32989:47;33053:131;33179:4;33053:131;:::i;:::-;33045:139;;32943:248;;;:::o;33197:419::-;33363:4;33401:2;33390:9;33386:18;33378:26;;33450:9;33444:4;33440:20;33436:1;33425:9;33421:17;33414:47;33478:131;33604:4;33478:131;:::i;:::-;33470:139;;33368:248;;;:::o;33622:419::-;33788:4;33826:2;33815:9;33811:18;33803:26;;33875:9;33869:4;33865:20;33861:1;33850:9;33846:17;33839:47;33903:131;34029:4;33903:131;:::i;:::-;33895:139;;33793:248;;;:::o;34047:419::-;34213:4;34251:2;34240:9;34236:18;34228:26;;34300:9;34294:4;34290:20;34286:1;34275:9;34271:17;34264:47;34328:131;34454:4;34328:131;:::i;:::-;34320:139;;34218:248;;;:::o;34472:419::-;34638:4;34676:2;34665:9;34661:18;34653:26;;34725:9;34719:4;34715:20;34711:1;34700:9;34696:17;34689:47;34753:131;34879:4;34753:131;:::i;:::-;34745:139;;34643:248;;;:::o;34897:419::-;35063:4;35101:2;35090:9;35086:18;35078:26;;35150:9;35144:4;35140:20;35136:1;35125:9;35121:17;35114:47;35178:131;35304:4;35178:131;:::i;:::-;35170:139;;35068:248;;;:::o;35322:419::-;35488:4;35526:2;35515:9;35511:18;35503:26;;35575:9;35569:4;35565:20;35561:1;35550:9;35546:17;35539:47;35603:131;35729:4;35603:131;:::i;:::-;35595:139;;35493:248;;;:::o;35747:419::-;35913:4;35951:2;35940:9;35936:18;35928:26;;36000:9;35994:4;35990:20;35986:1;35975:9;35971:17;35964:47;36028:131;36154:4;36028:131;:::i;:::-;36020:139;;35918:248;;;:::o;36172:419::-;36338:4;36376:2;36365:9;36361:18;36353:26;;36425:9;36419:4;36415:20;36411:1;36400:9;36396:17;36389:47;36453:131;36579:4;36453:131;:::i;:::-;36445:139;;36343:248;;;:::o;36597:222::-;36690:4;36728:2;36717:9;36713:18;36705:26;;36741:71;36809:1;36798:9;36794:17;36785:6;36741:71;:::i;:::-;36695:124;;;;:::o;36825:129::-;36859:6;36886:20;;:::i;:::-;36876:30;;36915:33;36943:4;36935:6;36915:33;:::i;:::-;36866:88;;;:::o;36960:75::-;36993:6;37026:2;37020:9;37010:19;;37000:35;:::o;37041:311::-;37118:4;37208:18;37200:6;37197:30;37194:2;;;37230:18;;:::i;:::-;37194:2;37280:4;37272:6;37268:17;37260:25;;37340:4;37334;37330:15;37322:23;;37123:229;;;:::o;37358:311::-;37435:4;37525:18;37517:6;37514:30;37511:2;;;37547:18;;:::i;:::-;37511:2;37597:4;37589:6;37585:17;37577:25;;37657:4;37651;37647:15;37639:23;;37440:229;;;:::o;37675:307::-;37736:4;37826:18;37818:6;37815:30;37812:2;;;37848:18;;:::i;:::-;37812:2;37886:29;37908:6;37886:29;:::i;:::-;37878:37;;37970:4;37964;37960:15;37952:23;;37741:241;;;:::o;37988:308::-;38050:4;38140:18;38132:6;38129:30;38126:2;;;38162:18;;:::i;:::-;38126:2;38200:29;38222:6;38200:29;:::i;:::-;38192:37;;38284:4;38278;38274:15;38266:23;;38055:241;;;:::o;38302:141::-;38351:4;38374:3;38366:11;;38397:3;38394:1;38387:14;38431:4;38428:1;38418:18;38410:26;;38356:87;;;:::o;38449:98::-;38500:6;38534:5;38528:12;38518:22;;38507:40;;;:::o;38553:99::-;38605:6;38639:5;38633:12;38623:22;;38612:40;;;:::o;38658:168::-;38741:11;38775:6;38770:3;38763:19;38815:4;38810:3;38806:14;38791:29;;38753:73;;;;:::o;38832:147::-;38933:11;38970:3;38955:18;;38945:34;;;;:::o;38985:169::-;39069:11;39103:6;39098:3;39091:19;39143:4;39138:3;39134:14;39119:29;;39081:73;;;;:::o;39160:148::-;39262:11;39299:3;39284:18;;39274:34;;;;:::o;39314:305::-;39354:3;39373:20;39391:1;39373:20;:::i;:::-;39368:25;;39407:20;39425:1;39407:20;:::i;:::-;39402:25;;39561:1;39493:66;39489:74;39486:1;39483:81;39480:2;;;39567:18;;:::i;:::-;39480:2;39611:1;39608;39604:9;39597:16;;39358:261;;;;:::o;39625:185::-;39665:1;39682:20;39700:1;39682:20;:::i;:::-;39677:25;;39716:20;39734:1;39716:20;:::i;:::-;39711:25;;39755:1;39745:2;;39760:18;;:::i;:::-;39745:2;39802:1;39799;39795:9;39790:14;;39667:143;;;;:::o;39816:348::-;39856:7;39879:20;39897:1;39879:20;:::i;:::-;39874:25;;39913:20;39931:1;39913:20;:::i;:::-;39908:25;;40101:1;40033:66;40029:74;40026:1;40023:81;40018:1;40011:9;40004:17;40000:105;39997:2;;;40108:18;;:::i;:::-;39997:2;40156:1;40153;40149:9;40138:20;;39864:300;;;;:::o;40170:191::-;40210:4;40230:20;40248:1;40230:20;:::i;:::-;40225:25;;40264:20;40282:1;40264:20;:::i;:::-;40259:25;;40303:1;40300;40297:8;40294:2;;;40308:18;;:::i;:::-;40294:2;40353:1;40350;40346:9;40338:17;;40215:146;;;;:::o;40367:96::-;40404:7;40433:24;40451:5;40433:24;:::i;:::-;40422:35;;40412:51;;;:::o;40469:90::-;40503:7;40546:5;40539:13;40532:21;40521:32;;40511:48;;;:::o;40565:77::-;40602:7;40631:5;40620:16;;40610:32;;;:::o;40648:149::-;40684:7;40724:66;40717:5;40713:78;40702:89;;40692:105;;;:::o;40803:126::-;40840:7;40880:42;40873:5;40869:54;40858:65;;40848:81;;;:::o;40935:77::-;40972:7;41001:5;40990:16;;40980:32;;;:::o;41018:121::-;41076:9;41109:24;41127:5;41109:24;:::i;:::-;41096:37;;41086:53;;;:::o;41145:154::-;41229:6;41224:3;41219;41206:30;41291:1;41282:6;41277:3;41273:16;41266:27;41196:103;;;:::o;41305:307::-;41373:1;41383:113;41397:6;41394:1;41391:13;41383:113;;;41482:1;41477:3;41473:11;41467:18;41463:1;41458:3;41454:11;41447:39;41419:2;41416:1;41412:10;41407:15;;41383:113;;;41514:6;41511:1;41508:13;41505:2;;;41594:1;41585:6;41580:3;41576:16;41569:27;41505:2;41354:258;;;;:::o;41618:320::-;41662:6;41699:1;41693:4;41689:12;41679:22;;41746:1;41740:4;41736:12;41767:18;41757:2;;41823:4;41815:6;41811:17;41801:27;;41757:2;41885;41877:6;41874:14;41854:18;41851:38;41848:2;;;41904:18;;:::i;:::-;41848:2;41669:269;;;;:::o;41944:281::-;42027:27;42049:4;42027:27;:::i;:::-;42019:6;42015:40;42157:6;42145:10;42142:22;42121:18;42109:10;42106:34;42103:62;42100:2;;;42168:18;;:::i;:::-;42100:2;42208:10;42204:2;42197:22;41987:238;;;:::o;42231:233::-;42270:3;42293:24;42311:5;42293:24;:::i;:::-;42284:33;;42339:66;42332:5;42329:77;42326:2;;;42409:18;;:::i;:::-;42326:2;42456:1;42449:5;42445:13;42438:20;;42274:190;;;:::o;42470:79::-;42509:7;42538:5;42527:16;;42517:32;;;:::o;42555:79::-;42594:7;42623:5;42612:16;;42602:32;;;:::o;42640:176::-;42672:1;42689:20;42707:1;42689:20;:::i;:::-;42684:25;;42723:20;42741:1;42723:20;:::i;:::-;42718:25;;42762:1;42752:2;;42767:18;;:::i;:::-;42752:2;42808:1;42805;42801:9;42796:14;;42674:142;;;;:::o;42822:180::-;42870:77;42867:1;42860:88;42967:4;42964:1;42957:15;42991:4;42988:1;42981:15;43008:180;43056:77;43053:1;43046:88;43153:4;43150:1;43143:15;43177:4;43174:1;43167:15;43194:180;43242:77;43239:1;43232:88;43339:4;43336:1;43329:15;43363:4;43360:1;43353:15;43380:180;43428:77;43425:1;43418:88;43525:4;43522:1;43515:15;43549:4;43546:1;43539:15;43566:102;43607:6;43658:2;43654:7;43649:2;43642:5;43638:14;43634:28;43624:38;;43614:54;;;:::o;43674:182::-;43814:34;43810:1;43802:6;43798:14;43791:58;43780:76;:::o;43862:225::-;44002:34;43998:1;43990:6;43986:14;43979:58;44071:8;44066:2;44058:6;44054:15;44047:33;43968:119;:::o;44093:170::-;44233:22;44229:1;44221:6;44217:14;44210:46;44199:64;:::o;44269:237::-;44409:34;44405:1;44397:6;44393:14;44386:58;44478:20;44473:2;44465:6;44461:15;44454:45;44375:131;:::o;44512:225::-;44652:34;44648:1;44640:6;44636:14;44629:58;44721:8;44716:2;44708:6;44704:15;44697:33;44618:119;:::o;44743:178::-;44883:30;44879:1;44871:6;44867:14;44860:54;44849:72;:::o;44927:223::-;45067:34;45063:1;45055:6;45051:14;45044:58;45136:6;45131:2;45123:6;45119:15;45112:31;45033:117;:::o;45156:175::-;45296:27;45292:1;45284:6;45280:14;45273:51;45262:69;:::o;45337:231::-;45477:34;45473:1;45465:6;45461:14;45454:58;45546:14;45541:2;45533:6;45529:15;45522:39;45443:125;:::o;45574:177::-;45714:29;45710:1;45702:6;45698:14;45691:53;45680:71;:::o;45757:243::-;45897:34;45893:1;45885:6;45881:14;45874:58;45966:26;45961:2;45953:6;45949:15;45942:51;45863:137;:::o;46006:229::-;46146:34;46142:1;46134:6;46130:14;46123:58;46215:12;46210:2;46202:6;46198:15;46191:37;46112:123;:::o;46241:228::-;46381:34;46377:1;46369:6;46365:14;46358:58;46450:11;46445:2;46437:6;46433:15;46426:36;46347:122;:::o;46475:182::-;46615:34;46611:1;46603:6;46599:14;46592:58;46581:76;:::o;46663:231::-;46803:34;46799:1;46791:6;46787:14;46780:58;46872:14;46867:2;46859:6;46855:15;46848:39;46769:125;:::o;46900:182::-;47040:34;47036:1;47028:6;47024:14;47017:58;47006:76;:::o;47088:170::-;47228:22;47224:1;47216:6;47212:14;47205:46;47194:64;:::o;47264:228::-;47404:34;47400:1;47392:6;47388:14;47381:58;47473:11;47468:2;47460:6;47456:15;47449:36;47370:122;:::o;47498:220::-;47638:34;47634:1;47626:6;47622:14;47615:58;47707:3;47702:2;47694:6;47690:15;47683:28;47604:114;:::o;47724:::-;47830:8;:::o;47844:236::-;47984:34;47980:1;47972:6;47968:14;47961:58;48053:19;48048:2;48040:6;48036:15;48029:44;47950:130;:::o;48086:122::-;48159:24;48177:5;48159:24;:::i;:::-;48152:5;48149:35;48139:2;;48198:1;48195;48188:12;48139:2;48129:79;:::o;48214:116::-;48284:21;48299:5;48284:21;:::i;:::-;48277:5;48274:32;48264:2;;48320:1;48317;48310:12;48264:2;48254:76;:::o;48336:122::-;48409:24;48427:5;48409:24;:::i;:::-;48402:5;48399:35;48389:2;;48448:1;48445;48438:12;48389:2;48379:79;:::o;48464:120::-;48536:23;48553:5;48536:23;:::i;:::-;48529:5;48526:34;48516:2;;48574:1;48571;48564:12;48516:2;48506:78;:::o;48590:122::-;48663:24;48681:5;48663:24;:::i;:::-;48656:5;48653:35;48643:2;;48702:1;48699;48692:12;48643:2;48633:79;:::o
Swarm Source
ipfs://9191939e9c4dab14b2c8f6569da8674f717d0aa71e49260fcbb8170b03952443
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.