Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 OCMONK
Holders
9,339
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 OCMONKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OnChainMonkey
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-17 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // @title: OnChainMonkey // @author: huuep // // On chain PFP collection of 10k unique profile images with the following properties: // - a single Ethereum transaction created everything // - all metadata on chain // - all images on chain in svg format // - all created in the constraints of a single txn without need of any other txns to load additional data // - no use of other deployed contracts // - all 10,000 OnChain Monkeys are unique // - there are 7 traits with 171 values (including 3 traits of no hat, no clothes, and no earring) // - the traits have distribution and rarities interesting for collecting // - everything on chain can be used in other apps and collections in the future // And did I say, Monkeys? /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } /** * @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); } /** * @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; } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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); } /** * @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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // Bring on the OnChain Monkeys! contract OnChainMonkey is ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint256; uint256 public constant maxSupply = 10000; uint256 public numClaimed = 0; string[] private background = ["656","dda","e92","1eb","663","9de","367","ccc"]; // only trait that is uniform, no need for rarity weights string[] private fur1 = ["653","532","444","a71","ffc","ca9","f89","777","049","901","fc5","ffe","574","bcc","d04","222","889","7f9","fd1"]; string[] private fur2 = ["532","653","653","653","653","653","653","653","653","653","110","653","711","344","799","555","8a8","32f","653"]; uint8[] private fur_w =[249, 246, 223, 141, 116, 114, 93, 90, 89, 86, 74, 72, 55, 48, 39, 32, 28, 14, 8]; string[] private eyes = ["abe","0a0","653","888","be7","abe","0a0","653","888","be7","cef","abe","0a0","653","888","be7","cef","abe","0a0","653","888","be7","cef"]; uint8[] private eyes_w = [245, 121, 107, 101, 79, 78, 70, 68, 62, 58, 56, 51, 50, 48, 44, 38, 35, 33, 31, 22, 15, 10, 7]; string[] private mouth = ["653","ffc","f89","777","049","901","bcc","d04","fd1","ffc","653","f89","777","049","bcc","901","901","bcc","653","d04","ffc","f89","777","049","fd1","f89","777","bcc","d04","049","ffc","901","fd1"]; uint8[] private mouth_w = [252, 172, 80, 79, 56, 49, 37, 33, 31, 30, 28, 27, 26, 23, 22, 18, 15, 14, 13, 12, 11, 10, 10, 10, 9, 8, 7, 7, 6, 5, 5, 4, 3]; string[] private earring = ["999","fe7","999","999","fe7","bdd"]; uint8[] private earring_w = [251, 32, 29, 17, 16, 8, 5]; string[] private clothes1 = ["f00","f00","222","f00","f00","f00","f00","f00","f00","00f","00f","00f","00f","00f","00f","00f","222","00f","f0f","222","f0f","f0f","f0f","f0f","f0f","f0f","f0f","f80","f80","f80","f80","f80","f00","f80","f80","f80","90f","90f","00f","90f","90f","90f","222"]; string[] private clothes2 = ["d00","00f","f00","f0f","f80","90f","f48","0f0","ff0","f00","00d","f0f","f80","90f","f48","0f0","ddd","ff0","f00","653","00f","d0d","f80","90f","f48","0f0","ff0","f00","f0f","00f","d60","f48","ddd","90f","0f0","ff0","f00","00f","fd1","f0f","f80","70d","fd1"]; uint8[] private clothes_w = [251, 55, 45, 43, 38, 37, 34, 33, 32, 31, 31, 31, 31, 31, 30, 30, 29, 29, 28, 27, 27, 27, 26, 25, 24, 22, 21, 20, 19, 19, 19, 19, 19, 19, 18, 17, 16, 15, 14, 13, 11, 9, 8, 6]; string[] private hat1 = ["f00","f00","f00","f00","f00","f00","f00","00f","00f","00f","00f","00f","00f","00f","f00","f0f","f0f","f0f","f0f","f0f","f0f","f0f","f80","f80","f80","f80","f80","f80","f00","f80","90f","f48","22d","90f","90f","ff0",""]; string[] private hat2 = ["0f0","00f","f80","ff0","90f","f0f","f48","f00","0f0","00f","f80","ff0","90f","f0f","000","f00","0f0","00f","f80","ff0","90f","f0f","f00","0f0","00f","f80","ff0","90f","f00","f0f","f00","000","000","0f0","00f","f48",""]; uint8[] private hat_w = [251, 64, 47, 42, 39, 38, 36, 35, 34, 34, 33, 29, 28, 26, 26, 25, 25, 25, 22, 21, 20, 20, 18, 17, 17, 15, 14, 14, 13, 13, 12, 12, 12, 10, 9, 8, 7]; string[] private z = ['<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 500 500"><rect x="0" y="0" width="500" height="500" style="fill:#', '"/><rect width="300" height="120" x="99" y="400" style="fill:#', '"/><circle cx="190" cy="470" r="5" style="fill:#', '"/><circle cx="310" cy="470" r="5" style="fill:#', '"/><circle cx="100" cy="250" r="50" style="fill:#', '"/><circle cx="100" cy="250" r="20" style="fill:#', '"/><circle cx="400" cy="250" r="50" style="fill:#', '"/><circle cx="400" cy="250" r="20" style="fill:#', '"/><circle cx="250" cy="250" r="150" style="fill:#', '"/><circle cx="250" cy="250" r="120" style="fill:#', '"/><circle cx="200" cy="215" r="35" style="fill:#fff"/><circle cx="305" cy="222" r="31" style="fill:#fff"/><circle cx="200" cy="220" r="20" style="fill:#', '"/><circle cx="300" cy="220" r="20" style="fill:#', '"/><circle cx="200" cy="220" r="7" style="fill:#000"/><circle cx="300" cy="220" r="7" style="fill:#000"/>', '<ellipse cx="250" cy="315" rx="84" ry="34" style="fill:#', '"/><rect x="195" y="330" width="110" height="3" style="fill:#000"/><circle cx="268" cy="295" r="5" style="fill:#000"/><circle cx="232" cy="295" r="5" style="fill:#000"/>', '</svg>']; string private cross='<rect x="95" y="275" width="10" height="40" style="fill:#872"/><rect x="85" y="285" width="30" height="10" style="fill:#872"/>'; string private clo1='<rect width="300" height="120" x="99" y="400" style="fill:#'; string private clo2='"/><rect width="50" height="55" x="280" y="430" style="fill:#'; string private hh1='<rect width="200" height="99" x="150" y="40" style="fill:#'; string private hh2='"/><rect width="200" height="33" x="150" y="106" style="fill:#'; string private sl1='<rect x="150" y="190" width="200" height="30" style="fill:#'; string private sl2='"/><rect x="160" y="170" width="180" height="50" style="fill:#'; string private mou='<line x1="287" y1="331" x2="320" y2="366" style="stroke:#000;stroke-width:5"/>'; string private ey1='<rect x="160" y="190" width="75" height="15" style="fill:#'; string private ey2='"/><rect x="275" y="190" width="65" height="15" style="fill:#'; string private ey3='<rect x="160" y="235" width="180" height="50" style="fill:#'; string private zz='"/>'; string private ea1='<circle cx="100" cy="290" r="14" style="fill:#'; string private ea2='fe7'; string private ea3='999'; string private ea4='"/><circle cx="100" cy="290" r="4" style="fill:#000"/>'; string private ea5='<circle cx="100" cy="290" r="12" style="fill:#'; string private ea6='bdd'; string private mo1='<line x1="'; string private mo2='" y1="307" x2="'; string private mo3='" y2="312" style="stroke:#000;stroke-width:2"/>'; string private mo4='" y1="317" x2="'; string private mo5='" y2="322" style="stroke:#000;stroke-width:2"/>'; string private tr1='", "attributes": [{"trait_type": "Background","value": "'; string private tr2='"},{"trait_type": "Fur","value": "'; string private tr3='"},{"trait_type": "Earring","value": "'; string private tr4='"},{"trait_type": "Hat","value": "'; string private tr5='"},{"trait_type": "Eyes","value": "'; string private tr6='"},{"trait_type": "Clothes","value": "'; string private tr7='"},{"trait_type": "Mouth","value": "'; string private tr8='"}],"image": "data:image/svg+xml;base64,'; string private ra1='A'; string private ra2='C'; string private ra3='D'; string private ra4='E'; string private ra5='F'; string private ra6='G'; string private co1=', '; string private rl1='{"name": "OnChain Monkey #'; string private rl3='"}'; string private rl4='data:application/json;base64,'; struct Ape { // a nod to BAYC, "ape" was shorter to type than monkey uint8 bg; uint8 fur; uint8 eyes; uint8 mouth; uint8 earring; uint8 clothes; uint8 hat; } // this was used to create the distributon of 10,000 and tested for uniqueness for the given parameters of this collection function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function usew(uint8[] memory w,uint256 i) internal pure returns (uint8) { uint8 ind=0; uint256 j=uint256(w[0]); while (j<=i) { ind++; j+=uint256(w[ind]); } return ind; } function randomOne(uint256 tokenId) internal view returns (Ape memory) { tokenId=12839-tokenId; // avoid dupes Ape memory ape; ape.bg = uint8(random(string(abi.encodePacked(ra1,tokenId.toString()))) % 8); ape.fur = usew(fur_w,random(string(abi.encodePacked(clo1,tokenId.toString())))%1817); ape.eyes = usew(eyes_w,random(string(abi.encodePacked(ra2,tokenId.toString())))%1429); ape.mouth = usew(mouth_w,random(string(abi.encodePacked(ra3,tokenId.toString())))%1112); ape.earring = usew(earring_w,random(string(abi.encodePacked(ra4,tokenId.toString())))%358); ape.clothes = usew(clothes_w,random(string(abi.encodePacked(ra5,tokenId.toString())))%1329); ape.hat = usew(hat_w,random(string(abi.encodePacked(ra6,tokenId.toString())))%1111); if (tokenId==7403) { ape.hat++; // perturb dupe } return ape; } // get string attributes of properties, used in tokenURI call function getTraits(Ape memory ape) internal view returns (string memory) { string memory o=string(abi.encodePacked(tr1,uint256(ape.bg).toString(),tr2,uint256(ape.fur).toString(),tr3,uint256(ape.earring).toString())); return string(abi.encodePacked(o,tr4,uint256(ape.hat).toString(),tr5,uint256(ape.eyes).toString(),tr6,uint256(ape.clothes).toString(),tr7,uint256(ape.mouth).toString(),tr8)); } // return comma separated traits in order: hat, fur, clothes, eyes, earring, mouth, background function getAttributes(uint256 tokenId) public view returns (string memory) { Ape memory ape = randomOne(tokenId); string memory o=string(abi.encodePacked(uint256(ape.hat).toString(),co1,uint256(ape.fur).toString(),co1,uint256(ape.clothes).toString(),co1)); return string(abi.encodePacked(o,uint256(ape.eyes).toString(),co1,uint256(ape.earring).toString(),co1,uint256(ape.mouth).toString(),co1,uint256(ape.bg).toString())); } function genEye(string memory a,string memory b,uint8 h) internal view returns (string memory) { string memory out = ''; if (h>4) { out = string(abi.encodePacked(sl1,a,sl2,a,zz)); } if (h>10) { out = string(abi.encodePacked(out,ey1,b,ey2,b,zz)); } if (h>16) { out = string(abi.encodePacked(out,ey3,a,zz)); } return out; } function genMouth(uint8 h) internal view returns (string memory) { string memory out = ''; uint i; if ((h>24) || ((h>8) && (h<16))) { for (i=0;i<7;i++) { out = string(abi.encodePacked(out,mo1,(175+i*25).toString(),mo2,(175+i*25).toString(),mo3)); } for (i=0;i<6;i++) { out = string(abi.encodePacked(out,mo1,(187+i*25).toString(),mo4,(187+i*25).toString(),mo5)); } } if (h>15) { out = string(abi.encodePacked(out,mou)); } return out; } function genEarring(uint8 h) internal view returns (string memory) { if (h==0) { return ''; } if (h<3) { if (h>1) { return string(abi.encodePacked(ea1,ea2,ea4)); } return string(abi.encodePacked(ea1,ea3,ea4)); } if (h>3) { if (h>5) { return string(abi.encodePacked(ea5,ea6,zz)); } if (h>4) { return string(abi.encodePacked(ea5,ea2,zz)); } return string(abi.encodePacked(ea5,ea3,zz)); } return cross; } function genSVG(Ape memory ape) internal view returns (string memory) { string memory a=fur1[ape.fur]; string memory b=fur2[ape.fur]; string memory hatst=''; string memory clost=''; if (ape.clothes>0) { clost=string(abi.encodePacked(clo1,clothes1[ape.clothes-1],clo2,clothes2[ape.clothes-1],zz)); } if (ape.hat>0) { hatst=string(abi.encodePacked(hh1,hat1[ape.hat-1],hh2,hat2[ape.hat-1],zz)); } string memory output = string(abi.encodePacked(z[0],background[ape.bg],z[1],b,z[2])); output = string(abi.encodePacked(output,a,z[3],a,z[4],b,z[5],a,z[6])); output = string(abi.encodePacked(output,b,z[7],a,z[8],b,z[9],a,z[10])); output = string(abi.encodePacked(output,eyes[ape.eyes],z[11],eyes[ape.eyes],z[12],genEye(a,b,ape.eyes),z[13],mouth[ape.mouth],z[14])); return string(abi.encodePacked(output,genMouth(ape.mouth),genEarring(ape.earring),hatst,clost,z[15])); } function tokenURI(uint256 tokenId) override public view returns (string memory) { Ape memory ape = randomOne(tokenId); return string(abi.encodePacked(rl4,Base64.encode(bytes(string(abi.encodePacked(rl1,tokenId.toString(),getTraits(ape),Base64.encode(bytes(genSVG(ape))),rl3)))))); } function claim() public nonReentrant { require(numClaimed >= 0 && numClaimed < 9500, "invalid claim"); _safeMint(_msgSender(), numClaimed + 1); numClaimed += 1; } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 9500 && tokenId < 10001, "invalid claim"); _safeMint(owner(), tokenId); } constructor() ERC721("OnChainMonkey", "OCMONK") Ownable() {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c556040518061010001604052806040518060400160405280600381526020017f363536000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646461000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f653932000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f316562000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363633000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f396465000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333637000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6363630000000000000000000000000000000000000000000000000000000000815250815250600d906008620001fd9291906200535e565b506040518061026001604052806040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353332000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f343434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f613731000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636139000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666335000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666665000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353734000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f376639000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250600e9060136200067b929190620053c5565b506040518061026001604052806040518060400160405280600381526020017f353332000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f313130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373131000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333434000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f353535000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f386138000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f333266000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3635330000000000000000000000000000000000000000000000000000000000815250815250600f90601362000af9929190620053c5565b5060405180610260016040528060f960ff16815260200160f660ff16815260200160df60ff168152602001608d60ff168152602001607460ff168152602001607260ff168152602001605d60ff168152602001605a60ff168152602001605960ff168152602001605660ff168152602001604a60ff168152602001604860ff168152602001603760ff168152602001603060ff168152602001602760ff168152602001602060ff168152602001601c60ff168152602001600e60ff168152602001600860ff16815250601090601362000bd49291906200542c565b50604051806102e001604052806040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f616265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306130000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636566000000000000000000000000000000000000000000000000000000000081525081525060119060176200113e929190620054da565b50604051806102e0016040528060f560ff168152602001607960ff168152602001606b60ff168152602001606560ff168152602001604f60ff168152602001604e60ff168152602001604660ff168152602001604460ff168152602001603e60ff168152602001603a60ff168152602001603860ff168152602001603360ff168152602001603260ff168152602001603060ff168152602001602c60ff168152602001602660ff168152602001602360ff168152602001602160ff168152602001601f60ff168152602001601660ff168152602001600f60ff168152602001600a60ff168152602001600760ff1681525060129060176200124192919062005541565b506040518061042001604052806040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663839000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373737000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626363000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643034000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303439000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666663000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393031000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f66643100000000000000000000000000000000000000000000000000000000008152508152506013906021620019f9929190620055ef565b5060405180610420016040528060fc60ff16815260200160ac60ff168152602001605060ff168152602001604f60ff168152602001603860ff168152602001603160ff168152602001602560ff168152602001602160ff168152602001601f60ff168152602001601e60ff168152602001601c60ff168152602001601b60ff168152602001601a60ff168152602001601760ff168152602001601660ff168152602001601260ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600c60ff168152602001600b60ff168152602001600a60ff168152602001600a60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff168152602001600760ff168152602001600660ff168152602001600560ff168152602001600560ff168152602001600460ff168152602001600360ff16815250601490602162001b6092919062005656565b506040518060c001604052806040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393939000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666537000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250815250601590600662001cde92919062005704565b506040518060e0016040528060fb60ff168152602001602060ff168152602001601d60ff168152602001601160ff168152602001601060ff168152602001600860ff168152602001600560ff16815250601690600762001d409291906200576b565b506040518061056001604052806040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323232000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3232320000000000000000000000000000000000000000000000000000000000815250815250601790602b6200274692919062005819565b506040518061056001604052806040518060400160405280600381526020017f643030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f363533000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f643630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f646464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666431000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f373064000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6664310000000000000000000000000000000000000000000000000000000000815250815250601890602b6200314c92919062005819565b5060405180610580016040528060fb60ff168152602001603760ff168152602001602d60ff168152602001602b60ff168152602001602660ff168152602001602560ff168152602001602260ff168152602001602160ff168152602001602060ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601f60ff168152602001601e60ff168152602001601e60ff168152602001601d60ff168152602001601d60ff168152602001601c60ff168152602001601b60ff168152602001601b60ff168152602001601b60ff168152602001601a60ff168152602001601960ff168152602001601860ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601360ff168152602001601260ff168152602001601160ff168152602001601060ff168152602001600f60ff168152602001600e60ff168152602001600d60ff168152602001600b60ff168152602001600960ff168152602001600860ff168152602001600660ff16815250601990602c6200332192919062005880565b50604051806104a001604052806040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f323264000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6666300000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601a90602562003b9f9291906200592e565b50604051806104a001604052806040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663438000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663830000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f393066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f663030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303030000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f306630000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f303066000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6634380000000000000000000000000000000000000000000000000000000000815250815260200160405180602001604052806000815250815250601b9060256200441d9291906200592e565b50604051806104a0016040528060fb60ff168152602001604060ff168152602001602f60ff168152602001602a60ff168152602001602760ff168152602001602660ff168152602001602460ff168152602001602360ff168152602001602260ff168152602001602260ff168152602001602160ff168152602001601d60ff168152602001601c60ff168152602001601a60ff168152602001601a60ff168152602001601960ff168152602001601960ff168152602001601960ff168152602001601660ff168152602001601560ff168152602001601460ff168152602001601460ff168152602001601260ff168152602001601160ff168152602001601160ff168152602001600f60ff168152602001600e60ff168152602001600e60ff168152602001600d60ff168152602001600d60ff168152602001600c60ff168152602001600c60ff168152602001600c60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff16815250601c906025620045ac92919062005995565b506040518061020001604052806040518060c00160405280609a81526020016200ae2e609a913981526020016040518060600160405280603e81526020016200b268603e913981526020016040518060600160405280603081526020016200ad036030913981526020016040518060600160405280603081526020016200b17a6030913981526020016040518060600160405280603181526020016200b1496031913981526020016040518060600160405280603181526020016200af7f6031913981526020016040518060600160405280603181526020016200adfd6031913981526020016040518060600160405280603181526020016200b52b6031913981526020016040518060600160405280603281526020016200b0a66032913981526020016040518060600160405280603281526020016200b55c6032913981526020016040518060c00160405280609981526020016200ad646099913981526020016040518060600160405280603181526020016200ad336031913981526020016040518060a00160405280606981526020016200b1ff6069913981526020016040518060600160405280603881526020016200b3c76038913981526020016040518060e0016040528060a981526020016200b2a660a9913981526020016040518060400160405280600681526020017f3c2f7376673e0000000000000000000000000000000000000000000000000000815250815250601d906010620047d592919062005a43565b506040518060a00160405280607e81526020016200afed607e9139601e90805190602001906200480792919062005aaa565b506040518060600160405280603b81526020016200af44603b9139601f90805190602001906200483992919062005aaa565b506040518060600160405280603d81526020016200afb0603d9139602090805190602001906200486b92919062005aaa565b506040518060600160405280603a81526020016200b34f603a9139602190805190602001906200489d92919062005aaa565b506040518060600160405280603e81526020016200b389603e913960229080519060200190620048cf92919062005aaa565b506040518060600160405280603b81526020016200b06b603b9139602390805190602001906200490192919062005aaa565b506040518060600160405280603e81526020016200b439603e9139602490805190602001906200493392919062005aaa565b506040518060800160405280604e81526020016200b0d8604e9139602590805190602001906200496592919062005aaa565b506040518060600160405280603a81526020016200b3ff603a9139602690805190602001906200499792919062005aaa565b506040518060600160405280603d81526020016200b499603d913960279080519060200190620049c992919062005aaa565b506040518060600160405280603b81526020016200b5ea603b913960289080519060200190620049fb92919062005aaa565b506040518060400160405280600381526020017f222f3e00000000000000000000000000000000000000000000000000000000008152506029908051906020019062004a4992919062005aaa565b506040518060600160405280602e81526020016200b58e602e9139602a908051906020019062004a7b92919062005aaa565b506040518060400160405280600381526020017f6665370000000000000000000000000000000000000000000000000000000000815250602b908051906020019062004ac992919062005aaa565b506040518060400160405280600381526020017f3939390000000000000000000000000000000000000000000000000000000000815250602c908051906020019062004b1792919062005aaa565b506040518060600160405280603681526020016200af0e60369139602d908051906020019062004b4992919062005aaa565b506040518060600160405280602e81526020016200b5bc602e9139602e908051906020019062004b7b92919062005aaa565b506040518060400160405280600381526020017f6264640000000000000000000000000000000000000000000000000000000000815250602f908051906020019062004bc992919062005aaa565b506040518060400160405280600a81526020017f3c6c696e652078313d22000000000000000000000000000000000000000000008152506030908051906020019062004c1792919062005aaa565b506040518060400160405280600f81526020017f222079313d22333037222078323d2200000000000000000000000000000000008152506031908051906020019062004c6592919062005aaa565b506040518060600160405280602f81526020016200b4fc602f91396032908051906020019062004c9792919062005aaa565b506040518060400160405280600f81526020017f222079313d22333137222078323d2200000000000000000000000000000000008152506033908051906020019062004ce592919062005aaa565b506040518060600160405280602f81526020016200b1aa602f91396034908051906020019062004d1792919062005aaa565b506040518060600160405280603881526020016200accb603891396035908051906020019062004d4992919062005aaa565b506040518060600160405280602281526020016200aeec602291396036908051906020019062004d7b92919062005aaa565b506040518060600160405280602681526020016200b4d6602691396037908051906020019062004dad92919062005aaa565b506040518060600160405280602281526020016200b477602291396038908051906020019062004ddf92919062005aaa565b506040518060600160405280602381526020016200b126602391396039908051906020019062004e1192919062005aaa565b506040518060600160405280602681526020016200b1d960269139603a908051906020019062004e4392919062005aaa565b506040518060600160405280602481526020016200aec860249139603b908051906020019062004e7592919062005aaa565b506040518060600160405280602881526020016200aca360289139603c908051906020019062004ea792919062005aaa565b506040518060400160405280600181526020017f4100000000000000000000000000000000000000000000000000000000000000815250603d908051906020019062004ef592919062005aaa565b506040518060400160405280600181526020017f4300000000000000000000000000000000000000000000000000000000000000815250603e908051906020019062004f4392919062005aaa565b506040518060400160405280600181526020017f4400000000000000000000000000000000000000000000000000000000000000815250603f908051906020019062004f9192919062005aaa565b506040518060400160405280600181526020017f45000000000000000000000000000000000000000000000000000000000000008152506040908051906020019062004fdf92919062005aaa565b506040518060400160405280600181526020017f4600000000000000000000000000000000000000000000000000000000000000815250604190805190602001906200502d92919062005aaa565b506040518060400160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250604290805190602001906200507b92919062005aaa565b506040518060400160405280600281526020017f2c2000000000000000000000000000000000000000000000000000000000000081525060439080519060200190620050c992919062005aaa565b506040518060400160405280601a81526020017f7b226e616d65223a20224f6e436861696e204d6f6e6b65792023000000000000815250604490805190602001906200511792919062005aaa565b506040518060400160405280600281526020017f227d000000000000000000000000000000000000000000000000000000000000815250604590805190602001906200516592919062005aaa565b506040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525060469080519060200190620051b392919062005aaa565b50348015620051c157600080fd5b506040518060400160405280600d81526020017f4f6e436861696e4d6f6e6b6579000000000000000000000000000000000000008152506040518060400160405280600681526020017f4f434d4f4e4b000000000000000000000000000000000000000000000000000081525081600090805190602001906200524692919062005aaa565b5080600190805190602001906200525f92919062005aaa565b5050506001600a819055506200528a6200527e6200529060201b60201c565b6200529860201b60201c565b62005c2d565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620053b2579160200282015b82811115620053b1578251829080519060200190620053a092919062005aaa565b50916020019190600101906200537f565b5b509050620053c1919062005b3b565b5090565b82805482825590600052602060002090810192821562005419579160200282015b82811115620054185782518290805190602001906200540792919062005aaa565b5091602001919060010190620053e6565b5b50905062005428919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620054c75791602002820160005b838211156200549657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005456565b8015620054c55782816101000a81549060ff021916905560010160208160000104928301926001030262005496565b505b509050620054d6919062005b63565b5090565b8280548282559060005260206000209081019282156200552e579160200282015b828111156200552d5782518290805190602001906200551c92919062005aaa565b5091602001919060010190620054fb565b5b5090506200553d919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620055dc5791602002820160005b83821115620055ab57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200556b565b8015620055da5782816101000a81549060ff0219169055600101602081600001049283019260010302620055ab565b505b509050620055eb919062005b63565b5090565b82805482825590600052602060002090810192821562005643579160200282015b82811115620056425782518290805190602001906200563192919062005aaa565b509160200191906001019062005610565b5b50905062005652919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620056f15791602002820160005b83821115620056c057835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005680565b8015620056ef5782816101000a81549060ff0219169055600101602081600001049283019260010302620056c0565b505b50905062005700919062005b63565b5090565b82805482825590600052602060002090810192821562005758579160200282015b82811115620057575782518290805190602001906200574692919062005aaa565b509160200191906001019062005725565b5b50905062005767919062005b3b565b5090565b82805482825590600052602060002090601f01602090048101928215620058065791602002820160005b83821115620057d557835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262005795565b8015620058045782816101000a81549060ff0219169055600101602081600001049283019260010302620057d5565b505b50905062005815919062005b63565b5090565b8280548282559060005260206000209081019282156200586d579160200282015b828111156200586c5782518290805190602001906200585b92919062005aaa565b50916020019190600101906200583a565b5b5090506200587c919062005b3b565b5090565b82805482825590600052602060002090601f016020900481019282156200591b5791602002820160005b83821115620058ea57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620058aa565b8015620059195782816101000a81549060ff0219169055600101602081600001049283019260010302620058ea565b505b5090506200592a919062005b63565b5090565b82805482825590600052602060002090810192821562005982579160200282015b82811115620059815782518290805190602001906200597092919062005aaa565b50916020019190600101906200594f565b5b50905062005991919062005b3b565b5090565b82805482825590600052602060002090601f0160209004810192821562005a305791602002820160005b83821115620059ff57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620059bf565b801562005a2e5782816101000a81549060ff0219169055600101602081600001049283019260010302620059ff565b505b50905062005a3f919062005b63565b5090565b82805482825590600052602060002090810192821562005a97579160200282015b8281111562005a9657825182908051906020019062005a8592919062005aaa565b509160200191906001019062005a64565b5b50905062005aa6919062005b3b565b5090565b82805462005ab89062005bc8565b90600052602060002090601f01602090048101928262005adc576000855562005b28565b82601f1062005af757805160ff191683800117855562005b28565b8280016001018555821562005b28579182015b8281111562005b2757825182559160200191906001019062005b0a565b5b50905062005b37919062005b63565b5090565b5b8082111562005b5f576000818162005b55919062005b82565b5060010162005b3c565b5090565b5b8082111562005b7e57600081600090555060010162005b64565b5090565b50805462005b909062005bc8565b6000825580601f1062005ba4575062005bc5565b601f01602090049060005260206000209081019062005bc4919062005b63565b5b50565b6000600282049050600182168062005be157607f821691505b6020821081141562005bf85762005bf762005bfe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6150668062005c3d6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b80632f745c59116101155780632f745c591461023157806342842e0e14610261578063434f48c41461027d5780634378a6e3146102995780634e71d92d146102c95780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b6101776004803603810190610172919061390f565b610499565b60405161018491906142e3565b60405180910390f35b610195610513565b6040516101a291906142fe565b60405180910390f35b6101c560048036038101906101c09190613969565b6105a5565b6040516101d2919061427c565b60405180910390f35b6101f560048036038101906101f091906138cf565b61062a565b005b6101ff610742565b60405161020c9190614580565b60405180910390f35b61022f600480360381019061022a91906137b9565b61074f565b005b61024b600480360381019061024691906138cf565b6107af565b6040516102589190614580565b60405180910390f35b61027b600480360381019061027691906137b9565b610854565b005b61029760048036038101906102929190613969565b610874565b005b6102b360048036038101906102ae9190613969565b6109ab565b6040516102c091906142fe565b60405180910390f35b6102d1610a8e565b005b6102ed60048036038101906102e89190613969565b610b74565b6040516102fa9190614580565b60405180910390f35b61031d60048036038101906103189190613969565b610be5565b60405161032a919061427c565b60405180910390f35b61034d6004803603810190610348919061374c565b610c97565b60405161035a9190614580565b60405180910390f35b61036b610d4f565b005b610375610dd7565b604051610382919061427c565b60405180910390f35b610393610e01565b6040516103a091906142fe565b60405180910390f35b6103b1610e93565b6040516103be9190614580565b60405180910390f35b6103e160048036038101906103dc919061388f565b610e99565b005b6103fd60048036038101906103f8919061380c565b61101a565b005b61041960048036038101906104149190613969565b61107c565b60405161042691906142fe565b60405180910390f35b610437611107565b6040516104449190614580565b60405180910390f35b61046760048036038101906104629190613779565b61110d565b60405161047491906142e3565b60405180910390f35b6104976004803603810190610492919061374c565b6111a1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611299565b5b9050919050565b60606000805461052290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90614855565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b08261137b565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56113e7565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6113e7565b61110d565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a90614400565b60405180910390fd5b61073d83836113ef565b505050565b6000600880549050905090565b61076061075a6113e7565b826114a8565b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690614500565b60405180910390fd5b6107aa838383611586565b505050565b60006107ba83610c97565b82106107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f290614320565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61086f8383836040518060200160405280600081525061101a565b505050565b6002600a5414156108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190614560565b60405180910390fd5b6002600a819055506108ca6113e7565b73ffffffffffffffffffffffffffffffffffffffff166108e8610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461093e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610935906144a0565b60405180910390fd5b61251c81118015610950575061271181105b61098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690614540565b60405180910390fd5b6109a061099a610dd7565b826117e2565b6001600a8190555050565b606060006109b883611800565b905060006109cc8260c0015160ff16611d80565b60436109de846020015160ff16611d80565b60436109f08660a0015160ff16611d80565b6043604051602001610a0796959493929190613f40565b604051602081830303815290604052905080610a29836040015160ff16611d80565b6043610a3b856080015160ff16611d80565b6043610a4d876060015160ff16611d80565b6043610a5f896000015160ff16611d80565b604051602001610a76989796959493929190613ded565b60405160208183030381529060405292505050919050565b6002600a541415610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90614560565b60405180910390fd5b6002600a819055506000600c5410158015610af2575061251c600c54105b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614540565b60405180910390fd5b610b50610b3c6113e7565b6001600c54610b4b9190614649565b6117e2565b6001600c6000828254610b639190614649565b925050819055506001600a81905550565b6000610b7e610742565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690614520565b60405180910390fd5b60088281548110610bd357610bd2614a18565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614440565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d576113e7565b73ffffffffffffffffffffffffffffffffffffffff16610d75610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906144a0565b60405180910390fd5b610dd56000611ee1565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1090614855565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614855565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b600c5481565b610ea16113e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906143c0565b60405180910390fd5b8060056000610f1c6113e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc96113e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906142e3565b60405180910390a35050565b61102b6110256113e7565b836114a8565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614500565b60405180910390fd5b61107684848484611fa7565b50505050565b6060600061108983611800565b905060466110df604461109b86611d80565b6110a485612003565b6110b56110b0876120de565b612736565b60456040516020016110cb9594939291906140c7565b604051602081830303815290604052612736565b6040516020016110f09291906140a3565b604051602081830303815290604052915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a96113e7565b73ffffffffffffffffffffffffffffffffffffffff166111c7610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461121d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611214906144a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614360565b60405180910390fd5b61129681611ee1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061136457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113745750611373826128ce565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661146283610be5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114b38261137b565b6114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e9906143e0565b60405180910390fd5b60006114fd83610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061156c57508373ffffffffffffffffffffffffffffffffffffffff16611554846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061157d575061157c818561110d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115a682610be5565b73ffffffffffffffffffffffffffffffffffffffff16146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f3906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906143a0565b60405180910390fd5b611677838383612938565b6116826000826113ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116d2919061472a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117299190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6117fc828260405180602001604052806000815250612a4c565b5050565b611808613621565b81613227611816919061472a565b9150611820613621565b6008611855603d61183086611d80565b6040516020016118419291906140a3565b604051602081830303815290604052612aa7565b61185f919061492b565b816000019060ff16908160ff168152505061192f60108054806020026020016040519081016040528092919081815260200182805480156118e557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118ae5790505b5050505050610719611920601f6118fb88611d80565b60405160200161190c9291906140a3565b604051602081830303815290604052612aa7565b61192a919061492b565b612ada565b816020019060ff16908160ff16815250506119ff60128054806020026020016040519081016040528092919081815260200182805480156119b557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161197e5790505b50505050506105956119f0603e6119cb88611d80565b6040516020016119dc9291906140a3565b604051602081830303815290604052612aa7565b6119fa919061492b565b612ada565b816040019060ff16908160ff1681525050611acf6014805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a4e5790505b5050505050610458611ac0603f611a9b88611d80565b604051602001611aac9291906140a3565b604051602081830303815290604052612aa7565b611aca919061492b565b612ada565b816060019060ff16908160ff1681525050611b9f6016805480602002602001604051908101604052809291908181526020018280548015611b5557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b1e5790505b5050505050610166611b906040611b6b88611d80565b604051602001611b7c9291906140a3565b604051602081830303815290604052612aa7565b611b9a919061492b565b612ada565b816080019060ff16908160ff1681525050611c6f6019805480602002602001604051908101604052809291908181526020018280548015611c2557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611bee5790505b5050505050610531611c606041611c3b88611d80565b604051602001611c4c9291906140a3565b604051602081830303815290604052612aa7565b611c6a919061492b565b612ada565b8160a0019060ff16908160ff1681525050611d3f601c805480602002602001604051908101604052809291908181526020018280548015611cf557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cbe5790505b5050505050610457611d306042611d0b88611d80565b604051602001611d1c9291906140a3565b604051602081830303815290604052612aa7565b611d3a919061492b565b612ada565b8160c0019060ff16908160ff1681525050611ceb831415611d77578060c0018051809190611d6c90614901565b60ff1660ff16815250505b80915050919050565b60606000821415611dc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611edc565b600082905060005b60008214611dfa578080611de3906148b8565b915050600a82611df3919061469f565b9150611dd0565b60008167ffffffffffffffff811115611e1657611e15614a47565b5b6040519080825280601f01601f191660200182016040528015611e485781602001600182028036833780820191505090505b5090505b60008514611ed557600182611e61919061472a565b9150600a85611e70919061492b565b6030611e7c9190614649565b60f81b818381518110611e9257611e91614a18565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ece919061469f565b9450611e4c565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb2848484611586565b611fbe84848484612b58565b611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614340565b60405180910390fd5b50505050565b606060006035612019846000015160ff16611d80565b603661202b866020015160ff16611d80565b603761203d886080015160ff16611d80565b6040516020016120529695949392919061415d565b60405160208183030381529060405290508060386120768560c0015160ff16611d80565b6039612088876040015160ff16611d80565b603a61209a8960a0015160ff16611d80565b603b6120ac8b6060015160ff16611d80565b603c6040516020016120c79a99989796959493929190613f98565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120fd576120fc614a18565b5b90600052602060002001805461211290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461213e90614855565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b505050505090506000600f846020015160ff16815481106121af576121ae614a18565b5b9060005260206000200180546121c490614855565b80601f01602080910402602001604051908101604052809291908181526020018280546121f090614855565b801561223d5780601f106122125761010080835404028352916020019161223d565b820191906000526020600020905b81548152906001019060200180831161222057829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230a57601f601760018860a00151612291919061475e565b60ff16815481106122a5576122a4614a18565b5b906000526020600020016020601860018a60a001516122c4919061475e565b60ff16815481106122d8576122d7614a18565b5b9060005260206000200160296040516020016122f8959493929190614231565b60405160208183030381529060405290505b60008660c0015160ff1611156123a8576021601a60018860c0015161232f919061475e565b60ff168154811061234357612342614a18565b5b906000526020600020016022601b60018a60c00151612362919061475e565b60ff168154811061237657612375614a18565b5b906000526020600020016029604051602001612396959493929190614231565b60405160208183030381529060405291505b6000601d6000815481106123bf576123be614a18565b5b90600052602060002001600d886000015160ff16815481106123e4576123e3614a18565b5b90600052602060002001601d60018154811061240357612402614a18565b5b9060005260206000200186601d60028154811061242357612422614a18565b5b906000526020600020016040516020016124419594939291906141e6565b60405160208183030381529060405290508085601d60038154811061246957612468614a18565b5b9060005260206000200187601d60048154811061248957612488614a18565b5b9060005260206000200188601d6005815481106124a9576124a8614a18565b5b906000526020600020018b601d6006815481106124c9576124c8614a18565b5b906000526020600020016040516020016124eb99989796959493929190613e5f565b60405160208183030381529060405290508084601d60078154811061251357612512614a18565b5b9060005260206000200187601d60088154811061253357612532614a18565b5b9060005260206000200188601d60098154811061255357612552614a18565b5b906000526020600020018b601d600a8154811061257357612572614a18565b5b9060005260206000200160405160200161259599989796959493929190613e5f565b6040516020818303038152906040529050806011886040015160ff16815481106125c2576125c1614a18565b5b90600052602060002001601d600b815481106125e1576125e0614a18565b5b9060005260206000200160118a6040015160ff168154811061260657612605614a18565b5b90600052602060002001601d600c8154811061262557612624614a18565b5b9060005260206000200161263e8a8a8e60400151612cef565b601d600d8154811061265357612652614a18565b5b9060005260206000200160138e6060015160ff168154811061267857612677614a18565b5b90600052602060002001601d600e8154811061269757612696614a18565b5b906000526020600020016040516020016126b999989796959493929190614024565b6040516020818303038152906040529050806126d88860600151612dbd565b6126e58960800151612f5b565b8585601d600f815481106126fc576126fb614a18565b5b9060005260206000200160405160200161271b96959493929190613d95565b60405160208183030381529060405295505050505050919050565b6060600082519050600081141561275f57604051806020016040528060008152509150506128c9565b600060036002836127709190614649565b61277a919061469f565b600461278691906146d0565b905060006020826127979190614649565b67ffffffffffffffff8111156127b0576127af614a47565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614ff1604091399050600181016020830160005b868110156128865760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061280d565b5060038606600181146128a057600281146128b0576128bb565b613d3d60f01b60028303526128bb565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612943838383613135565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612986576129818161313a565b6129c5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129c4576129c38382613183565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0857612a03816132f0565b612a47565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a4657612a4582826133c1565b5b5b505050565b612a568383613440565b612a636000848484612b58565b612aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9990614340565b60405180910390fd5b505050565b600081604051602001612aba9190613d7e565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612af757612af6614a18565b5b602002602001015160ff1690505b838111612b4d578180612b1790614901565b925050848260ff1681518110612b3057612b2f614a18565b5b602002602001015160ff1681612b469190614649565b9050612b05565b819250505092915050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff1661360e565b15612ce2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ba26113e7565b8786866040518563ffffffff1660e01b8152600401612bc49493929190614297565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c919061393c565b60015b612c92573d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b50600081511415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614340565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce7565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d3f576023856024876029604051602001612d2d959493929190614112565b60405160208183030381529060405290505b600a8360ff161115612d7b57806026856027876029604051602001612d6996959493929190613f40565b60405160208183030381529060405290505b60108360ff161115612db257806028866029604051602001612da09493929190613f02565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612df9575060088460ff16118015612df8575060108460ff16105b5b15612f1f57600090505b6007811015612e8e57816030612e30601984612e1f91906146d0565b60af612e2b9190614649565b611d80565b6031612e53601986612e4291906146d0565b60af612e4e9190614649565b611d80565b6032604051602001612e6a96959493929190613f40565b60405160208183030381529060405291508080612e86906148b8565b915050612e03565b600090505b6006811015612f1e57816030612ec0601984612eaf91906146d0565b60bb612ebb9190614649565b611d80565b6033612ee3601986612ed291906146d0565b60bb612ede9190614649565b611d80565b6034604051602001612efa96959493929190613f40565b60405160208183030381529060405291508080612f16906148b8565b915050612e93565b5b600f8460ff161115612f5157816025604051602001612f3f929190613ede565b60405160208183030381529060405291505b8192505050919050565b606060008260ff161415612f8057604051806020016040528060008152509050613130565b60038260ff161015612ff45760018260ff161115612fc657602a602b602d604051602001612fb0939291906141b5565b6040516020818303038152906040529050613130565b602a602c602d604051602001612fde939291906141b5565b6040516020818303038152906040529050613130565b60038260ff1611156130a25760058260ff16111561303a57602e602f6029604051602001613024939291906141b5565b6040516020818303038152906040529050613130565b60048260ff16111561307457602e602b602960405160200161305e939291906141b5565b6040516020818303038152906040529050613130565b602e602c602960405160200161308c939291906141b5565b6040516020818303038152906040529050613130565b601e80546130af90614855565b80601f01602080910402602001604051908101604052809291908181526020018280546130db90614855565b80156131285780601f106130fd57610100808354040283529160200191613128565b820191906000526020600020905b81548152906001019060200180831161310b57829003601f168201915b505050505090505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319084610c97565b61319a919061472a565b905060006007600084815260200190815260200160002054905081811461327f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613304919061472a565b905060006009600084815260200190815260200160002054905060006008838154811061333457613333614a18565b5b90600052602060002001549050806008838154811061335657613355614a18565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133a5576133a46149e9565b5b6001900381819060005260206000200160009055905550505050565b60006133cc83610c97565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a790614460565b60405180910390fd5b6134b98161137b565b156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f090614380565b60405180910390fd5b61350560008383612938565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135559190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000613686613681846145c0565b61459b565b9050828152602081018484840111156136a2576136a1614a7b565b5b6136ad848285614813565b509392505050565b6000813590506136c481614f94565b92915050565b6000813590506136d981614fab565b92915050565b6000813590506136ee81614fc2565b92915050565b60008151905061370381614fc2565b92915050565b600082601f83011261371e5761371d614a76565b5b813561372e848260208601613673565b91505092915050565b60008135905061374681614fd9565b92915050565b60006020828403121561376257613761614a85565b5b6000613770848285016136b5565b91505092915050565b600080604083850312156137905761378f614a85565b5b600061379e858286016136b5565b92505060206137af858286016136b5565b9150509250929050565b6000806000606084860312156137d2576137d1614a85565b5b60006137e0868287016136b5565b93505060206137f1868287016136b5565b925050604061380286828701613737565b9150509250925092565b6000806000806080858703121561382657613825614a85565b5b6000613834878288016136b5565b9450506020613845878288016136b5565b935050604061385687828801613737565b925050606085013567ffffffffffffffff81111561387757613876614a80565b5b61388387828801613709565b91505092959194509250565b600080604083850312156138a6576138a5614a85565b5b60006138b4858286016136b5565b92505060206138c5858286016136ca565b9150509250929050565b600080604083850312156138e6576138e5614a85565b5b60006138f4858286016136b5565b925050602061390585828601613737565b9150509250929050565b60006020828403121561392557613924614a85565b5b6000613933848285016136df565b91505092915050565b60006020828403121561395257613951614a85565b5b6000613960848285016136f4565b91505092915050565b60006020828403121561397f5761397e614a85565b5b600061398d84828501613737565b91505092915050565b61399f81614792565b82525050565b6139ae816147a4565b82525050565b60006139bf82614606565b6139c9818561461c565b93506139d9818560208601614822565b6139e281614a8a565b840191505092915050565b60006139f882614611565b613a02818561462d565b9350613a12818560208601614822565b613a1b81614a8a565b840191505092915050565b6000613a3182614611565b613a3b818561463e565b9350613a4b818560208601614822565b80840191505092915050565b60008154613a6481614855565b613a6e818661463e565b94506001821660008114613a895760018114613a9a57613acd565b60ff19831686528186019350613acd565b613aa3856145f1565b60005b83811015613ac557815481890152600182019150602081019050613aa6565b838801955050505b50505092915050565b6000613ae3602b8361462d565b9150613aee82614a9b565b604082019050919050565b6000613b0660328361462d565b9150613b1182614aea565b604082019050919050565b6000613b2960268361462d565b9150613b3482614b39565b604082019050919050565b6000613b4c601c8361462d565b9150613b5782614b88565b602082019050919050565b6000613b6f60248361462d565b9150613b7a82614bb1565b604082019050919050565b6000613b9260198361462d565b9150613b9d82614c00565b602082019050919050565b6000613bb5602c8361462d565b9150613bc082614c29565b604082019050919050565b6000613bd860388361462d565b9150613be382614c78565b604082019050919050565b6000613bfb602a8361462d565b9150613c0682614cc7565b604082019050919050565b6000613c1e60298361462d565b9150613c2982614d16565b604082019050919050565b6000613c4160208361462d565b9150613c4c82614d65565b602082019050919050565b6000613c64602c8361462d565b9150613c6f82614d8e565b604082019050919050565b6000613c8760208361462d565b9150613c9282614ddd565b602082019050919050565b6000613caa60298361462d565b9150613cb582614e06565b604082019050919050565b6000613ccd60218361462d565b9150613cd882614e55565b604082019050919050565b6000613cf060318361462d565b9150613cfb82614ea4565b604082019050919050565b6000613d13602c8361462d565b9150613d1e82614ef3565b604082019050919050565b6000613d36600d8361462d565b9150613d4182614f42565b602082019050919050565b6000613d59601f8361462d565b9150613d6482614f6b565b602082019050919050565b613d78816147fc565b82525050565b6000613d8a8284613a26565b915081905092915050565b6000613da18289613a26565b9150613dad8288613a26565b9150613db98287613a26565b9150613dc58286613a26565b9150613dd18285613a26565b9150613ddd8284613a57565b9150819050979650505050505050565b6000613df9828b613a26565b9150613e05828a613a26565b9150613e118289613a57565b9150613e1d8288613a26565b9150613e298287613a57565b9150613e358286613a26565b9150613e418285613a57565b9150613e4d8284613a26565b91508190509998505050505050505050565b6000613e6b828c613a26565b9150613e77828b613a26565b9150613e83828a613a57565b9150613e8f8289613a26565b9150613e9b8288613a57565b9150613ea78287613a26565b9150613eb38286613a57565b9150613ebf8285613a26565b9150613ecb8284613a57565b91508190509a9950505050505050505050565b6000613eea8285613a26565b9150613ef68284613a57565b91508190509392505050565b6000613f0e8287613a26565b9150613f1a8286613a57565b9150613f268285613a26565b9150613f328284613a57565b915081905095945050505050565b6000613f4c8289613a26565b9150613f588288613a57565b9150613f648287613a26565b9150613f708286613a57565b9150613f7c8285613a26565b9150613f888284613a57565b9150819050979650505050505050565b6000613fa4828d613a26565b9150613fb0828c613a57565b9150613fbc828b613a26565b9150613fc8828a613a57565b9150613fd48289613a26565b9150613fe08288613a57565b9150613fec8287613a26565b9150613ff88286613a57565b91506140048285613a26565b91506140108284613a57565b91508190509b9a5050505050505050505050565b6000614030828c613a26565b915061403c828b613a57565b9150614048828a613a57565b91506140548289613a57565b91506140608288613a57565b915061406c8287613a26565b91506140788286613a57565b91506140848285613a57565b91506140908284613a57565b91508190509a9950505050505050505050565b60006140af8285613a57565b91506140bb8284613a26565b91508190509392505050565b60006140d38288613a57565b91506140df8287613a26565b91506140eb8286613a26565b91506140f78285613a26565b91506141038284613a57565b91508190509695505050505050565b600061411e8288613a57565b915061412a8287613a26565b91506141368286613a57565b91506141428285613a26565b915061414e8284613a57565b91508190509695505050505050565b60006141698289613a57565b91506141758288613a26565b91506141818287613a57565b915061418d8286613a26565b91506141998285613a57565b91506141a58284613a26565b9150819050979650505050505050565b60006141c18286613a57565b91506141cd8285613a57565b91506141d98284613a57565b9150819050949350505050565b60006141f28288613a57565b91506141fe8287613a57565b915061420a8286613a57565b91506142168285613a26565b91506142228284613a57565b91508190509695505050505050565b600061423d8288613a57565b91506142498287613a57565b91506142558286613a57565b91506142618285613a57565b915061426d8284613a57565b91508190509695505050505050565b60006020820190506142916000830184613996565b92915050565b60006080820190506142ac6000830187613996565b6142b96020830186613996565b6142c66040830185613d6f565b81810360608301526142d881846139b4565b905095945050505050565b60006020820190506142f860008301846139a5565b92915050565b6000602082019050818103600083015261431881846139ed565b905092915050565b6000602082019050818103600083015261433981613ad6565b9050919050565b6000602082019050818103600083015261435981613af9565b9050919050565b6000602082019050818103600083015261437981613b1c565b9050919050565b6000602082019050818103600083015261439981613b3f565b9050919050565b600060208201905081810360008301526143b981613b62565b9050919050565b600060208201905081810360008301526143d981613b85565b9050919050565b600060208201905081810360008301526143f981613ba8565b9050919050565b6000602082019050818103600083015261441981613bcb565b9050919050565b6000602082019050818103600083015261443981613bee565b9050919050565b6000602082019050818103600083015261445981613c11565b9050919050565b6000602082019050818103600083015261447981613c34565b9050919050565b6000602082019050818103600083015261449981613c57565b9050919050565b600060208201905081810360008301526144b981613c7a565b9050919050565b600060208201905081810360008301526144d981613c9d565b9050919050565b600060208201905081810360008301526144f981613cc0565b9050919050565b6000602082019050818103600083015261451981613ce3565b9050919050565b6000602082019050818103600083015261453981613d06565b9050919050565b6000602082019050818103600083015261455981613d29565b9050919050565b6000602082019050818103600083015261457981613d4c565b9050919050565b60006020820190506145956000830184613d6f565b92915050565b60006145a56145b6565b90506145b18282614887565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614a47565b5b6145e482614a8a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614654826147fc565b915061465f836147fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146945761469361495c565b5b828201905092915050565b60006146aa826147fc565b91506146b5836147fc565b9250826146c5576146c461498b565b5b828204905092915050565b60006146db826147fc565b91506146e6836147fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471f5761471e61495c565b5b828202905092915050565b6000614735826147fc565b9150614740836147fc565b9250828210156147535761475261495c565b5b828203905092915050565b600061476982614806565b915061477483614806565b9250828210156147875761478661495c565b5b828203905092915050565b600061479d826147dc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614840578082015181840152602081019050614825565b8381111561484f576000848401525b50505050565b6000600282049050600182168061486d57607f821691505b60208210811415614881576148806149ba565b5b50919050565b61489082614a8a565b810181811067ffffffffffffffff821117156148af576148ae614a47565b5b80604052505050565b60006148c3826147fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f6576148f561495c565b5b600182019050919050565b600061490c82614806565b915060ff8214156149205761491f61495c565b5b600182019050919050565b6000614936826147fc565b9150614941836147fc565b9250826149515761495061498b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f9d81614792565b8114614fa857600080fd5b50565b614fb4816147a4565b8114614fbf57600080fd5b50565b614fcb816147b0565b8114614fd657600080fd5b50565b614fe2816147fc565b8114614fed57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122004648e75424ef98bb4ea014ac070c10e02ee3ed4acab04389361d3ff4abc2acc64736f6c63430008070033227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c222c202261747472696275746573223a205b7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c7565223a2022222f3e3c636972636c652063783d22313930222063793d223437302220723d223522207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323030222063793d223231352220723d22333522207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22333035222063793d223232322220723d22333122207374796c653d2266696c6c3a23666666222f3e3c636972636c652063783d22323030222063793d223232302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22343030222063793d223235302220723d22353022207374796c653d2266696c6c3a233c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302035303020353030223e3c7265637420783d22302220793d2230222077696474683d2235303022206865696768743d2235303022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022227d2c7b2274726169745f74797065223a2022467572222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223239302220723d223422207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22313030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d22353022206865696768743d2235352220783d223238302220793d2234333022207374796c653d2266696c6c3a233c7265637420783d2239352220793d22323735222077696474683d22313022206865696768743d22343022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d2238352220793d22323835222077696474683d22333022206865696768743d22313022207374796c653d2266696c6c3a23383732222f3e3c7265637420783d223135302220793d22313930222077696474683d2232303022206865696768743d22333022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231353022207374796c653d2266696c6c3a233c6c696e652078313d22323837222079313d22333331222078323d22333230222079323d2233363622207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a35222f3e227d2c7b2274726169745f74797065223a202245796573222c2276616c7565223a2022222f3e3c636972636c652063783d22313030222063793d223235302220723d22353022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22333130222063793d223437302220723d223522207374796c653d2266696c6c3a23222079323d2233323222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e227d2c7b2274726169745f74797065223a2022436c6f74686573222c2276616c7565223a2022222f3e3c636972636c652063783d22323030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22333030222063793d223232302220723d223722207374796c653d2266696c6c3a23303030222f3e222f3e3c726563742077696474683d2233303022206865696768743d223132302220783d2239392220793d2234303022207374796c653d2266696c6c3a23222f3e3c7265637420783d223139352220793d22333330222077696474683d2231313022206865696768743d223322207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323638222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c636972636c652063783d22323332222063793d223239352220723d223522207374796c653d2266696c6c3a23303030222f3e3c726563742077696474683d2232303022206865696768743d2239392220783d223135302220793d22343022207374796c653d2266696c6c3a23222f3e3c726563742077696474683d2232303022206865696768743d2233332220783d223135302220793d2231303622207374796c653d2266696c6c3a233c656c6c697073652063783d22323530222063793d22333135222072783d223834222072793d22333422207374796c653d2266696c6c3a233c7265637420783d223136302220793d22313930222077696474683d22373522206865696768743d22313522207374796c653d2266696c6c3a23222f3e3c7265637420783d223136302220793d22313730222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a2022486174222c2276616c7565223a2022222f3e3c7265637420783d223237352220793d22313930222077696474683d22363522206865696768743d22313522207374796c653d2266696c6c3a23227d2c7b2274726169745f74797065223a202245617272696e67222c2276616c7565223a2022222079323d2233313222207374796c653d227374726f6b653a233030303b7374726f6b652d77696474683a32222f3e222f3e3c636972636c652063783d22343030222063793d223235302220723d22323022207374796c653d2266696c6c3a23222f3e3c636972636c652063783d22323530222063793d223235302220723d2231323022207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313422207374796c653d2266696c6c3a233c636972636c652063783d22313030222063793d223239302220723d22313222207374796c653d2266696c6c3a233c7265637420783d223136302220793d22323335222077696474683d2231383022206865696768743d22353022207374796c653d2266696c6c3a23
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146103c7578063b88d4fde146103e3578063c87b56dd146103ff578063d5abeb011461042f578063e985e9c51461044d578063f2fde38b1461047d57610158565b80636352211e1461030357806370a0823114610333578063715018a6146103635780638da5cb5b1461036d57806395d89b411461038b5780639c2f2a42146103a957610158565b80632f745c59116101155780632f745c591461023157806342842e0e14610261578063434f48c41461027d5780634378a6e3146102995780634e71d92d146102c95780634f6ccce7146102d357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806318160ddd146101f757806323b872dd14610215575b600080fd5b6101776004803603810190610172919061390f565b610499565b60405161018491906142e3565b60405180910390f35b610195610513565b6040516101a291906142fe565b60405180910390f35b6101c560048036038101906101c09190613969565b6105a5565b6040516101d2919061427c565b60405180910390f35b6101f560048036038101906101f091906138cf565b61062a565b005b6101ff610742565b60405161020c9190614580565b60405180910390f35b61022f600480360381019061022a91906137b9565b61074f565b005b61024b600480360381019061024691906138cf565b6107af565b6040516102589190614580565b60405180910390f35b61027b600480360381019061027691906137b9565b610854565b005b61029760048036038101906102929190613969565b610874565b005b6102b360048036038101906102ae9190613969565b6109ab565b6040516102c091906142fe565b60405180910390f35b6102d1610a8e565b005b6102ed60048036038101906102e89190613969565b610b74565b6040516102fa9190614580565b60405180910390f35b61031d60048036038101906103189190613969565b610be5565b60405161032a919061427c565b60405180910390f35b61034d6004803603810190610348919061374c565b610c97565b60405161035a9190614580565b60405180910390f35b61036b610d4f565b005b610375610dd7565b604051610382919061427c565b60405180910390f35b610393610e01565b6040516103a091906142fe565b60405180910390f35b6103b1610e93565b6040516103be9190614580565b60405180910390f35b6103e160048036038101906103dc919061388f565b610e99565b005b6103fd60048036038101906103f8919061380c565b61101a565b005b61041960048036038101906104149190613969565b61107c565b60405161042691906142fe565b60405180910390f35b610437611107565b6040516104449190614580565b60405180910390f35b61046760048036038101906104629190613779565b61110d565b60405161047491906142e3565b60405180910390f35b6104976004803603810190610492919061374c565b6111a1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061050c575061050b82611299565b5b9050919050565b60606000805461052290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461054e90614855565b801561059b5780601f106105705761010080835404028352916020019161059b565b820191906000526020600020905b81548152906001019060200180831161057e57829003601f168201915b5050505050905090565b60006105b08261137b565b6105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063582610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c56113e7565b73ffffffffffffffffffffffffffffffffffffffff1614806106f457506106f3816106ee6113e7565b61110d565b5b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a90614400565b60405180910390fd5b61073d83836113ef565b505050565b6000600880549050905090565b61076061075a6113e7565b826114a8565b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690614500565b60405180910390fd5b6107aa838383611586565b505050565b60006107ba83610c97565b82106107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f290614320565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61086f8383836040518060200160405280600081525061101a565b505050565b6002600a5414156108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190614560565b60405180910390fd5b6002600a819055506108ca6113e7565b73ffffffffffffffffffffffffffffffffffffffff166108e8610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461093e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610935906144a0565b60405180910390fd5b61251c81118015610950575061271181105b61098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690614540565b60405180910390fd5b6109a061099a610dd7565b826117e2565b6001600a8190555050565b606060006109b883611800565b905060006109cc8260c0015160ff16611d80565b60436109de846020015160ff16611d80565b60436109f08660a0015160ff16611d80565b6043604051602001610a0796959493929190613f40565b604051602081830303815290604052905080610a29836040015160ff16611d80565b6043610a3b856080015160ff16611d80565b6043610a4d876060015160ff16611d80565b6043610a5f896000015160ff16611d80565b604051602001610a76989796959493929190613ded565b60405160208183030381529060405292505050919050565b6002600a541415610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90614560565b60405180910390fd5b6002600a819055506000600c5410158015610af2575061251c600c54105b610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890614540565b60405180910390fd5b610b50610b3c6113e7565b6001600c54610b4b9190614649565b6117e2565b6001600c6000828254610b639190614649565b925050819055506001600a81905550565b6000610b7e610742565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690614520565b60405180910390fd5b60088281548110610bd357610bd2614a18565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614440565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d576113e7565b73ffffffffffffffffffffffffffffffffffffffff16610d75610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906144a0565b60405180910390fd5b610dd56000611ee1565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1090614855565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614855565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b600c5481565b610ea16113e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906143c0565b60405180910390fd5b8060056000610f1c6113e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc96113e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906142e3565b60405180910390a35050565b61102b6110256113e7565b836114a8565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614500565b60405180910390fd5b61107684848484611fa7565b50505050565b6060600061108983611800565b905060466110df604461109b86611d80565b6110a485612003565b6110b56110b0876120de565b612736565b60456040516020016110cb9594939291906140c7565b604051602081830303815290604052612736565b6040516020016110f09291906140a3565b604051602081830303815290604052915050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a96113e7565b73ffffffffffffffffffffffffffffffffffffffff166111c7610dd7565b73ffffffffffffffffffffffffffffffffffffffff161461121d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611214906144a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614360565b60405180910390fd5b61129681611ee1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061136457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113745750611373826128ce565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661146283610be5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114b38261137b565b6114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e9906143e0565b60405180910390fd5b60006114fd83610be5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061156c57508373ffffffffffffffffffffffffffffffffffffffff16611554846105a5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061157d575061157c818561110d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115a682610be5565b73ffffffffffffffffffffffffffffffffffffffff16146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f3906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906143a0565b60405180910390fd5b611677838383612938565b6116826000826113ef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116d2919061472a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117299190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6117fc828260405180602001604052806000815250612a4c565b5050565b611808613621565b81613227611816919061472a565b9150611820613621565b6008611855603d61183086611d80565b6040516020016118419291906140a3565b604051602081830303815290604052612aa7565b61185f919061492b565b816000019060ff16908160ff168152505061192f60108054806020026020016040519081016040528092919081815260200182805480156118e557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff16815260200190600101906020826000010492830192600103820291508084116118ae5790505b5050505050610719611920601f6118fb88611d80565b60405160200161190c9291906140a3565b604051602081830303815290604052612aa7565b61192a919061492b565b612ada565b816020019060ff16908160ff16815250506119ff60128054806020026020016040519081016040528092919081815260200182805480156119b557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff168152602001906001019060208260000104928301926001038202915080841161197e5790505b50505050506105956119f0603e6119cb88611d80565b6040516020016119dc9291906140a3565b604051602081830303815290604052612aa7565b6119fa919061492b565b612ada565b816040019060ff16908160ff1681525050611acf6014805480602002602001604051908101604052809291908181526020018280548015611a8557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611a4e5790505b5050505050610458611ac0603f611a9b88611d80565b604051602001611aac9291906140a3565b604051602081830303815290604052612aa7565b611aca919061492b565b612ada565b816060019060ff16908160ff1681525050611b9f6016805480602002602001604051908101604052809291908181526020018280548015611b5557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611b1e5790505b5050505050610166611b906040611b6b88611d80565b604051602001611b7c9291906140a3565b604051602081830303815290604052612aa7565b611b9a919061492b565b612ada565b816080019060ff16908160ff1681525050611c6f6019805480602002602001604051908101604052809291908181526020018280548015611c2557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611bee5790505b5050505050610531611c606041611c3b88611d80565b604051602001611c4c9291906140a3565b604051602081830303815290604052612aa7565b611c6a919061492b565b612ada565b8160a0019060ff16908160ff1681525050611d3f601c805480602002602001604051908101604052809291908181526020018280548015611cf557602002820191906000526020600020906000905b82829054906101000a900460ff1660ff1681526020019060010190602082600001049283019260010382029150808411611cbe5790505b5050505050610457611d306042611d0b88611d80565b604051602001611d1c9291906140a3565b604051602081830303815290604052612aa7565b611d3a919061492b565b612ada565b8160c0019060ff16908160ff1681525050611ceb831415611d77578060c0018051809190611d6c90614901565b60ff1660ff16815250505b80915050919050565b60606000821415611dc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611edc565b600082905060005b60008214611dfa578080611de3906148b8565b915050600a82611df3919061469f565b9150611dd0565b60008167ffffffffffffffff811115611e1657611e15614a47565b5b6040519080825280601f01601f191660200182016040528015611e485781602001600182028036833780820191505090505b5090505b60008514611ed557600182611e61919061472a565b9150600a85611e70919061492b565b6030611e7c9190614649565b60f81b818381518110611e9257611e91614a18565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ece919061469f565b9450611e4c565b8093505050505b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb2848484611586565b611fbe84848484612b58565b611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff490614340565b60405180910390fd5b50505050565b606060006035612019846000015160ff16611d80565b603661202b866020015160ff16611d80565b603761203d886080015160ff16611d80565b6040516020016120529695949392919061415d565b60405160208183030381529060405290508060386120768560c0015160ff16611d80565b6039612088876040015160ff16611d80565b603a61209a8960a0015160ff16611d80565b603b6120ac8b6060015160ff16611d80565b603c6040516020016120c79a99989796959493929190613f98565b604051602081830303815290604052915050919050565b60606000600e836020015160ff16815481106120fd576120fc614a18565b5b90600052602060002001805461211290614855565b80601f016020809104026020016040519081016040528092919081815260200182805461213e90614855565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b505050505090506000600f846020015160ff16815481106121af576121ae614a18565b5b9060005260206000200180546121c490614855565b80601f01602080910402602001604051908101604052809291908181526020018280546121f090614855565b801561223d5780601f106122125761010080835404028352916020019161223d565b820191906000526020600020905b81548152906001019060200180831161222057829003601f168201915b505050505090506000604051806020016040528060008152509050600060405180602001604052806000815250905060008660a0015160ff16111561230a57601f601760018860a00151612291919061475e565b60ff16815481106122a5576122a4614a18565b5b906000526020600020016020601860018a60a001516122c4919061475e565b60ff16815481106122d8576122d7614a18565b5b9060005260206000200160296040516020016122f8959493929190614231565b60405160208183030381529060405290505b60008660c0015160ff1611156123a8576021601a60018860c0015161232f919061475e565b60ff168154811061234357612342614a18565b5b906000526020600020016022601b60018a60c00151612362919061475e565b60ff168154811061237657612375614a18565b5b906000526020600020016029604051602001612396959493929190614231565b60405160208183030381529060405291505b6000601d6000815481106123bf576123be614a18565b5b90600052602060002001600d886000015160ff16815481106123e4576123e3614a18565b5b90600052602060002001601d60018154811061240357612402614a18565b5b9060005260206000200186601d60028154811061242357612422614a18565b5b906000526020600020016040516020016124419594939291906141e6565b60405160208183030381529060405290508085601d60038154811061246957612468614a18565b5b9060005260206000200187601d60048154811061248957612488614a18565b5b9060005260206000200188601d6005815481106124a9576124a8614a18565b5b906000526020600020018b601d6006815481106124c9576124c8614a18565b5b906000526020600020016040516020016124eb99989796959493929190613e5f565b60405160208183030381529060405290508084601d60078154811061251357612512614a18565b5b9060005260206000200187601d60088154811061253357612532614a18565b5b9060005260206000200188601d60098154811061255357612552614a18565b5b906000526020600020018b601d600a8154811061257357612572614a18565b5b9060005260206000200160405160200161259599989796959493929190613e5f565b6040516020818303038152906040529050806011886040015160ff16815481106125c2576125c1614a18565b5b90600052602060002001601d600b815481106125e1576125e0614a18565b5b9060005260206000200160118a6040015160ff168154811061260657612605614a18565b5b90600052602060002001601d600c8154811061262557612624614a18565b5b9060005260206000200161263e8a8a8e60400151612cef565b601d600d8154811061265357612652614a18565b5b9060005260206000200160138e6060015160ff168154811061267857612677614a18565b5b90600052602060002001601d600e8154811061269757612696614a18565b5b906000526020600020016040516020016126b999989796959493929190614024565b6040516020818303038152906040529050806126d88860600151612dbd565b6126e58960800151612f5b565b8585601d600f815481106126fc576126fb614a18565b5b9060005260206000200160405160200161271b96959493929190613d95565b60405160208183030381529060405295505050505050919050565b6060600082519050600081141561275f57604051806020016040528060008152509150506128c9565b600060036002836127709190614649565b61277a919061469f565b600461278691906146d0565b905060006020826127979190614649565b67ffffffffffffffff8111156127b0576127af614a47565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614ff1604091399050600181016020830160005b868110156128865760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061280d565b5060038606600181146128a057600281146128b0576128bb565b613d3d60f01b60028303526128bb565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612943838383613135565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612986576129818161313a565b6129c5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129c4576129c38382613183565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0857612a03816132f0565b612a47565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a4657612a4582826133c1565b5b5b505050565b612a568383613440565b612a636000848484612b58565b612aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9990614340565b60405180910390fd5b505050565b600081604051602001612aba9190613d7e565b6040516020818303038152906040528051906020012060001c9050919050565b60008060009050600084600081518110612af757612af6614a18565b5b602002602001015160ff1690505b838111612b4d578180612b1790614901565b925050848260ff1681518110612b3057612b2f614a18565b5b602002602001015160ff1681612b469190614649565b9050612b05565b819250505092915050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff1661360e565b15612ce2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ba26113e7565b8786866040518563ffffffff1660e01b8152600401612bc49493929190614297565b602060405180830381600087803b158015612bde57600080fd5b505af1925050508015612c0f57506040513d601f19601f82011682018060405250810190612c0c919061393c565b60015b612c92573d8060008114612c3f576040519150601f19603f3d011682016040523d82523d6000602084013e612c44565b606091505b50600081511415612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614340565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce7565b600190505b949350505050565b6060600060405180602001604052806000815250905060048360ff161115612d3f576023856024876029604051602001612d2d959493929190614112565b60405160208183030381529060405290505b600a8360ff161115612d7b57806026856027876029604051602001612d6996959493929190613f40565b60405160208183030381529060405290505b60108360ff161115612db257806028866029604051602001612da09493929190613f02565b60405160208183030381529060405290505b809150509392505050565b60606000604051806020016040528060008152509050600060188460ff161180612df9575060088460ff16118015612df8575060108460ff16105b5b15612f1f57600090505b6007811015612e8e57816030612e30601984612e1f91906146d0565b60af612e2b9190614649565b611d80565b6031612e53601986612e4291906146d0565b60af612e4e9190614649565b611d80565b6032604051602001612e6a96959493929190613f40565b60405160208183030381529060405291508080612e86906148b8565b915050612e03565b600090505b6006811015612f1e57816030612ec0601984612eaf91906146d0565b60bb612ebb9190614649565b611d80565b6033612ee3601986612ed291906146d0565b60bb612ede9190614649565b611d80565b6034604051602001612efa96959493929190613f40565b60405160208183030381529060405291508080612f16906148b8565b915050612e93565b5b600f8460ff161115612f5157816025604051602001612f3f929190613ede565b60405160208183030381529060405291505b8192505050919050565b606060008260ff161415612f8057604051806020016040528060008152509050613130565b60038260ff161015612ff45760018260ff161115612fc657602a602b602d604051602001612fb0939291906141b5565b6040516020818303038152906040529050613130565b602a602c602d604051602001612fde939291906141b5565b6040516020818303038152906040529050613130565b60038260ff1611156130a25760058260ff16111561303a57602e602f6029604051602001613024939291906141b5565b6040516020818303038152906040529050613130565b60048260ff16111561307457602e602b602960405160200161305e939291906141b5565b6040516020818303038152906040529050613130565b602e602c602960405160200161308c939291906141b5565b6040516020818303038152906040529050613130565b601e80546130af90614855565b80601f01602080910402602001604051908101604052809291908181526020018280546130db90614855565b80156131285780601f106130fd57610100808354040283529160200191613128565b820191906000526020600020905b81548152906001019060200180831161310b57829003601f168201915b505050505090505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319084610c97565b61319a919061472a565b905060006007600084815260200190815260200160002054905081811461327f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613304919061472a565b905060006009600084815260200190815260200160002054905060006008838154811061333457613333614a18565b5b90600052602060002001549050806008838154811061335657613355614a18565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133a5576133a46149e9565b5b6001900381819060005260206000200160009055905550505050565b60006133cc83610c97565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a790614460565b60405180910390fd5b6134b98161137b565b156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f090614380565b60405180910390fd5b61350560008383612938565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135559190614649565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525090565b6000613686613681846145c0565b61459b565b9050828152602081018484840111156136a2576136a1614a7b565b5b6136ad848285614813565b509392505050565b6000813590506136c481614f94565b92915050565b6000813590506136d981614fab565b92915050565b6000813590506136ee81614fc2565b92915050565b60008151905061370381614fc2565b92915050565b600082601f83011261371e5761371d614a76565b5b813561372e848260208601613673565b91505092915050565b60008135905061374681614fd9565b92915050565b60006020828403121561376257613761614a85565b5b6000613770848285016136b5565b91505092915050565b600080604083850312156137905761378f614a85565b5b600061379e858286016136b5565b92505060206137af858286016136b5565b9150509250929050565b6000806000606084860312156137d2576137d1614a85565b5b60006137e0868287016136b5565b93505060206137f1868287016136b5565b925050604061380286828701613737565b9150509250925092565b6000806000806080858703121561382657613825614a85565b5b6000613834878288016136b5565b9450506020613845878288016136b5565b935050604061385687828801613737565b925050606085013567ffffffffffffffff81111561387757613876614a80565b5b61388387828801613709565b91505092959194509250565b600080604083850312156138a6576138a5614a85565b5b60006138b4858286016136b5565b92505060206138c5858286016136ca565b9150509250929050565b600080604083850312156138e6576138e5614a85565b5b60006138f4858286016136b5565b925050602061390585828601613737565b9150509250929050565b60006020828403121561392557613924614a85565b5b6000613933848285016136df565b91505092915050565b60006020828403121561395257613951614a85565b5b6000613960848285016136f4565b91505092915050565b60006020828403121561397f5761397e614a85565b5b600061398d84828501613737565b91505092915050565b61399f81614792565b82525050565b6139ae816147a4565b82525050565b60006139bf82614606565b6139c9818561461c565b93506139d9818560208601614822565b6139e281614a8a565b840191505092915050565b60006139f882614611565b613a02818561462d565b9350613a12818560208601614822565b613a1b81614a8a565b840191505092915050565b6000613a3182614611565b613a3b818561463e565b9350613a4b818560208601614822565b80840191505092915050565b60008154613a6481614855565b613a6e818661463e565b94506001821660008114613a895760018114613a9a57613acd565b60ff19831686528186019350613acd565b613aa3856145f1565b60005b83811015613ac557815481890152600182019150602081019050613aa6565b838801955050505b50505092915050565b6000613ae3602b8361462d565b9150613aee82614a9b565b604082019050919050565b6000613b0660328361462d565b9150613b1182614aea565b604082019050919050565b6000613b2960268361462d565b9150613b3482614b39565b604082019050919050565b6000613b4c601c8361462d565b9150613b5782614b88565b602082019050919050565b6000613b6f60248361462d565b9150613b7a82614bb1565b604082019050919050565b6000613b9260198361462d565b9150613b9d82614c00565b602082019050919050565b6000613bb5602c8361462d565b9150613bc082614c29565b604082019050919050565b6000613bd860388361462d565b9150613be382614c78565b604082019050919050565b6000613bfb602a8361462d565b9150613c0682614cc7565b604082019050919050565b6000613c1e60298361462d565b9150613c2982614d16565b604082019050919050565b6000613c4160208361462d565b9150613c4c82614d65565b602082019050919050565b6000613c64602c8361462d565b9150613c6f82614d8e565b604082019050919050565b6000613c8760208361462d565b9150613c9282614ddd565b602082019050919050565b6000613caa60298361462d565b9150613cb582614e06565b604082019050919050565b6000613ccd60218361462d565b9150613cd882614e55565b604082019050919050565b6000613cf060318361462d565b9150613cfb82614ea4565b604082019050919050565b6000613d13602c8361462d565b9150613d1e82614ef3565b604082019050919050565b6000613d36600d8361462d565b9150613d4182614f42565b602082019050919050565b6000613d59601f8361462d565b9150613d6482614f6b565b602082019050919050565b613d78816147fc565b82525050565b6000613d8a8284613a26565b915081905092915050565b6000613da18289613a26565b9150613dad8288613a26565b9150613db98287613a26565b9150613dc58286613a26565b9150613dd18285613a26565b9150613ddd8284613a57565b9150819050979650505050505050565b6000613df9828b613a26565b9150613e05828a613a26565b9150613e118289613a57565b9150613e1d8288613a26565b9150613e298287613a57565b9150613e358286613a26565b9150613e418285613a57565b9150613e4d8284613a26565b91508190509998505050505050505050565b6000613e6b828c613a26565b9150613e77828b613a26565b9150613e83828a613a57565b9150613e8f8289613a26565b9150613e9b8288613a57565b9150613ea78287613a26565b9150613eb38286613a57565b9150613ebf8285613a26565b9150613ecb8284613a57565b91508190509a9950505050505050505050565b6000613eea8285613a26565b9150613ef68284613a57565b91508190509392505050565b6000613f0e8287613a26565b9150613f1a8286613a57565b9150613f268285613a26565b9150613f328284613a57565b915081905095945050505050565b6000613f4c8289613a26565b9150613f588288613a57565b9150613f648287613a26565b9150613f708286613a57565b9150613f7c8285613a26565b9150613f888284613a57565b9150819050979650505050505050565b6000613fa4828d613a26565b9150613fb0828c613a57565b9150613fbc828b613a26565b9150613fc8828a613a57565b9150613fd48289613a26565b9150613fe08288613a57565b9150613fec8287613a26565b9150613ff88286613a57565b91506140048285613a26565b91506140108284613a57565b91508190509b9a5050505050505050505050565b6000614030828c613a26565b915061403c828b613a57565b9150614048828a613a57565b91506140548289613a57565b91506140608288613a57565b915061406c8287613a26565b91506140788286613a57565b91506140848285613a57565b91506140908284613a57565b91508190509a9950505050505050505050565b60006140af8285613a57565b91506140bb8284613a26565b91508190509392505050565b60006140d38288613a57565b91506140df8287613a26565b91506140eb8286613a26565b91506140f78285613a26565b91506141038284613a57565b91508190509695505050505050565b600061411e8288613a57565b915061412a8287613a26565b91506141368286613a57565b91506141428285613a26565b915061414e8284613a57565b91508190509695505050505050565b60006141698289613a57565b91506141758288613a26565b91506141818287613a57565b915061418d8286613a26565b91506141998285613a57565b91506141a58284613a26565b9150819050979650505050505050565b60006141c18286613a57565b91506141cd8285613a57565b91506141d98284613a57565b9150819050949350505050565b60006141f28288613a57565b91506141fe8287613a57565b915061420a8286613a57565b91506142168285613a26565b91506142228284613a57565b91508190509695505050505050565b600061423d8288613a57565b91506142498287613a57565b91506142558286613a57565b91506142618285613a57565b915061426d8284613a57565b91508190509695505050505050565b60006020820190506142916000830184613996565b92915050565b60006080820190506142ac6000830187613996565b6142b96020830186613996565b6142c66040830185613d6f565b81810360608301526142d881846139b4565b905095945050505050565b60006020820190506142f860008301846139a5565b92915050565b6000602082019050818103600083015261431881846139ed565b905092915050565b6000602082019050818103600083015261433981613ad6565b9050919050565b6000602082019050818103600083015261435981613af9565b9050919050565b6000602082019050818103600083015261437981613b1c565b9050919050565b6000602082019050818103600083015261439981613b3f565b9050919050565b600060208201905081810360008301526143b981613b62565b9050919050565b600060208201905081810360008301526143d981613b85565b9050919050565b600060208201905081810360008301526143f981613ba8565b9050919050565b6000602082019050818103600083015261441981613bcb565b9050919050565b6000602082019050818103600083015261443981613bee565b9050919050565b6000602082019050818103600083015261445981613c11565b9050919050565b6000602082019050818103600083015261447981613c34565b9050919050565b6000602082019050818103600083015261449981613c57565b9050919050565b600060208201905081810360008301526144b981613c7a565b9050919050565b600060208201905081810360008301526144d981613c9d565b9050919050565b600060208201905081810360008301526144f981613cc0565b9050919050565b6000602082019050818103600083015261451981613ce3565b9050919050565b6000602082019050818103600083015261453981613d06565b9050919050565b6000602082019050818103600083015261455981613d29565b9050919050565b6000602082019050818103600083015261457981613d4c565b9050919050565b60006020820190506145956000830184613d6f565b92915050565b60006145a56145b6565b90506145b18282614887565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614a47565b5b6145e482614a8a565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614654826147fc565b915061465f836147fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146945761469361495c565b5b828201905092915050565b60006146aa826147fc565b91506146b5836147fc565b9250826146c5576146c461498b565b5b828204905092915050565b60006146db826147fc565b91506146e6836147fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471f5761471e61495c565b5b828202905092915050565b6000614735826147fc565b9150614740836147fc565b9250828210156147535761475261495c565b5b828203905092915050565b600061476982614806565b915061477483614806565b9250828210156147875761478661495c565b5b828203905092915050565b600061479d826147dc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614840578082015181840152602081019050614825565b8381111561484f576000848401525b50505050565b6000600282049050600182168061486d57607f821691505b60208210811415614881576148806149ba565b5b50919050565b61489082614a8a565b810181811067ffffffffffffffff821117156148af576148ae614a47565b5b80604052505050565b60006148c3826147fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f6576148f561495c565b5b600182019050919050565b600061490c82614806565b915060ff8214156149205761491f61495c565b5b600182019050919050565b6000614936826147fc565b9150614941836147fc565b9250826149515761495061498b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f9d81614792565b8114614fa857600080fd5b50565b614fb4816147a4565b8114614fbf57600080fd5b50565b614fcb816147b0565b8114614fd657600080fd5b50565b614fe2816147fc565b8114614fed57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122004648e75424ef98bb4ea014ac070c10e02ee3ed4acab04389361d3ff4abc2acc64736f6c63430008070033
Deployed Bytecode Sourcemap
47107:12450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40925:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28053:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29612:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29135:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41565:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30502:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41233:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30912:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59311:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55997:443;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59121:180;;;:::i;:::-;;41755:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27747:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27477:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12517:94;;;:::i;:::-;;11866:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28222:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47259:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29905:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31168:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58820:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47213:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30271:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12766:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40925:224;41027:4;41066:35;41051:50;;;:11;:50;;;;:90;;;;41105:36;41129:11;41105:23;:36::i;:::-;41051:90;41044:97;;40925:224;;;:::o;28053:100::-;28107:13;28140:5;28133:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28053:100;:::o;29612:221::-;29688:7;29716:16;29724:7;29716;:16::i;:::-;29708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29801:15;:24;29817:7;29801:24;;;;;;;;;;;;;;;;;;;;;29794:31;;29612:221;;;:::o;29135:411::-;29216:13;29232:23;29247:7;29232:14;:23::i;:::-;29216:39;;29280:5;29274:11;;:2;:11;;;;29266:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29374:5;29358:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29383:37;29400:5;29407:12;:10;:12::i;:::-;29383:16;:37::i;:::-;29358:62;29336:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29517:21;29526:2;29530:7;29517:8;:21::i;:::-;29205:341;29135:411;;:::o;41565:113::-;41626:7;41653:10;:17;;;;41646:24;;41565:113;:::o;30502:339::-;30697:41;30716:12;:10;:12::i;:::-;30730:7;30697:18;:41::i;:::-;30689:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30805:28;30815:4;30821:2;30825:7;30805:9;:28::i;:::-;30502:339;;;:::o;41233:256::-;41330:7;41366:23;41383:5;41366:16;:23::i;:::-;41358:5;:31;41350:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41455:12;:19;41468:5;41455:19;;;;;;;;;;;;;;;:26;41475:5;41455:26;;;;;;;;;;;;41448:33;;41233:256;;;;:::o;30912:185::-;31050:39;31067:4;31073:2;31077:7;31050:39;;;;;;;;;;;;:16;:39::i;:::-;30912:185;;;:::o;59311:173::-;14797:1;15393:7;;:19;;15385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14797:1;15526:7;:18;;;;12097:12:::1;:10;:12::i;:::-;12086:23;;:7;:5;:7::i;:::-;:23;;;12078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59403:4:::2;59393:7;:14;:33;;;;;59421:5;59411:7;:15;59393:33;59385:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59451:27;59461:7;:5;:7::i;:::-;59470;59451:9;:27::i;:::-;14753:1:::0;15705:7;:22;;;;59311:173;:::o;55997:443::-;56058:13;56080:14;56097:18;56107:7;56097:9;:18::i;:::-;56080:35;;56122:15;56162:27;56170:3;:7;;;56162:16;;:25;:27::i;:::-;56190:3;56194:27;56202:3;:7;;;56194:16;;:25;:27::i;:::-;56222:3;56226:31;56234:3;:11;;;56226:20;;:29;:31::i;:::-;56258:3;56145:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56122:141;;56301:1;56303:28;56311:3;:8;;;56303:17;;:26;:28::i;:::-;56332:3;56336:31;56344:3;:11;;;56336:20;;:29;:31::i;:::-;56368:3;56372:29;56380:3;:9;;;56372:18;;:27;:29::i;:::-;56402:3;56406:26;56414:3;:6;;;56406:15;;:24;:26::i;:::-;56284:149;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56270:164;;;;55997:443;;;:::o;59121:180::-;14797:1;15393:7;;:19;;15385:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14797:1;15526:7;:18;;;;59187:1:::1;59173:10;;:15;;:36;;;;;59205:4;59192:10;;:17;59173:36;59165:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59234:39;59244:12;:10;:12::i;:::-;59271:1;59258:10;;:14;;;;:::i;:::-;59234:9;:39::i;:::-;59294:1;59280:10;;:15;;;;;;;:::i;:::-;;;;;;;;14753:1:::0;15705:7;:22;;;;59121:180::o;41755:233::-;41830:7;41866:30;:28;:30::i;:::-;41858:5;:38;41850:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41963:10;41974:5;41963:17;;;;;;;;:::i;:::-;;;;;;;;;;41956:24;;41755:233;;;:::o;27747:239::-;27819:7;27839:13;27855:7;:16;27863:7;27855:16;;;;;;;;;;;;;;;;;;;;;27839:32;;27907:1;27890:19;;:5;:19;;;;27882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27973:5;27966:12;;;27747:239;;;:::o;27477:208::-;27549:7;27594:1;27577:19;;:5;:19;;;;27569:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27661:9;:16;27671:5;27661:16;;;;;;;;;;;;;;;;27654:23;;27477:208;;;:::o;12517:94::-;12097:12;:10;:12::i;:::-;12086:23;;:7;:5;:7::i;:::-;:23;;;12078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12582:21:::1;12600:1;12582:9;:21::i;:::-;12517:94::o:0;11866:87::-;11912:7;11939:6;;;;;;;;;;;11932:13;;11866:87;:::o;28222:104::-;28278:13;28311:7;28304:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28222:104;:::o;47259:29::-;;;;:::o;29905:295::-;30020:12;:10;:12::i;:::-;30008:24;;:8;:24;;;;30000:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30120:8;30075:18;:32;30094:12;:10;:12::i;:::-;30075:32;;;;;;;;;;;;;;;:42;30108:8;30075:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30173:8;30144:48;;30159:12;:10;:12::i;:::-;30144:48;;;30183:8;30144:48;;;;;;:::i;:::-;;;;;;;;29905:295;;:::o;31168:328::-;31343:41;31362:12;:10;:12::i;:::-;31376:7;31343:18;:41::i;:::-;31335:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31449:39;31463:4;31469:2;31473:7;31482:5;31449:13;:39::i;:::-;31168:328;;;;:::o;58820:295::-;58885:13;58907:14;58924:18;58934:7;58924:9;:18::i;:::-;58907:35;;58980:3;58984:123;59028:3;59032:18;:7;:16;:18::i;:::-;59051:14;59061:3;59051:9;:14::i;:::-;59066:33;59086:11;59093:3;59086:6;:11::i;:::-;59066:13;:33::i;:::-;59100:3;59011:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58984:13;:123::i;:::-;58963:145;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58949:160;;;58820:295;;;:::o;47213:41::-;47249:5;47213:41;:::o;30271:164::-;30368:4;30392:18;:25;30411:5;30392:25;;;;;;;;;;;;;;;:35;30418:8;30392:35;;;;;;;;;;;;;;;;;;;;;;;;;30385:42;;30271:164;;;;:::o;12766:192::-;12097:12;:10;:12::i;:::-;12086:23;;:7;:5;:7::i;:::-;:23;;;12078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12875:1:::1;12855:22;;:8;:22;;;;12847:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12931:19;12941:8;12931:9;:19::i;:::-;12766:192:::0;:::o;27108:305::-;27210:4;27262:25;27247:40;;;:11;:40;;;;:105;;;;27319:33;27304:48;;;:11;:48;;;;27247:105;:158;;;;27369:36;27393:11;27369:23;:36::i;:::-;27247:158;27227:178;;27108:305;;;:::o;33006:127::-;33071:4;33123:1;33095:30;;:7;:16;33103:7;33095:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33088:37;;33006:127;;;:::o;10742:98::-;10795:7;10822:10;10815:17;;10742:98;:::o;36988:174::-;37090:2;37063:15;:24;37079:7;37063:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37146:7;37142:2;37108:46;;37117:23;37132:7;37117:14;:23::i;:::-;37108:46;;;;;;;;;;;;36988:174;;:::o;33300:348::-;33393:4;33418:16;33426:7;33418;:16::i;:::-;33410:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33494:13;33510:23;33525:7;33510:14;:23::i;:::-;33494:39;;33563:5;33552:16;;:7;:16;;;:51;;;;33596:7;33572:31;;:20;33584:7;33572:11;:20::i;:::-;:31;;;33552:51;:87;;;;33607:32;33624:5;33631:7;33607:16;:32::i;:::-;33552:87;33544:96;;;33300:348;;;;:::o;36292:578::-;36451:4;36424:31;;:23;36439:7;36424:14;:23::i;:::-;:31;;;36416:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36534:1;36520:16;;:2;:16;;;;36512:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36590:39;36611:4;36617:2;36621:7;36590:20;:39::i;:::-;36694:29;36711:1;36715:7;36694:8;:29::i;:::-;36755:1;36736:9;:15;36746:4;36736:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36784:1;36767:9;:13;36777:2;36767:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36815:2;36796:7;:16;36804:7;36796:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36854:7;36850:2;36835:27;;36844:4;36835:27;;;;;;;;;;;;36292:578;;;:::o;33990:110::-;34066:26;34076:2;34080:7;34066:26;;;;;;;;;;;;:9;:26::i;:::-;33990:110;;:::o;54546:870::-;54605:10;;:::i;:::-;54638:7;54632:5;:13;;;;:::i;:::-;54624:21;;54667:14;;:::i;:::-;54762:1;54703:56;54734:3;54738:18;:7;:16;:18::i;:::-;54717:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54703:6;:56::i;:::-;:60;;;;:::i;:::-;54688:3;:6;;:76;;;;;;;;;;;54781:74;54786:5;54781:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54850:4;54792:57;54823:4;54828:18;:7;:16;:18::i;:::-;54806:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54792:6;:57::i;:::-;:62;;;;:::i;:::-;54781:4;:74::i;:::-;54771:3;:7;;:84;;;;;;;;;;;54873:74;54878:6;54873:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54942:4;54885:56;54916:3;54920:18;:7;:16;:18::i;:::-;54899:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54885:6;:56::i;:::-;:61;;;;:::i;:::-;54873:4;:74::i;:::-;54862:3;:8;;:85;;;;;;;;;;;54966:75;54971:7;54966:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55036:4;54979:56;55010:3;55014:18;:7;:16;:18::i;:::-;54993:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54979:6;:56::i;:::-;:61;;;;:::i;:::-;54966:4;:75::i;:::-;54954:3;:9;;:87;;;;;;;;;;;55062:76;55067:9;55062:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55134:3;55077:56;55108:3;55112:18;:7;:16;:18::i;:::-;55091:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55077:6;:56::i;:::-;:60;;;;:::i;:::-;55062:4;:76::i;:::-;55048:3;:11;;:90;;;;;;;;;;;55159:77;55164:9;55159:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55231:4;55174:56;55205:3;55209:18;:7;:16;:18::i;:::-;55188:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55174:6;:56::i;:::-;:61;;;;:::i;:::-;55159:4;:77::i;:::-;55145:3;:11;;:91;;;;;;;;;;;55253:73;55258:5;55253:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55321:4;55264:56;55295:3;55299:18;:7;:16;:18::i;:::-;55278:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55264:6;:56::i;:::-;:61;;;;:::i;:::-;55253:4;:73::i;:::-;55243:3;:7;;:83;;;;;;;;;;;55346:4;55337:7;:13;55333:61;;;55361:3;:7;;:9;;;;;;;;:::i;:::-;;;;;;;;;55333:61;55407:3;55400:10;;;54546:870;;;:::o;8444:723::-;8500:13;8730:1;8721:5;:10;8717:53;;;8748:10;;;;;;;;;;;;;;;;;;;;;8717:53;8780:12;8795:5;8780:20;;8811:14;8836:78;8851:1;8843:4;:9;8836:78;;8869:8;;;;;:::i;:::-;;;;8900:2;8892:10;;;;;:::i;:::-;;;8836:78;;;8924:19;8956:6;8946:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8924:39;;8974:154;8990:1;8981:5;:10;8974:154;;9018:1;9008:11;;;;;:::i;:::-;;;9085:2;9077:5;:10;;;;:::i;:::-;9064:2;:24;;;;:::i;:::-;9051:39;;9034:6;9041;9034:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9114:2;9105:11;;;;;:::i;:::-;;;8974:154;;;9152:6;9138:21;;;;;8444:723;;;;:::o;12966:173::-;13022:16;13041:6;;;;;;;;;;;13022:25;;13067:8;13058:6;;:17;;;;;;;;;;;;;;;;;;13122:8;13091:40;;13112:8;13091:40;;;;;;;;;;;;13011:128;12966:173;:::o;32378:315::-;32535:28;32545:4;32551:2;32555:7;32535:9;:28::i;:::-;32582:48;32605:4;32611:2;32615:7;32624:5;32582:22;:48::i;:::-;32574:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32378:315;;;;:::o;55487:406::-;55545:13;55567:15;55607:3;55611:26;55619:3;:6;;;55611:15;;:24;:26::i;:::-;55638:3;55642:27;55650:3;:7;;;55642:16;;:25;:27::i;:::-;55670:3;55674:31;55682:3;:11;;;55674:20;;:29;:31::i;:::-;55590:116;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55567:140;;55745:1;55747:3;55751:27;55759:3;:7;;;55751:16;;:25;:27::i;:::-;55779:3;55783:28;55791:3;:8;;;55783:17;;:26;:28::i;:::-;55812:3;55816:31;55824:3;:11;;;55816:20;;:29;:31::i;:::-;55848:3;55852:29;55860:3;:9;;;55852:18;;:27;:29::i;:::-;55882:3;55728:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55714:173;;;55487:406;;;:::o;57870:944::-;57925:13;57947:15;57963:4;57968:3;:7;;;57963:13;;;;;;;;;;:::i;:::-;;;;;;;;;57947:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57983:15;57999:4;58004:3;:7;;;57999:13;;;;;;;;;;:::i;:::-;;;;;;;;;57983:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58019:19;:22;;;;;;;;;;;;;;58048:19;:22;;;;;;;;;;;;;;58093:1;58081:3;:11;;;:13;;;58077:128;;;58135:4;58140:8;58161:1;58149:3;:11;;;:13;;;;:::i;:::-;58140:23;;;;;;;;;;:::i;:::-;;;;;;;;;58164:4;58169:8;58190:1;58178:3;:11;;;:13;;;;:::i;:::-;58169:23;;;;;;;;;;:::i;:::-;;;;;;;;;58193:2;58118:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58105:92;;58077:128;58223:1;58215:3;:7;;;:9;;;58211:106;;;58265:3;58269:4;58282:1;58274:3;:7;;;:9;;;;:::i;:::-;58269:15;;;;;;;;;;:::i;:::-;;;;;;;;;58285:3;58289:4;58302:1;58294:3;:7;;;:9;;;;:::i;:::-;58289:15;;;;;;;;;;:::i;:::-;;;;;;;;;58305:2;58248:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58235:74;;58211:106;58323:20;58370:1;58372;58370:4;;;;;;;;:::i;:::-;;;;;;;;;58375:10;58386:3;:6;;;58375:18;;;;;;;;;;:::i;:::-;;;;;;;;;58394:1;58396;58394:4;;;;;;;;:::i;:::-;;;;;;;;;58399:1;58401;58403;58401:4;;;;;;;;:::i;:::-;;;;;;;;;58353:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58323:84;;58447:6;58454:1;58456;58458;58456:4;;;;;;;;:::i;:::-;;;;;;;;;58461:1;58463;58465;58463:4;;;;;;;;:::i;:::-;;;;;;;;;58468:1;58470;58472;58470:4;;;;;;;;:::i;:::-;;;;;;;;;58475:1;58477;58479;58477:4;;;;;;;;:::i;:::-;;;;;;;;;58430:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58414:69;;58523:6;58530:1;58532;58534;58532:4;;;;;;;;:::i;:::-;;;;;;;;;58537:1;58539;58541;58539:4;;;;;;;;:::i;:::-;;;;;;;;;58544:1;58546;58548;58546:4;;;;;;;;:::i;:::-;;;;;;;;;58551:1;58553;58555:2;58553:5;;;;;;;;:::i;:::-;;;;;;;;;58506:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58490:70;;58600:6;58607:4;58612:3;:8;;;58607:14;;;;;;;;;;:::i;:::-;;;;;;;;;58622:1;58624:2;58622:5;;;;;;;;:::i;:::-;;;;;;;;;58628:4;58633:3;:8;;;58628:14;;;;;;;;;;:::i;:::-;;;;;;;;;58643:1;58645:2;58643:5;;;;;;;;:::i;:::-;;;;;;;;;58649:20;58656:1;58658;58660:3;:8;;;58649:6;:20::i;:::-;58670:1;58672:2;58670:5;;;;;;;;:::i;:::-;;;;;;;;;58676;58682:3;:9;;;58676:16;;;;;;;;;;:::i;:::-;;;;;;;;;58693:1;58695:2;58693:5;;;;;;;;:::i;:::-;;;;;;;;;58583:116;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58567:133;;58738:6;58745:19;58754:3;:9;;;58745:8;:19::i;:::-;58765:23;58776:3;:11;;;58765:10;:23::i;:::-;58789:5;58795;58801:1;58803:2;58801:5;;;;;;;;:::i;:::-;;;;;;;;;58721:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58707:101;;;;;;;57870:944;;;:::o;1165:1589::-;1223:13;1249:11;1263:4;:11;1249:25;;1296:1;1289:3;:8;1285:23;;;1299:9;;;;;;;;;;;;;;;;;1285:23;1360:18;1398:1;1393;1387:3;:7;;;;:::i;:::-;1386:13;;;;:::i;:::-;1381:1;:19;;;;:::i;:::-;1360:40;;1458:19;1503:2;1490:10;:15;;;;:::i;:::-;1480:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1458:48;;1517:18;1538:5;;;;;;;;;;;;;;;;;1517:26;;1607:1;1600:5;1596:13;1652:2;1644:6;1640:15;1701:1;1669:769;1724:3;1721:1;1718:10;1669:769;;;1777:1;1774;1770:9;1765:14;;1835:8;1830:1;1824:4;1820:12;1814:19;1810:34;1913:4;1905:5;1901:2;1897:14;1893:25;1883:8;1879:40;1873:47;1952:3;1949:1;1945:11;1938:18;;2043:4;2034;2026:5;2022:2;2018:14;2014:25;2004:8;2000:40;1994:47;1990:58;1985:3;1981:68;1974:75;;2081:3;2078:1;2074:11;2067:18;;2171:4;2162;2154:5;2151:1;2147:13;2143:24;2133:8;2129:39;2123:46;2119:57;2114:3;2110:67;2103:74;;2209:3;2206:1;2202:11;2195:18;;2291:4;2282;2275:5;2271:16;2261:8;2257:31;2251:38;2247:49;2242:3;2238:59;2231:66;;2331:3;2326;2322:13;2315:20;;2371:3;2360:9;2353:22;2421:1;2410:9;2406:17;2393:30;;1746:692;;1669:769;;;1673:44;2468:1;2463:3;2459:11;2489:1;2484:84;;;;2587:1;2582:82;;;;2452:212;;2484:84;2545:6;2540:3;2536:16;2532:1;2521:9;2517:17;2510:43;2484:84;;2582:82;2643:4;2638:3;2634:14;2630:1;2619:9;2615:17;2608:41;2452:212;;2693:10;2685:6;2678:26;1565:1150;;2739:6;2725:21;;;;;;1165:1589;;;;:::o;25717:157::-;25802:4;25841:25;25826:40;;;:11;:40;;;;25819:47;;25717:157;;;:::o;42601:589::-;42745:45;42772:4;42778:2;42782:7;42745:26;:45::i;:::-;42823:1;42807:18;;:4;:18;;;42803:187;;;42842:40;42874:7;42842:31;:40::i;:::-;42803:187;;;42912:2;42904:10;;:4;:10;;;42900:90;;42931:47;42964:4;42970:7;42931:32;:47::i;:::-;42900:90;42803:187;43018:1;43004:16;;:2;:16;;;43000:183;;;43037:45;43074:7;43037:36;:45::i;:::-;43000:183;;;43110:4;43104:10;;:2;:10;;;43100:83;;43131:40;43159:2;43163:7;43131:27;:40::i;:::-;43100:83;43000:183;42601:589;;;:::o;34327:321::-;34457:18;34463:2;34467:7;34457:5;:18::i;:::-;34508:54;34539:1;34543:2;34547:7;34556:5;34508:22;:54::i;:::-;34486:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34327:321;;;:::o;54191:132::-;54251:7;54309:5;54292:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;54282:34;;;;;;54274:43;;54267:50;;54191:132;;;:::o;54329:211::-;54394:5;54408:9;54418:1;54408:11;;54426:9;54444:1;54446;54444:4;;;;;;;;:::i;:::-;;;;;;;;54436:13;;54426:23;;54456:62;54466:1;54463;:4;54456:62;;54478:5;;;;;:::i;:::-;;;;54503:1;54505:3;54503:6;;;;;;;;;;:::i;:::-;;;;;;;;54495:15;;54492:18;;;;;:::i;:::-;;;54456:62;;;54531:3;54524:10;;;;54329:211;;;;:::o;37727:803::-;37882:4;37903:15;:2;:13;;;:15::i;:::-;37899:624;;;37955:2;37939:36;;;37976:12;:10;:12::i;:::-;37990:4;37996:7;38005:5;37939:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37935:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38202:1;38185:6;:13;:18;38181:272;;;38228:60;;;;;;;;;;:::i;:::-;;;;;;;;38181:272;38403:6;38397:13;38388:6;38384:2;38380:15;38373:38;37935:533;38072:45;;;38062:55;;;:6;:55;;;;38055:62;;;;;37899:624;38507:4;38500:11;;37727:803;;;;;;;:::o;56446:349::-;56526:13;56548:17;:22;;;;;;;;;;;;;;56583:1;56581;:3;;;56577:60;;;56618:3;56622:1;56624:3;56628:1;56630:2;56601:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56588:46;;56577:60;56649:2;56647:1;:4;;;56643:65;;;56685:3;56689;56693:1;56695:3;56699:1;56701:2;56668:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56655:50;;56643:65;56720:2;56718:1;:4;;;56714:59;;;56756:3;56760;56764:1;56766:2;56739:30;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56726:44;;56714:59;56786:3;56779:10;;;56446:349;;;;;:::o;56801:525::-;56851:13;56873:17;:22;;;;;;;;;;;;;;56902:6;56922:2;56920:1;:4;;;56919:27;;;;56933:1;56931;:3;;;56930:15;;;;;56942:2;56940:1;:4;;;56930:15;56919:27;56915:317;;;56964:1;56962:3;;56957:130;56968:1;56966;:3;56957:130;;;57016:3;57020;57024:21;57031:2;57029:1;:4;;;;:::i;:::-;57025:3;:8;;;;:::i;:::-;57024:19;:21::i;:::-;57046:3;57050:21;57057:2;57055:1;:4;;;;:::i;:::-;57051:3;:8;;;;:::i;:::-;57050:19;:21::i;:::-;57072:3;56999:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56986:91;;56970:3;;;;;:::i;:::-;;;;56957:130;;;57102:1;57100:3;;57095:130;57106:1;57104;:3;57095:130;;;57154:3;57158;57162:21;57169:2;57167:1;:4;;;;:::i;:::-;57163:3;:8;;;;:::i;:::-;57162:19;:21::i;:::-;57184:3;57188:21;57195:2;57193:1;:4;;;;:::i;:::-;57189:3;:8;;;;:::i;:::-;57188:19;:21::i;:::-;57210:3;57137:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57124:91;;57108:3;;;;;:::i;:::-;;;;57095:130;;;56915:317;57244:2;57242:1;:4;;;57238:66;;;57287:3;57291;57270:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57257:39;;57238:66;57317:3;57310:10;;;;56801:525;;;:::o;57332:532::-;57384:13;57413:1;57410;:4;;;57406:36;;;57425:9;;;;;;;;;;;;;;;;57406:36;57454:1;57452;:3;;;57448:153;;;57472:1;57470;:3;;;57466:74;;;57517:3;57521;57525;57500:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57486:44;;;;57466:74;57580:3;57584;57588;57563:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57549:44;;;;57448:153;57613:1;57611;:3;;;57607:233;;;57631:1;57629;:3;;;57625:73;;;57676:3;57680;57684:2;57659:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57645:43;;;;57625:73;57713:1;57711;:3;;;57707:73;;;57758:3;57762;57766:2;57741:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57727:43;;;;57707:73;57820:3;57824;57828:2;57803:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57789:43;;;;57607:233;57853:5;57846:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57332:532;;;;:::o;39102:126::-;;;;:::o;43913:164::-;44017:10;:17;;;;43990:15;:24;44006:7;43990:24;;;;;;;;;;;:44;;;;44045:10;44061:7;44045:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43913:164;:::o;44704:988::-;44970:22;45020:1;44995:22;45012:4;44995:16;:22::i;:::-;:26;;;;:::i;:::-;44970:51;;45032:18;45053:17;:26;45071:7;45053:26;;;;;;;;;;;;45032:47;;45200:14;45186:10;:28;45182:328;;45231:19;45253:12;:18;45266:4;45253:18;;;;;;;;;;;;;;;:34;45272:14;45253:34;;;;;;;;;;;;45231:56;;45337:11;45304:12;:18;45317:4;45304:18;;;;;;;;;;;;;;;:30;45323:10;45304:30;;;;;;;;;;;:44;;;;45454:10;45421:17;:30;45439:11;45421:30;;;;;;;;;;;:43;;;;45216:294;45182:328;45606:17;:26;45624:7;45606:26;;;;;;;;;;;45599:33;;;45650:12;:18;45663:4;45650:18;;;;;;;;;;;;;;;:34;45669:14;45650:34;;;;;;;;;;;45643:41;;;44785:907;;44704:988;;:::o;45987:1079::-;46240:22;46285:1;46265:10;:17;;;;:21;;;;:::i;:::-;46240:46;;46297:18;46318:15;:24;46334:7;46318:24;;;;;;;;;;;;46297:45;;46669:19;46691:10;46702:14;46691:26;;;;;;;;:::i;:::-;;;;;;;;;;46669:48;;46755:11;46730:10;46741;46730:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46866:10;46835:15;:28;46851:11;46835:28;;;;;;;;;;;:41;;;;47007:15;:24;47023:7;47007:24;;;;;;;;;;;47000:31;;;47042:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46058:1008;;;45987:1079;:::o;43491:221::-;43576:14;43593:20;43610:2;43593:16;:20::i;:::-;43576:37;;43651:7;43624:12;:16;43637:2;43624:16;;;;;;;;;;;;;;;:24;43641:6;43624:24;;;;;;;;;;;:34;;;;43698:6;43669:17;:26;43687:7;43669:26;;;;;;;;;;;:35;;;;43565:147;43491:221;;:::o;34984:382::-;35078:1;35064:16;;:2;:16;;;;35056:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35137:16;35145:7;35137;:16::i;:::-;35136:17;35128:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35199:45;35228:1;35232:2;35236:7;35199:20;:45::i;:::-;35274:1;35257:9;:13;35267:2;35257:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35305:2;35286:7;:16;35294:7;35286:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35350:7;35346:2;35325:33;;35342:1;35325:33;;;;;;;;;;;;34984:382;;:::o;17905:387::-;17965:4;18173:12;18240:7;18228:20;18220:28;;18283:1;18276:4;:8;18269:15;;;17905:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:366::-;8240:3;8261:67;8325:2;8320:3;8261:67;:::i;:::-;8254:74;;8337:93;8426:3;8337:93;:::i;:::-;8455:2;8450:3;8446:12;8439:19;;8098:366;;;:::o;8470:::-;8612:3;8633:67;8697:2;8692:3;8633:67;:::i;:::-;8626:74;;8709:93;8798:3;8709:93;:::i;:::-;8827:2;8822:3;8818:12;8811:19;;8470:366;;;:::o;8842:::-;8984:3;9005:67;9069:2;9064:3;9005:67;:::i;:::-;8998:74;;9081:93;9170:3;9081:93;:::i;:::-;9199:2;9194:3;9190:12;9183:19;;8842:366;;;:::o;9214:::-;9356:3;9377:67;9441:2;9436:3;9377:67;:::i;:::-;9370:74;;9453:93;9542:3;9453:93;:::i;:::-;9571:2;9566:3;9562:12;9555:19;;9214:366;;;:::o;9586:::-;9728:3;9749:67;9813:2;9808:3;9749:67;:::i;:::-;9742:74;;9825:93;9914:3;9825:93;:::i;:::-;9943:2;9938:3;9934:12;9927:19;;9586:366;;;:::o;9958:::-;10100:3;10121:67;10185:2;10180:3;10121:67;:::i;:::-;10114:74;;10197:93;10286:3;10197:93;:::i;:::-;10315:2;10310:3;10306:12;10299:19;;9958:366;;;:::o;10330:::-;10472:3;10493:67;10557:2;10552:3;10493:67;:::i;:::-;10486:74;;10569:93;10658:3;10569:93;:::i;:::-;10687:2;10682:3;10678:12;10671:19;;10330:366;;;:::o;10702:::-;10844:3;10865:67;10929:2;10924:3;10865:67;:::i;:::-;10858:74;;10941:93;11030:3;10941:93;:::i;:::-;11059:2;11054:3;11050:12;11043:19;;10702:366;;;:::o;11074:::-;11216:3;11237:67;11301:2;11296:3;11237:67;:::i;:::-;11230:74;;11313:93;11402:3;11313:93;:::i;:::-;11431:2;11426:3;11422:12;11415:19;;11074:366;;;:::o;11446:::-;11588:3;11609:67;11673:2;11668:3;11609:67;:::i;:::-;11602:74;;11685:93;11774:3;11685:93;:::i;:::-;11803:2;11798:3;11794:12;11787:19;;11446:366;;;:::o;11818:::-;11960:3;11981:67;12045:2;12040:3;11981:67;:::i;:::-;11974:74;;12057:93;12146:3;12057:93;:::i;:::-;12175:2;12170:3;12166:12;12159:19;;11818:366;;;:::o;12190:::-;12332:3;12353:67;12417:2;12412:3;12353:67;:::i;:::-;12346:74;;12429:93;12518:3;12429:93;:::i;:::-;12547:2;12542:3;12538:12;12531:19;;12190:366;;;:::o;12562:::-;12704:3;12725:67;12789:2;12784:3;12725:67;:::i;:::-;12718:74;;12801:93;12890:3;12801:93;:::i;:::-;12919:2;12914:3;12910:12;12903:19;;12562:366;;;:::o;12934:::-;13076:3;13097:67;13161:2;13156:3;13097:67;:::i;:::-;13090:74;;13173:93;13262:3;13173:93;:::i;:::-;13291:2;13286:3;13282:12;13275:19;;12934:366;;;:::o;13306:::-;13448:3;13469:67;13533:2;13528:3;13469:67;:::i;:::-;13462:74;;13545:93;13634:3;13545:93;:::i;:::-;13663:2;13658:3;13654:12;13647:19;;13306:366;;;:::o;13678:::-;13820:3;13841:67;13905:2;13900:3;13841:67;:::i;:::-;13834:74;;13917:93;14006:3;13917:93;:::i;:::-;14035:2;14030:3;14026:12;14019:19;;13678:366;;;:::o;14050:::-;14192:3;14213:67;14277:2;14272:3;14213:67;:::i;:::-;14206:74;;14289:93;14378:3;14289:93;:::i;:::-;14407:2;14402:3;14398:12;14391:19;;14050:366;;;:::o;14422:::-;14564:3;14585:67;14649:2;14644:3;14585:67;:::i;:::-;14578:74;;14661:93;14750:3;14661:93;:::i;:::-;14779:2;14774:3;14770:12;14763:19;;14422:366;;;:::o;14794:::-;14936:3;14957:67;15021:2;15016:3;14957:67;:::i;:::-;14950:74;;15033:93;15122:3;15033:93;:::i;:::-;15151:2;15146:3;15142:12;15135:19;;14794:366;;;:::o;15166:118::-;15253:24;15271:5;15253:24;:::i;:::-;15248:3;15241:37;15166:118;;:::o;15290:275::-;15422:3;15444:95;15535:3;15526:6;15444:95;:::i;:::-;15437:102;;15556:3;15549:10;;15290:275;;;;:::o;15571:1069::-;15940:3;15962:95;16053:3;16044:6;15962:95;:::i;:::-;15955:102;;16074:95;16165:3;16156:6;16074:95;:::i;:::-;16067:102;;16186:95;16277:3;16268:6;16186:95;:::i;:::-;16179:102;;16298:95;16389:3;16380:6;16298:95;:::i;:::-;16291:102;;16410:95;16501:3;16492:6;16410:95;:::i;:::-;16403:102;;16522:92;16610:3;16601:6;16522:92;:::i;:::-;16515:99;;16631:3;16624:10;;15571:1069;;;;;;;;;:::o;16646:1377::-;17105:3;17127:95;17218:3;17209:6;17127:95;:::i;:::-;17120:102;;17239:95;17330:3;17321:6;17239:95;:::i;:::-;17232:102;;17351:92;17439:3;17430:6;17351:92;:::i;:::-;17344:99;;17460:95;17551:3;17542:6;17460:95;:::i;:::-;17453:102;;17572:92;17660:3;17651:6;17572:92;:::i;:::-;17565:99;;17681:95;17772:3;17763:6;17681:95;:::i;:::-;17674:102;;17793:92;17881:3;17872:6;17793:92;:::i;:::-;17786:99;;17902:95;17993:3;17984:6;17902:95;:::i;:::-;17895:102;;18014:3;18007:10;;16646:1377;;;;;;;;;;;:::o;18029:1531::-;18533:3;18555:95;18646:3;18637:6;18555:95;:::i;:::-;18548:102;;18667:95;18758:3;18749:6;18667:95;:::i;:::-;18660:102;;18779:92;18867:3;18858:6;18779:92;:::i;:::-;18772:99;;18888:95;18979:3;18970:6;18888:95;:::i;:::-;18881:102;;19000:92;19088:3;19079:6;19000:92;:::i;:::-;18993:99;;19109:95;19200:3;19191:6;19109:95;:::i;:::-;19102:102;;19221:92;19309:3;19300:6;19221:92;:::i;:::-;19214:99;;19330:95;19421:3;19412:6;19330:95;:::i;:::-;19323:102;;19442:92;19530:3;19521:6;19442:92;:::i;:::-;19435:99;;19551:3;19544:10;;18029:1531;;;;;;;;;;;;:::o;19566:429::-;19743:3;19765:95;19856:3;19847:6;19765:95;:::i;:::-;19758:102;;19877:92;19965:3;19956:6;19877:92;:::i;:::-;19870:99;;19986:3;19979:10;;19566:429;;;;;:::o;20001:743::-;20271:3;20293:95;20384:3;20375:6;20293:95;:::i;:::-;20286:102;;20405:92;20493:3;20484:6;20405:92;:::i;:::-;20398:99;;20514:95;20605:3;20596:6;20514:95;:::i;:::-;20507:102;;20626:92;20714:3;20705:6;20626:92;:::i;:::-;20619:99;;20735:3;20728:10;;20001:743;;;;;;;:::o;20750:1057::-;21113:3;21135:95;21226:3;21217:6;21135:95;:::i;:::-;21128:102;;21247:92;21335:3;21326:6;21247:92;:::i;:::-;21240:99;;21356:95;21447:3;21438:6;21356:95;:::i;:::-;21349:102;;21468:92;21556:3;21547:6;21468:92;:::i;:::-;21461:99;;21577:95;21668:3;21659:6;21577:95;:::i;:::-;21570:102;;21689:92;21777:3;21768:6;21689:92;:::i;:::-;21682:99;;21798:3;21791:10;;20750:1057;;;;;;;;;:::o;21813:1685::-;22362:3;22384:95;22475:3;22466:6;22384:95;:::i;:::-;22377:102;;22496:92;22584:3;22575:6;22496:92;:::i;:::-;22489:99;;22605:95;22696:3;22687:6;22605:95;:::i;:::-;22598:102;;22717:92;22805:3;22796:6;22717:92;:::i;:::-;22710:99;;22826:95;22917:3;22908:6;22826:95;:::i;:::-;22819:102;;22938:92;23026:3;23017:6;22938:92;:::i;:::-;22931:99;;23047:95;23138:3;23129:6;23047:95;:::i;:::-;23040:102;;23159:92;23247:3;23238:6;23159:92;:::i;:::-;23152:99;;23268:95;23359:3;23350:6;23268:95;:::i;:::-;23261:102;;23380:92;23468:3;23459:6;23380:92;:::i;:::-;23373:99;;23489:3;23482:10;;21813:1685;;;;;;;;;;;;;:::o;23504:1513::-;23999:3;24021:95;24112:3;24103:6;24021:95;:::i;:::-;24014:102;;24133:92;24221:3;24212:6;24133:92;:::i;:::-;24126:99;;24242:92;24330:3;24321:6;24242:92;:::i;:::-;24235:99;;24351:92;24439:3;24430:6;24351:92;:::i;:::-;24344:99;;24460:92;24548:3;24539:6;24460:92;:::i;:::-;24453:99;;24569:95;24660:3;24651:6;24569:95;:::i;:::-;24562:102;;24681:92;24769:3;24760:6;24681:92;:::i;:::-;24674:99;;24790:92;24878:3;24869:6;24790:92;:::i;:::-;24783:99;;24899:92;24987:3;24978:6;24899:92;:::i;:::-;24892:99;;25008:3;25001:10;;23504:1513;;;;;;;;;;;;:::o;25023:429::-;25200:3;25222:92;25310:3;25301:6;25222:92;:::i;:::-;25215:99;;25331:95;25422:3;25413:6;25331:95;:::i;:::-;25324:102;;25443:3;25436:10;;25023:429;;;;;:::o;25458:903::-;25776:3;25798:92;25886:3;25877:6;25798:92;:::i;:::-;25791:99;;25907:95;25998:3;25989:6;25907:95;:::i;:::-;25900:102;;26019:95;26110:3;26101:6;26019:95;:::i;:::-;26012:102;;26131:95;26222:3;26213:6;26131:95;:::i;:::-;26124:102;;26243:92;26331:3;26322:6;26243:92;:::i;:::-;26236:99;;26352:3;26345:10;;25458:903;;;;;;;;:::o;26367:897::-;26682:3;26704:92;26792:3;26783:6;26704:92;:::i;:::-;26697:99;;26813:95;26904:3;26895:6;26813:95;:::i;:::-;26806:102;;26925:92;27013:3;27004:6;26925:92;:::i;:::-;26918:99;;27034:95;27125:3;27116:6;27034:95;:::i;:::-;27027:102;;27146:92;27234:3;27225:6;27146:92;:::i;:::-;27139:99;;27255:3;27248:10;;26367:897;;;;;;;;:::o;27270:1057::-;27633:3;27655:92;27743:3;27734:6;27655:92;:::i;:::-;27648:99;;27764:95;27855:3;27846:6;27764:95;:::i;:::-;27757:102;;27876:92;27964:3;27955:6;27876:92;:::i;:::-;27869:99;;27985:95;28076:3;28067:6;27985:95;:::i;:::-;27978:102;;28097:92;28185:3;28176:6;28097:92;:::i;:::-;28090:99;;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28318:3;28311:10;;27270:1057;;;;;;;;;:::o;28333:577::-;28552:3;28574:92;28662:3;28653:6;28574:92;:::i;:::-;28567:99;;28683:92;28771:3;28762:6;28683:92;:::i;:::-;28676:99;;28792:92;28880:3;28871:6;28792:92;:::i;:::-;28785:99;;28901:3;28894:10;;28333:577;;;;;;:::o;28916:891::-;29228:3;29250:92;29338:3;29329:6;29250:92;:::i;:::-;29243:99;;29359:92;29447:3;29438:6;29359:92;:::i;:::-;29352:99;;29468:92;29556:3;29547:6;29468:92;:::i;:::-;29461:99;;29577:95;29668:3;29659:6;29577:95;:::i;:::-;29570:102;;29689:92;29777:3;29768:6;29689:92;:::i;:::-;29682:99;;29798:3;29791:10;;28916:891;;;;;;;;:::o;29813:885::-;30122:3;30144:92;30232:3;30223:6;30144:92;:::i;:::-;30137:99;;30253:92;30341:3;30332:6;30253:92;:::i;:::-;30246:99;;30362:92;30450:3;30441:6;30362:92;:::i;:::-;30355:99;;30471:92;30559:3;30550:6;30471:92;:::i;:::-;30464:99;;30580:92;30668:3;30659:6;30580:92;:::i;:::-;30573:99;;30689:3;30682:10;;29813:885;;;;;;;;:::o;30704:222::-;30797:4;30835:2;30824:9;30820:18;30812:26;;30848:71;30916:1;30905:9;30901:17;30892:6;30848:71;:::i;:::-;30704:222;;;;:::o;30932:640::-;31127:4;31165:3;31154:9;31150:19;31142:27;;31179:71;31247:1;31236:9;31232:17;31223:6;31179:71;:::i;:::-;31260:72;31328:2;31317:9;31313:18;31304:6;31260:72;:::i;:::-;31342;31410:2;31399:9;31395:18;31386:6;31342:72;:::i;:::-;31461:9;31455:4;31451:20;31446:2;31435:9;31431:18;31424:48;31489:76;31560:4;31551:6;31489:76;:::i;:::-;31481:84;;30932:640;;;;;;;:::o;31578:210::-;31665:4;31703:2;31692:9;31688:18;31680:26;;31716:65;31778:1;31767:9;31763:17;31754:6;31716:65;:::i;:::-;31578:210;;;;:::o;31794:313::-;31907:4;31945:2;31934:9;31930:18;31922:26;;31994:9;31988:4;31984:20;31980:1;31969:9;31965:17;31958:47;32022:78;32095:4;32086:6;32022:78;:::i;:::-;32014:86;;31794:313;;;;:::o;32113:419::-;32279:4;32317:2;32306:9;32302:18;32294:26;;32366:9;32360:4;32356:20;32352:1;32341:9;32337:17;32330:47;32394:131;32520:4;32394:131;:::i;:::-;32386:139;;32113:419;;;:::o;32538:::-;32704:4;32742:2;32731:9;32727:18;32719:26;;32791:9;32785:4;32781:20;32777:1;32766:9;32762:17;32755:47;32819:131;32945:4;32819:131;:::i;:::-;32811:139;;32538:419;;;:::o;32963:::-;33129:4;33167:2;33156:9;33152:18;33144:26;;33216:9;33210:4;33206:20;33202:1;33191:9;33187:17;33180:47;33244:131;33370:4;33244:131;:::i;:::-;33236:139;;32963:419;;;:::o;33388:::-;33554:4;33592:2;33581:9;33577:18;33569:26;;33641:9;33635:4;33631:20;33627:1;33616:9;33612:17;33605:47;33669:131;33795:4;33669:131;:::i;:::-;33661:139;;33388:419;;;:::o;33813:::-;33979:4;34017:2;34006:9;34002:18;33994:26;;34066:9;34060:4;34056:20;34052:1;34041:9;34037:17;34030:47;34094:131;34220:4;34094:131;:::i;:::-;34086:139;;33813:419;;;:::o;34238:::-;34404:4;34442:2;34431:9;34427:18;34419:26;;34491:9;34485:4;34481:20;34477:1;34466:9;34462:17;34455:47;34519:131;34645:4;34519:131;:::i;:::-;34511:139;;34238:419;;;:::o;34663:::-;34829:4;34867:2;34856:9;34852:18;34844:26;;34916:9;34910:4;34906:20;34902:1;34891:9;34887:17;34880:47;34944:131;35070:4;34944:131;:::i;:::-;34936:139;;34663:419;;;:::o;35088:::-;35254:4;35292:2;35281:9;35277:18;35269:26;;35341:9;35335:4;35331:20;35327:1;35316:9;35312:17;35305:47;35369:131;35495:4;35369:131;:::i;:::-;35361:139;;35088:419;;;:::o;35513:::-;35679:4;35717:2;35706:9;35702:18;35694:26;;35766:9;35760:4;35756:20;35752:1;35741:9;35737:17;35730:47;35794:131;35920:4;35794:131;:::i;:::-;35786:139;;35513:419;;;:::o;35938:::-;36104:4;36142:2;36131:9;36127:18;36119:26;;36191:9;36185:4;36181:20;36177:1;36166:9;36162:17;36155:47;36219:131;36345:4;36219:131;:::i;:::-;36211:139;;35938:419;;;:::o;36363:::-;36529:4;36567:2;36556:9;36552:18;36544:26;;36616:9;36610:4;36606:20;36602:1;36591:9;36587:17;36580:47;36644:131;36770:4;36644:131;:::i;:::-;36636:139;;36363:419;;;:::o;36788:::-;36954:4;36992:2;36981:9;36977:18;36969:26;;37041:9;37035:4;37031:20;37027:1;37016:9;37012:17;37005:47;37069:131;37195:4;37069:131;:::i;:::-;37061:139;;36788:419;;;:::o;37213:::-;37379:4;37417:2;37406:9;37402:18;37394:26;;37466:9;37460:4;37456:20;37452:1;37441:9;37437:17;37430:47;37494:131;37620:4;37494:131;:::i;:::-;37486:139;;37213:419;;;:::o;37638:::-;37804:4;37842:2;37831:9;37827:18;37819:26;;37891:9;37885:4;37881:20;37877:1;37866:9;37862:17;37855:47;37919:131;38045:4;37919:131;:::i;:::-;37911:139;;37638:419;;;:::o;38063:::-;38229:4;38267:2;38256:9;38252:18;38244:26;;38316:9;38310:4;38306:20;38302:1;38291:9;38287:17;38280:47;38344:131;38470:4;38344:131;:::i;:::-;38336:139;;38063:419;;;:::o;38488:::-;38654:4;38692:2;38681:9;38677:18;38669:26;;38741:9;38735:4;38731:20;38727:1;38716:9;38712:17;38705:47;38769:131;38895:4;38769:131;:::i;:::-;38761:139;;38488:419;;;:::o;38913:::-;39079:4;39117:2;39106:9;39102:18;39094:26;;39166:9;39160:4;39156:20;39152:1;39141:9;39137:17;39130:47;39194:131;39320:4;39194:131;:::i;:::-;39186:139;;38913:419;;;:::o;39338:::-;39504:4;39542:2;39531:9;39527:18;39519:26;;39591:9;39585:4;39581:20;39577:1;39566:9;39562:17;39555:47;39619:131;39745:4;39619:131;:::i;:::-;39611:139;;39338:419;;;:::o;39763:::-;39929:4;39967:2;39956:9;39952:18;39944:26;;40016:9;40010:4;40006:20;40002:1;39991:9;39987:17;39980:47;40044:131;40170:4;40044:131;:::i;:::-;40036:139;;39763:419;;;:::o;40188:222::-;40281:4;40319:2;40308:9;40304:18;40296:26;;40332:71;40400:1;40389:9;40385:17;40376:6;40332:71;:::i;:::-;40188:222;;;;:::o;40416:129::-;40450:6;40477:20;;:::i;:::-;40467:30;;40506:33;40534:4;40526:6;40506:33;:::i;:::-;40416:129;;;:::o;40551:75::-;40584:6;40617:2;40611:9;40601:19;;40551:75;:::o;40632:307::-;40693:4;40783:18;40775:6;40772:30;40769:56;;;40805:18;;:::i;:::-;40769:56;40843:29;40865:6;40843:29;:::i;:::-;40835:37;;40927:4;40921;40917:15;40909:23;;40632:307;;;:::o;40945:141::-;40994:4;41017:3;41009:11;;41040:3;41037:1;41030:14;41074:4;41071:1;41061:18;41053:26;;40945:141;;;:::o;41092:98::-;41143:6;41177:5;41171:12;41161:22;;41092:98;;;:::o;41196:99::-;41248:6;41282:5;41276:12;41266:22;;41196:99;;;:::o;41301:168::-;41384:11;41418:6;41413:3;41406:19;41458:4;41453:3;41449:14;41434:29;;41301:168;;;;:::o;41475:169::-;41559:11;41593:6;41588:3;41581:19;41633:4;41628:3;41624:14;41609:29;;41475:169;;;;:::o;41650:148::-;41752:11;41789:3;41774:18;;41650:148;;;;:::o;41804:305::-;41844:3;41863:20;41881:1;41863:20;:::i;:::-;41858:25;;41897:20;41915:1;41897:20;:::i;:::-;41892:25;;42051:1;41983:66;41979:74;41976:1;41973:81;41970:107;;;42057:18;;:::i;:::-;41970:107;42101:1;42098;42094:9;42087:16;;41804:305;;;;:::o;42115:185::-;42155:1;42172:20;42190:1;42172:20;:::i;:::-;42167:25;;42206:20;42224:1;42206:20;:::i;:::-;42201:25;;42245:1;42235:35;;42250:18;;:::i;:::-;42235:35;42292:1;42289;42285:9;42280:14;;42115:185;;;;:::o;42306:348::-;42346:7;42369:20;42387:1;42369:20;:::i;:::-;42364:25;;42403:20;42421:1;42403:20;:::i;:::-;42398:25;;42591:1;42523:66;42519:74;42516:1;42513:81;42508:1;42501:9;42494:17;42490:105;42487:131;;;42598:18;;:::i;:::-;42487:131;42646:1;42643;42639:9;42628:20;;42306:348;;;;:::o;42660:191::-;42700:4;42720:20;42738:1;42720:20;:::i;:::-;42715:25;;42754:20;42772:1;42754:20;:::i;:::-;42749:25;;42793:1;42790;42787:8;42784:34;;;42798:18;;:::i;:::-;42784:34;42843:1;42840;42836:9;42828:17;;42660:191;;;;:::o;42857:185::-;42895:4;42915:18;42931:1;42915:18;:::i;:::-;42910:23;;42947:18;42963:1;42947:18;:::i;:::-;42942:23;;42984:1;42981;42978:8;42975:34;;;42989:18;;:::i;:::-;42975:34;43034:1;43031;43027:9;43019:17;;42857:185;;;;:::o;43048:96::-;43085:7;43114:24;43132:5;43114:24;:::i;:::-;43103:35;;43048:96;;;:::o;43150:90::-;43184:7;43227:5;43220:13;43213:21;43202:32;;43150:90;;;:::o;43246:149::-;43282:7;43322:66;43315:5;43311:78;43300:89;;43246:149;;;:::o;43401:126::-;43438:7;43478:42;43471:5;43467:54;43456:65;;43401:126;;;:::o;43533:77::-;43570:7;43599:5;43588:16;;43533:77;;;:::o;43616:86::-;43651:7;43691:4;43684:5;43680:16;43669:27;;43616:86;;;:::o;43708:154::-;43792:6;43787:3;43782;43769:30;43854:1;43845:6;43840:3;43836:16;43829:27;43708:154;;;:::o;43868:307::-;43936:1;43946:113;43960:6;43957:1;43954:13;43946:113;;;44045:1;44040:3;44036:11;44030:18;44026:1;44021:3;44017:11;44010:39;43982:2;43979:1;43975:10;43970:15;;43946:113;;;44077:6;44074:1;44071:13;44068:101;;;44157:1;44148:6;44143:3;44139:16;44132:27;44068:101;43917:258;43868:307;;;:::o;44181:320::-;44225:6;44262:1;44256:4;44252:12;44242:22;;44309:1;44303:4;44299:12;44330:18;44320:81;;44386:4;44378:6;44374:17;44364:27;;44320:81;44448:2;44440:6;44437:14;44417:18;44414:38;44411:84;;;44467:18;;:::i;:::-;44411:84;44232:269;44181:320;;;:::o;44507:281::-;44590:27;44612:4;44590:27;:::i;:::-;44582:6;44578:40;44720:6;44708:10;44705:22;44684:18;44672:10;44669:34;44666:62;44663:88;;;44731:18;;:::i;:::-;44663:88;44771:10;44767:2;44760:22;44550:238;44507:281;;:::o;44794:233::-;44833:3;44856:24;44874:5;44856:24;:::i;:::-;44847:33;;44902:66;44895:5;44892:77;44889:103;;;44972:18;;:::i;:::-;44889:103;45019:1;45012:5;45008:13;45001:20;;44794:233;;;:::o;45033:167::-;45070:3;45093:22;45109:5;45093:22;:::i;:::-;45084:31;;45137:4;45130:5;45127:15;45124:41;;;45145:18;;:::i;:::-;45124:41;45192:1;45185:5;45181:13;45174:20;;45033:167;;;:::o;45206:176::-;45238:1;45255:20;45273:1;45255:20;:::i;:::-;45250:25;;45289:20;45307:1;45289:20;:::i;:::-;45284:25;;45328:1;45318:35;;45333:18;;:::i;:::-;45318:35;45374:1;45371;45367:9;45362:14;;45206:176;;;;:::o;45388:180::-;45436:77;45433:1;45426:88;45533:4;45530:1;45523:15;45557:4;45554:1;45547:15;45574:180;45622:77;45619:1;45612:88;45719:4;45716:1;45709:15;45743:4;45740:1;45733:15;45760:180;45808:77;45805:1;45798:88;45905:4;45902:1;45895:15;45929:4;45926:1;45919:15;45946:180;45994:77;45991:1;45984:88;46091:4;46088:1;46081:15;46115:4;46112:1;46105:15;46132:180;46180:77;46177:1;46170:88;46277:4;46274:1;46267:15;46301:4;46298:1;46291:15;46318:180;46366:77;46363:1;46356:88;46463:4;46460:1;46453:15;46487:4;46484:1;46477:15;46504:117;46613:1;46610;46603:12;46627:117;46736:1;46733;46726:12;46750:117;46859:1;46856;46849:12;46873:117;46982:1;46979;46972:12;46996:102;47037:6;47088:2;47084:7;47079:2;47072:5;47068:14;47064:28;47054:38;;46996:102;;;:::o;47104:230::-;47244:34;47240:1;47232:6;47228:14;47221:58;47313:13;47308:2;47300:6;47296:15;47289:38;47104:230;:::o;47340:237::-;47480:34;47476:1;47468:6;47464:14;47457:58;47549:20;47544:2;47536:6;47532:15;47525:45;47340:237;:::o;47583:225::-;47723:34;47719:1;47711:6;47707:14;47700:58;47792:8;47787:2;47779:6;47775:15;47768:33;47583:225;:::o;47814:178::-;47954:30;47950:1;47942:6;47938:14;47931:54;47814:178;:::o;47998:223::-;48138:34;48134:1;48126:6;48122:14;48115:58;48207:6;48202:2;48194:6;48190:15;48183:31;47998:223;:::o;48227:175::-;48367:27;48363:1;48355:6;48351:14;48344:51;48227:175;:::o;48408:231::-;48548:34;48544:1;48536:6;48532:14;48525:58;48617:14;48612:2;48604:6;48600:15;48593:39;48408:231;:::o;48645:243::-;48785:34;48781:1;48773:6;48769:14;48762:58;48854:26;48849:2;48841:6;48837:15;48830:51;48645:243;:::o;48894:229::-;49034:34;49030:1;49022:6;49018:14;49011:58;49103:12;49098:2;49090:6;49086:15;49079:37;48894:229;:::o;49129:228::-;49269:34;49265:1;49257:6;49253:14;49246:58;49338:11;49333:2;49325:6;49321:15;49314:36;49129:228;:::o;49363:182::-;49503:34;49499:1;49491:6;49487:14;49480:58;49363:182;:::o;49551:231::-;49691:34;49687:1;49679:6;49675:14;49668:58;49760:14;49755:2;49747:6;49743:15;49736:39;49551:231;:::o;49788:182::-;49928:34;49924:1;49916:6;49912:14;49905:58;49788:182;:::o;49976:228::-;50116:34;50112:1;50104:6;50100:14;50093:58;50185:11;50180:2;50172:6;50168:15;50161:36;49976:228;:::o;50210:220::-;50350:34;50346:1;50338:6;50334:14;50327:58;50419:3;50414:2;50406:6;50402:15;50395:28;50210:220;:::o;50436:236::-;50576:34;50572:1;50564:6;50560:14;50553:58;50645:19;50640:2;50632:6;50628:15;50621:44;50436:236;:::o;50678:231::-;50818:34;50814:1;50806:6;50802:14;50795:58;50887:14;50882:2;50874:6;50870:15;50863:39;50678:231;:::o;50915:163::-;51055:15;51051:1;51043:6;51039:14;51032:39;50915:163;:::o;51084:181::-;51224:33;51220:1;51212:6;51208:14;51201:57;51084:181;:::o;51271:122::-;51344:24;51362:5;51344:24;:::i;:::-;51337:5;51334:35;51324:63;;51383:1;51380;51373:12;51324:63;51271:122;:::o;51399:116::-;51469:21;51484:5;51469:21;:::i;:::-;51462:5;51459:32;51449:60;;51505:1;51502;51495:12;51449:60;51399:116;:::o;51521:120::-;51593:23;51610:5;51593:23;:::i;:::-;51586:5;51583:34;51573:62;;51631:1;51628;51621:12;51573:62;51521:120;:::o;51647:122::-;51720:24;51738:5;51720:24;:::i;:::-;51713:5;51710:35;51700:63;;51759:1;51756;51749:12;51700:63;51647:122;:::o
Swarm Source
ipfs://04648e75424ef98bb4ea014ac070c10e02ee3ed4acab04389361d3ff4abc2acc
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.