More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 22,588 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 65907545 | 118 days ago | IN | 0 POL | 0.01283095 | ||||
Set Approval For... | 65681466 | 124 days ago | IN | 0 POL | 0.06681344 | ||||
Set Approval For... | 65559082 | 127 days ago | IN | 0 POL | 0.00179421 | ||||
Set Approval For... | 65262682 | 135 days ago | IN | 0 POL | 0.00140307 | ||||
Set Approval For... | 64296979 | 159 days ago | IN | 0 POL | 0.00313753 | ||||
Set Approval For... | 64073583 | 164 days ago | IN | 0 POL | 0.00233845 | ||||
Transfer From | 63309976 | 183 days ago | IN | 0 POL | 0.0014297 | ||||
Transfer From | 63309904 | 183 days ago | IN | 0 POL | 0.0014297 | ||||
Set Approval For... | 62945845 | 192 days ago | IN | 0 POL | 0.00233845 | ||||
Mint With Signat... | 62560571 | 202 days ago | IN | 0 POL | 0.0048351 | ||||
Set Approval For... | 62552945 | 202 days ago | IN | 0 POL | 0.00167547 | ||||
Set Approval For... | 62190174 | 211 days ago | IN | 0 POL | 0.00140307 | ||||
Set Approval For... | 61370253 | 231 days ago | IN | 0 POL | 0.00089485 | ||||
Set Approval For... | 61304158 | 233 days ago | IN | 0 POL | 0.00140307 | ||||
Transfer From | 60975704 | 241 days ago | IN | 0 POL | 0.0014297 | ||||
Mint With Signat... | 60965970 | 242 days ago | IN | 0 POL | 0.00500428 | ||||
Set Approval For... | 60909157 | 243 days ago | IN | 0 POL | 0.00233845 | ||||
Set Approval For... | 60819043 | 245 days ago | IN | 0 POL | 0.00233845 | ||||
Set Approval For... | 60521710 | 253 days ago | IN | 0 POL | 0.00140307 | ||||
Set Approval For... | 60508631 | 253 days ago | IN | 0 POL | 0.00233845 | ||||
Mint With Signat... | 60172190 | 262 days ago | IN | 0 POL | 0.00123131 | ||||
Mint With Signat... | 59994664 | 266 days ago | IN | 0 POL | 0.00141474 | ||||
Mint With Signat... | 59994664 | 266 days ago | IN | 0 POL | 0.00124977 | ||||
Mint With Signat... | 59994664 | 266 days ago | IN | 0 POL | 0.00125268 | ||||
Mint With Signat... | 59994664 | 266 days ago | IN | 0 POL | 0.00475416 |
Loading...
Loading
Contract Name:
SocialScanBadge
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2024-03-16 */ pragma solidity ^0.8.7; pragma experimental ABIEncoderV2; // SPDX-License-Identifier: MIT /** * @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 payable; /** * @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 payable; } /** * @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); function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @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 Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly {size := extcodesize(account)} return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success,) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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 Ownable, 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; // Base URI string private _baseURI; /** * @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 base = baseURI(); // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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 || ERC721.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 payable override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual payable 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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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"); require(_balances[to] < 1, "ERC721: Address already owns a token"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {} } /** * @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]; } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256[] memory memoryArray = new uint256[](ERC721.balanceOf(owner)); for (uint i = 0; i < ERC721.balanceOf(owner); i++) { memoryArray[i] = _ownedTokens[owner][i]; } return memoryArray; } /** * @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(); } } /** * @dev ERC721 token with storage based token uri management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); return super.tokenURI(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 override { super._burn(tokenId); } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override { require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } contract SocialScanBadge is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, AccessControl, ERC721Burnable { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bool _publicMint; constructor(string memory name_, string memory symbol_, bool publicMint) ERC721(name_, symbol_) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _publicMint = publicMint; } using Counters for Counters.Counter; Counters.Counter private _tokenIds; function pause() public { require( hasRole(PAUSER_ROLE, _msgSender()), "SocialScanBadge: must have pauser role to pause" ); _pause(); } function unpause() public { require( hasRole(PAUSER_ROLE, _msgSender()), "SocialScanBadge: must have pauser role to pause" ); _unpause(); } /** * @dev Function to mint tokens. * @param to The address that will receive the minted tokens. * @param tokenId The token id to mint. * @return A boolean that indicates if the operation was successful. */ function ownerMint( address to, uint256 tokenId ) public returns (bool) { if (!_publicMint) { require( hasRole(MINTER_ROLE, _msgSender()), "SocialScanBadge: must have minter role to mint" ); } _safeMint(to, tokenId); return true; } function getInfoHash( address _attendee, uint256 _signDate, string calldata _message ) public pure returns (bytes32) { return keccak256( abi.encode(_attendee, _signDate, _message) ); } function getInfoHash( address _attendee, string calldata _message ) public pure returns (bytes32) { return keccak256( abi.encode(_attendee, _message) ); } function checkInWithSignature(string calldata message, address signer, uint256 signDate, bytes calldata signature) payable public { uint256 currentDate = getCurrentTime(); require(compareDates(currentDate, signDate),"The sign date is not today"); require(hasRole(MINTER_ROLE, signer), "The signer does not have the required role"); bytes32 infoHash = getInfoHash(_msgSender(), signDate, message); require(recoverSigner(infoHash, signature) == signer, "The signature provided does not match"); } function checkInWithSignature(string calldata message, address signer, bytes calldata signature) payable public { require(hasRole(MINTER_ROLE, signer), "The signer does not have the required role"); bytes32 infoHash = getInfoHash(_msgSender(), message); require(recoverSigner(infoHash, signature) == signer, "The signature provided does not match"); } function getCurrentTime() public view returns (uint256) { return uint256(block.timestamp); } function compareDates(uint256 timestamp1, uint256 timestamp2) public pure returns (bool) { uint256 dayInSeconds = 86400; // 1 day in seconds uint256 day1 = timestamp1 / dayInSeconds; uint256 day2 = timestamp2 / dayInSeconds; uint256 monthInSeconds = 30 * dayInSeconds; // Assuming each month has 30 days uint256 year1 = day1 / (365 * dayInSeconds); uint256 month1 = (day1 % (365 * dayInSeconds)) / monthInSeconds; uint256 dayOfMonth1 = (day1 % monthInSeconds) / dayInSeconds; uint256 year2 = day2 / (365 * dayInSeconds); uint256 month2 = (day2 % (365 * dayInSeconds)) / monthInSeconds; uint256 dayOfMonth2 = (day2 % monthInSeconds) / dayInSeconds; return year1 == year2 && month1 == month2 && dayOfMonth1 == dayOfMonth2; } function getMintHash( address _to, uint256 _signDate ) public pure returns (bytes32) { return keccak256( abi.encode(_to, _signDate) ); } /* Mint if have been pre-approved using signature of the owner */ function mintWithSignature(address signer, address to, uint256 signDate, bytes calldata signature) payable public { require(hasRole(MINTER_ROLE, signer), "The signer does not have the required role"); bytes32 mintHash = getMintHash(to, signDate); require(recoverSigner(mintHash, signature) == signer, "The signature provided does not match"); _tokenIds.increment(); _safeMint(to, _tokenIds.current()); } function recoverSigner( bytes32 _ethSignedMessageHash, bytes memory _signature ) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature( bytes memory sig ) internal pure returns (bytes32 r, bytes32 s, uint8 v) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function safeTransfer(address to, uint256 tokenId, bytes calldata data) public virtual { super._safeTransfer(_msgSender(), to, tokenId, data); } function safeTransfer(address to, uint256 tokenId) public virtual { super._safeTransfer(_msgSender(), to, tokenId, ""); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { require(from == address(0), "Err: token transfer is BLOCKED"); super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"bool","name":"publicMint","type":"bool"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"checkInWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"signDate","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"checkInWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp1","type":"uint256"},{"internalType":"uint256","name":"timestamp2","type":"uint256"}],"name":"compareDates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_attendee","type":"address"},{"internalType":"string","name":"_message","type":"string"}],"name":"getInfoHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_attendee","type":"address"},{"internalType":"uint256","name":"_signDate","type":"uint256"},{"internalType":"string","name":"_message","type":"string"}],"name":"getInfoHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_signDate","type":"uint256"}],"name":"getMintHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"signDate","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162006517380380620065178339818101604052810190620000379190620004f5565b8282620000596200004d6200017160201b60201c565b6200017960201b60201c565b816001908051906020019062000071929190620003b0565b5080600290805190602001906200008a929190620003b0565b5050506000600c60006101000a81548160ff021916908315150217905550620000cc6000801b620000c06200017160201b60201c565b6200023d60201b60201c565b6200010d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001016200017160201b60201c565b6200023d60201b60201c565b6200014e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001426200017160201b60201c565b6200023d60201b60201c565b80600e60006101000a81548160ff02191690831515021790555050505062000739565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024f82826200025360201b60201c565b5050565b6200026582826200034560201b60201c565b62000341576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002e66200017160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003be9062000630565b90600052602060002090601f016020900481019282620003e257600085556200042e565b82601f10620003fd57805160ff19168380011785556200042e565b828001600101855582156200042e579182015b828111156200042d57825182559160200191906001019062000410565b5b5090506200043d919062000441565b5090565b5b808211156200045c57600081600090555060010162000442565b5090565b6000620004776200047184620005b8565b6200058f565b905082815260208101848484011115620004965762000495620006ff565b5b620004a3848285620005fa565b509392505050565b600081519050620004bc816200071f565b92915050565b600082601f830112620004da57620004d9620006fa565b5b8151620004ec84826020860162000460565b91505092915050565b60008060006060848603121562000511576200051062000709565b5b600084015167ffffffffffffffff81111562000532576200053162000704565b5b6200054086828701620004c2565b935050602084015167ffffffffffffffff81111562000564576200056362000704565b5b6200057286828701620004c2565b92505060406200058586828701620004ab565b9150509250925092565b60006200059b620005ae565b9050620005a9828262000666565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d657620005d5620006cb565b5b620005e1826200070e565b9050602081019050919050565b60008115159050919050565b60005b838110156200061a578082015181840152602081019050620005fd565b838111156200062a576000848401525b50505050565b600060028204905060018216806200064957607f821691505b6020821081141562000660576200065f6200069c565b5b50919050565b62000671826200070e565b810181811067ffffffffffffffff82111715620006935762000692620006cb565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200072a81620005ee565b81146200073657600080fd5b50565b615dce80620007496000396000f3fe6080604052600436106102725760003560e01c806355f804b31161014f57806391d14854116100c1578063d53913931161007a578063d53913931461097b578063d547741f146109a6578063e63ab1e9146109cf578063e985e9c5146109fa578063eb79554914610a37578063f2fde38b14610a6057610272565b806391d148541461086657806395d89b41146108a3578063a217fddf146108ce578063a22cb465146108f9578063b88d4fde14610922578063c87b56dd1461093e57610272565b8063715018a611610113578063715018a6146107775780637da525911461078e57806381e6dd5c146107cb5780638456cb59146107e75780638462151c146107fe5780638da5cb5b1461083b57610272565b806355f804b31461067e5780635c975abb146106a75780636352211e146106d25780636c0360eb1461070f57806370a082311461073a57610272565b80632f745c59116101e857806342842e0e116101ac57806342842e0e1461054557806342966c6814610561578063484b973c1461058a5780634d0ed891146105c75780634f6ccce71461060457806353fb99b31461064157610272565b80632f745c591461046257806336568abe1461049f5780633f4ba83a146104c8578063417db48f146104df578063423f6cef1461051c57610272565b8063170bbf241161023a578063170bbf241461036157806318160ddd1461037d57806323b872dd146103a8578063248a9ca3146103d157806329cb924d1461040e5780632f2ff15d1461043957610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c578063110ee30014610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906140b2565b610a89565b6040516102ab9190614a69565b60405180910390f35b3480156102c057600080fd5b506102c9610a9b565b6040516102d69190614ae4565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614291565b610b2d565b6040516103139190614945565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613f1d565b610bb2565b005b61035f600480360381019061035a919061410c565b610cca565b005b61037b60048036038101906103769190613d72565b610e0c565b005b34801561038957600080fd5b50610392610f63565b60405161039f9190614f26565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca9190613d1f565b610f70565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190614045565b610fd0565b6040516104059190614a84565b60405180910390f35b34801561041a57600080fd5b50610423610ff0565b6040516104309190614f26565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190614072565b610ff8565b005b34801561046e57600080fd5b5061048960048036038101906104849190613f1d565b61105e565b6040516104969190614f26565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190614072565b611103565b005b3480156104d457600080fd5b506104dd611186565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613ebd565b611200565b6040516105139190614a84565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613f1d565b611236565b005b61055f600480360381019061055a9190613d1f565b61125c565b005b34801561056d57600080fd5b5061058860048036038101906105839190614291565b61127c565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613f1d565b6112d8565b6040516105be9190614a69565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190613fd1565b611373565b6040516105fb9190614a84565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190614291565b6113ac565b6040516106389190614f26565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906142be565b61141d565b6040516106759190614a69565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190614248565b611542565b005b3480156106b357600080fd5b506106bc6115ca565b6040516106c99190614a69565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190614291565b6115e1565b6040516107069190614945565b60405180910390f35b34801561071b57600080fd5b50610724611693565b6040516107319190614ae4565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613cb2565b611725565b60405161076e9190614f26565b60405180910390f35b34801561078357600080fd5b5061078c6117dd565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613f1d565b611865565b6040516107c29190614a84565b60405180910390f35b6107e560048036038101906107e091906141a1565b611898565b005b3480156107f357600080fd5b506107fc611a32565b005b34801561080a57600080fd5b5061082560048036038101906108209190613cb2565b611aac565b6040516108329190614a47565b60405180910390f35b34801561084757600080fd5b50610850611ba3565b60405161085d9190614945565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190614072565b611bcc565b60405161089a9190614a69565b60405180910390f35b3480156108af57600080fd5b506108b8611c37565b6040516108c59190614ae4565b60405180910390f35b3480156108da57600080fd5b506108e3611cc9565b6040516108f09190614a84565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613e7d565b611cd0565b005b61093c60048036038101906109379190613dfa565b611e51565b005b34801561094a57600080fd5b5061096560048036038101906109609190614291565b611eb3565b6040516109729190614ae4565b60405180910390f35b34801561098757600080fd5b50610990611ec5565b60405161099d9190614a84565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190614072565b611ee9565b005b3480156109db57600080fd5b506109e4611f4f565b6040516109f19190614a84565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190613cdf565b611f73565b604051610a2e9190614a69565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613f5d565b612007565b005b348015610a6c57600080fd5b50610a876004803603810190610a829190613cb2565b612064565b005b6000610a948261215c565b9050919050565b606060018054610aaa90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad690615226565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000610b38826121d6565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90614d86565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbd826115e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590614e06565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4d612242565b73ffffffffffffffffffffffffffffffffffffffff161480610c7c5750610c7b81610c76612242565b611f73565b5b610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290614cc6565b60405180910390fd5b610cc5838361224a565b505050565b610cf47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684611bcc565b610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614c46565b60405180910390fd5b6000610d47610d40612242565b8787611200565b90508373ffffffffffffffffffffffffffffffffffffffff16610dae8285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614ca6565b60405180910390fd5b505050505050565b610e367f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a686611bcc565b610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90614c46565b60405180910390fd5b6000610e818585611865565b90508573ffffffffffffffffffffffffffffffffffffffff16610ee88285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614ca6565b60405180910390fd5b610f48600f612372565b610f5b85610f56600f612388565b612396565b505050505050565b6000600a80549050905090565b610f81610f7b612242565b826123b4565b610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790614e26565b60405180910390fd5b610fcb838383612492565b505050565b6000600d6000838152602001908152602001600020600101549050919050565b600042905090565b61101161100483610fd0565b61100c612242565b611bcc565b611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790614b06565b60405180910390fd5b61105a82826126ee565b5050565b600061106983611725565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614b46565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61110b612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90614ee6565b60405180910390fd5b61118282826127cf565b5050565b6111b77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111b2612242565b611bcc565b6111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90614d26565b60405180910390fd5b6111fe6128b1565b565b6000838383604051602001611217939291906149ac565b6040516020818303038152906040528051906020012090509392505050565b611258611241612242565b838360405180602001604052806000815250612953565b5050565b61127783838360405180602001604052806000815250611e51565b505050565b61128d611287612242565b826123b4565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614ea6565b60405180910390fd5b6112d5816129af565b50565b6000600e60009054906101000a900460ff1661135f5761131f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661131a612242565b611bcc565b61135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614f06565b60405180910390fd5b5b6113698383612396565b6001905092915050565b60008484848460405160200161138c9493929190614a07565b604051602081830303815290604052805190602001209050949350505050565b60006113b6610f63565b82106113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90614e46565b60405180910390fd5b600a828154811061140b5761140a6153bf565b5b90600052602060002001549050919050565b60008062015180905060008185611434919061509a565b905060008285611444919061509a565b9050600083601e61145591906150cb565b905060008461016d61146791906150cb565b84611472919061509a565b90506000828661016d61148591906150cb565b8661149091906152d2565b61149a919061509a565b905060008684876114ab91906152d2565b6114b5919061509a565b905060008761016d6114c791906150cb565b866114d2919061509a565b90506000858961016d6114e591906150cb565b886114f091906152d2565b6114fa919061509a565b9050600089878961150b91906152d2565b611515919061509a565b9050828614801561152557508185145b801561153057508084145b9a505050505050505050505092915050565b61154a612242565b73ffffffffffffffffffffffffffffffffffffffff16611568611ba3565b73ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590614da6565b60405180910390fd5b6115c7816129bb565b50565b6000600c60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190614d06565b60405180910390fd5b80915050919050565b6060600780546116a290615226565b80601f01602080910402602001604051908101604052809291908181526020018280546116ce90615226565b801561171b5780601f106116f05761010080835404028352916020019161171b565b820191906000526020600020905b8154815290600101906020018083116116fe57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614ce6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e5612242565b73ffffffffffffffffffffffffffffffffffffffff16611803611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614da6565b60405180910390fd5b61186360006129d5565b565b6000828260405160200161187a9291906149de565b60405160208183030381529060405280519060200120905092915050565b60006118a2610ff0565b90506118ae818561141d565b6118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490614c06565b60405180910390fd5b6119177f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a686611bcc565b611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90614c46565b60405180910390fd5b600061196b611963612242565b868a8a611373565b90508573ffffffffffffffffffffffffffffffffffffffff166119d28286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614ca6565b60405180910390fd5b5050505050505050565b611a637f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611a5e612242565b611bcc565b611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614d26565b60405180910390fd5b611aaa612a99565b565b60606000611ab983611725565b67ffffffffffffffff811115611ad257611ad16153ee565b5b604051908082528060200260200182016040528015611b005781602001602082028036833780820191505090505b50905060005b611b0f84611725565b811015611b9957600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110611b7a57611b796153bf565b5b6020026020010181815250508080611b9190615289565b915050611b06565b5080915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611c4690615226565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7290615226565b8015611cbf5780601f10611c9457610100808354040283529160200191611cbf565b820191906000526020600020905b815481529060010190602001808311611ca257829003601f168201915b5050505050905090565b6000801b81565b611cd8612242565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614be6565b60405180910390fd5b8060066000611d53612242565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e00612242565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e459190614a69565b60405180910390a35050565b611e62611e5c612242565b836123b4565b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614e26565b60405180910390fd5b611ead84848484612953565b50505050565b6060611ebe82612b3c565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611f02611ef583610fd0565b611efd612242565b611bcc565b611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3890614c66565b60405180910390fd5b611f4b82826127cf565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61205e612012612242565b858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612953565b50505050565b61206c612242565b73ffffffffffffffffffffffffffffffffffffffff1661208a611ba3565b73ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790614da6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790614b86565b60405180910390fd5b612159816129d5565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121cf57506121ce82612b96565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122bd836115e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008061231285612c10565b9250925092506001868285856040516000815260200160405260405161233b9493929190614a9f565b6020604051602081039080840390855afa15801561235d573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6123b0828260405180602001604052806000815250612c78565b5050565b60006123bf826121d6565b6123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614c26565b60405180910390fd5b6000612409836115e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061247857508373ffffffffffffffffffffffffffffffffffffffff1661246084610b2d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061248957506124888185611f73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124b2826115e1565b73ffffffffffffffffffffffffffffffffffffffff1614612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90614dc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256f90614bc6565b60405180910390fd5b612583838383612cd3565b61258e60008261224a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125de9190615125565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126359190615044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126f88282611bcc565b6127cb576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612770612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6127d98282611bcc565b156128ad576000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612852612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6128b96115ca565b6128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef90614b26565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61293c612242565b6040516129499190614945565b60405180910390a1565b61295e848484612492565b61296a84848484612d9a565b6129a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a090614b66565b60405180910390fd5b50505050565b6129b881612f31565b50565b80600790805190602001906129d1929190613a05565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa16115ca565b15612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890614c86565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b25612242565b604051612b329190614945565b60405180910390a1565b6060612b47826121d6565b612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d90614d66565b60405180910390fd5b612b8f82612f3d565b9050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c095750612c0882612fc5565b5b9050919050565b60008060006041845114612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5090614e86565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b612c8283836130a7565b612c8f6000848484612d9a565b612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc590614b66565b60405180910390fd5b505050565b612cdb6115ca565b15612d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1290614c86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190614ec6565b60405180910390fd5b612d958383836132f7565b505050565b6000612dbb8473ffffffffffffffffffffffffffffffffffffffff1661340b565b15612f24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612de4612242565b8786866040518563ffffffff1660e01b8152600401612e069493929190614960565b602060405180830381600087803b158015612e2057600080fd5b505af1925050508015612e5157506040513d601f19601f82011682018060405250810190612e4e91906140df565b60015b612ed4573d8060008114612e81576040519150601f19603f3d011682016040523d82523d6000602084013e612e86565b606091505b50600081511415612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390614b66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f29565b600190505b949350505050565b612f3a8161341e565b50565b6060612f48826121d6565b612f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e90614de6565b60405180910390fd5b6000612f91611693565b905080612f9d8461352f565b604051602001612fae929190614921565b604051602081830303815290604052915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061309057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130a0575061309f82613690565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310e90614d46565b60405180910390fd5b613120816121d6565b15613160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315790614ba6565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990614e66565b60405180910390fd5b6131ee60008383612cd3565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461323e9190615044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6133028383836136fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561334557613340816136ff565b613384565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613383576133828382613748565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c7576133c2816138b5565b613406565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613405576134048282613986565b5b5b505050565b600080823b905060008111915050919050565b6000613429826115e1565b905061343781600084612cd3565b61344260008361224a565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134929190615125565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60606000821415613577576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061368b565b600082905060005b600082146135a957808061359290615289565b915050600a826135a2919061509a565b915061357f565b60008167ffffffffffffffff8111156135c5576135c46153ee565b5b6040519080825280601f01601f1916602001820160405280156135f75781602001600182028036833780820191505090505b5090505b60008514613684576001826136109190615125565b9150600a8561361f91906152d2565b603061362b9190615044565b60f81b818381518110613641576136406153bf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561367d919061509a565b94506135fb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161375584611725565b61375f9190615125565b9050600060096000848152602001908152602001600020549050818114613844576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506138c99190615125565b90506000600b60008481526020019081526020016000205490506000600a83815481106138f9576138f86153bf565b5b9060005260206000200154905080600a838154811061391b5761391a6153bf565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061396a57613969615390565b5b6001900381819060005260206000200160009055905550505050565b600061399183611725565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613a1190615226565b90600052602060002090601f016020900481019282613a335760008555613a7a565b82601f10613a4c57805160ff1916838001178555613a7a565b82800160010185558215613a7a579182015b82811115613a79578251825591602001919060010190613a5e565b5b509050613a879190613a8b565b5090565b5b80821115613aa4576000816000905550600101613a8c565b5090565b6000613abb613ab684614f66565b614f41565b905082815260208101848484011115613ad757613ad661542c565b5b613ae28482856151e4565b509392505050565b6000613afd613af884614f97565b614f41565b905082815260208101848484011115613b1957613b1861542c565b5b613b248482856151e4565b509392505050565b600081359050613b3b81615d25565b92915050565b600081359050613b5081615d3c565b92915050565b600081359050613b6581615d53565b92915050565b600081359050613b7a81615d6a565b92915050565b600081519050613b8f81615d6a565b92915050565b60008083601f840112613bab57613baa615422565b5b8235905067ffffffffffffffff811115613bc857613bc761541d565b5b602083019150836001820283011115613be457613be3615427565b5b9250929050565b600082601f830112613c0057613bff615422565b5b8135613c10848260208601613aa8565b91505092915050565b60008083601f840112613c2f57613c2e615422565b5b8235905067ffffffffffffffff811115613c4c57613c4b61541d565b5b602083019150836001820283011115613c6857613c67615427565b5b9250929050565b600082601f830112613c8457613c83615422565b5b8135613c94848260208601613aea565b91505092915050565b600081359050613cac81615d81565b92915050565b600060208284031215613cc857613cc7615436565b5b6000613cd684828501613b2c565b91505092915050565b60008060408385031215613cf657613cf5615436565b5b6000613d0485828601613b2c565b9250506020613d1585828601613b2c565b9150509250929050565b600080600060608486031215613d3857613d37615436565b5b6000613d4686828701613b2c565b9350506020613d5786828701613b2c565b9250506040613d6886828701613c9d565b9150509250925092565b600080600080600060808688031215613d8e57613d8d615436565b5b6000613d9c88828901613b2c565b9550506020613dad88828901613b2c565b9450506040613dbe88828901613c9d565b935050606086013567ffffffffffffffff811115613ddf57613dde615431565b5b613deb88828901613b95565b92509250509295509295909350565b60008060008060808587031215613e1457613e13615436565b5b6000613e2287828801613b2c565b9450506020613e3387828801613b2c565b9350506040613e4487828801613c9d565b925050606085013567ffffffffffffffff811115613e6557613e64615431565b5b613e7187828801613beb565b91505092959194509250565b60008060408385031215613e9457613e93615436565b5b6000613ea285828601613b2c565b9250506020613eb385828601613b41565b9150509250929050565b600080600060408486031215613ed657613ed5615436565b5b6000613ee486828701613b2c565b935050602084013567ffffffffffffffff811115613f0557613f04615431565b5b613f1186828701613c19565b92509250509250925092565b60008060408385031215613f3457613f33615436565b5b6000613f4285828601613b2c565b9250506020613f5385828601613c9d565b9150509250929050565b60008060008060608587031215613f7757613f76615436565b5b6000613f8587828801613b2c565b9450506020613f9687828801613c9d565b935050604085013567ffffffffffffffff811115613fb757613fb6615431565b5b613fc387828801613b95565b925092505092959194509250565b60008060008060608587031215613feb57613fea615436565b5b6000613ff987828801613b2c565b945050602061400a87828801613c9d565b935050604085013567ffffffffffffffff81111561402b5761402a615431565b5b61403787828801613c19565b925092505092959194509250565b60006020828403121561405b5761405a615436565b5b600061406984828501613b56565b91505092915050565b6000806040838503121561408957614088615436565b5b600061409785828601613b56565b92505060206140a885828601613b2c565b9150509250929050565b6000602082840312156140c8576140c7615436565b5b60006140d684828501613b6b565b91505092915050565b6000602082840312156140f5576140f4615436565b5b600061410384828501613b80565b91505092915050565b60008060008060006060868803121561412857614127615436565b5b600086013567ffffffffffffffff81111561414657614145615431565b5b61415288828901613c19565b9550955050602061416588828901613b2c565b935050604086013567ffffffffffffffff81111561418657614185615431565b5b61419288828901613b95565b92509250509295509295909350565b600080600080600080608087890312156141be576141bd615436565b5b600087013567ffffffffffffffff8111156141dc576141db615431565b5b6141e889828a01613c19565b965096505060206141fb89828a01613b2c565b945050604061420c89828a01613c9d565b935050606087013567ffffffffffffffff81111561422d5761422c615431565b5b61423989828a01613b95565b92509250509295509295509295565b60006020828403121561425e5761425d615436565b5b600082013567ffffffffffffffff81111561427c5761427b615431565b5b61428884828501613c6f565b91505092915050565b6000602082840312156142a7576142a6615436565b5b60006142b584828501613c9d565b91505092915050565b600080604083850312156142d5576142d4615436565b5b60006142e385828601613c9d565b92505060206142f485828601613c9d565b9150509250929050565b600061430a83836148f4565b60208301905092915050565b61431f81615159565b82525050565b600061433082614fd8565b61433a8185615006565b935061434583614fc8565b8060005b8381101561437657815161435d88826142fe565b975061436883614ff9565b925050600181019050614349565b5085935050505092915050565b61438c8161516b565b82525050565b61439b81615177565b82525050565b60006143ac82614fe3565b6143b68185615017565b93506143c68185602086016151f3565b6143cf8161543b565b840191505092915050565b60006143e68385615028565b93506143f38385846151e4565b6143fc8361543b565b840190509392505050565b600061441282614fee565b61441c8185615028565b935061442c8185602086016151f3565b6144358161543b565b840191505092915050565b600061444b82614fee565b6144558185615039565b93506144658185602086016151f3565b80840191505092915050565b600061447e602f83615028565b91506144898261544c565b604082019050919050565b60006144a1601483615028565b91506144ac8261549b565b602082019050919050565b60006144c4602b83615028565b91506144cf826154c4565b604082019050919050565b60006144e7603283615028565b91506144f282615513565b604082019050919050565b600061450a602683615028565b915061451582615562565b604082019050919050565b600061452d601c83615028565b9150614538826155b1565b602082019050919050565b6000614550602483615028565b915061455b826155da565b604082019050919050565b6000614573601983615028565b915061457e82615629565b602082019050919050565b6000614596601a83615028565b91506145a182615652565b602082019050919050565b60006145b9602c83615028565b91506145c48261567b565b604082019050919050565b60006145dc602a83615028565b91506145e7826156ca565b604082019050919050565b60006145ff603083615028565b915061460a82615719565b604082019050919050565b6000614622601083615028565b915061462d82615768565b602082019050919050565b6000614645602583615028565b915061465082615791565b604082019050919050565b6000614668603883615028565b9150614673826157e0565b604082019050919050565b600061468b602a83615028565b91506146968261582f565b604082019050919050565b60006146ae602983615028565b91506146b98261587e565b604082019050919050565b60006146d1602f83615028565b91506146dc826158cd565b604082019050919050565b60006146f4602083615028565b91506146ff8261591c565b602082019050919050565b6000614717603183615028565b915061472282615945565b604082019050919050565b600061473a602c83615028565b915061474582615994565b604082019050919050565b600061475d602083615028565b9150614768826159e3565b602082019050919050565b6000614780602983615028565b915061478b82615a0c565b604082019050919050565b60006147a3602f83615028565b91506147ae82615a5b565b604082019050919050565b60006147c6602183615028565b91506147d182615aaa565b604082019050919050565b60006147e9603183615028565b91506147f482615af9565b604082019050919050565b600061480c602c83615028565b915061481782615b48565b604082019050919050565b600061482f602483615028565b915061483a82615b97565b604082019050919050565b6000614852601883615028565b915061485d82615be6565b602082019050919050565b6000614875603083615028565b915061488082615c0f565b604082019050919050565b6000614898601e83615028565b91506148a382615c5e565b602082019050919050565b60006148bb602f83615028565b91506148c682615c87565b604082019050919050565b60006148de602e83615028565b91506148e982615cd6565b604082019050919050565b6148fd816151cd565b82525050565b61490c816151cd565b82525050565b61491b816151d7565b82525050565b600061492d8285614440565b91506149398284614440565b91508190509392505050565b600060208201905061495a6000830184614316565b92915050565b60006080820190506149756000830187614316565b6149826020830186614316565b61498f6040830185614903565b81810360608301526149a181846143a1565b905095945050505050565b60006040820190506149c16000830186614316565b81810360208301526149d48184866143da565b9050949350505050565b60006040820190506149f36000830185614316565b614a006020830184614903565b9392505050565b6000606082019050614a1c6000830187614316565b614a296020830186614903565b8181036040830152614a3c8184866143da565b905095945050505050565b60006020820190508181036000830152614a618184614325565b905092915050565b6000602082019050614a7e6000830184614383565b92915050565b6000602082019050614a996000830184614392565b92915050565b6000608082019050614ab46000830187614392565b614ac16020830186614912565b614ace6040830185614392565b614adb6060830184614392565b95945050505050565b60006020820190508181036000830152614afe8184614407565b905092915050565b60006020820190508181036000830152614b1f81614471565b9050919050565b60006020820190508181036000830152614b3f81614494565b9050919050565b60006020820190508181036000830152614b5f816144b7565b9050919050565b60006020820190508181036000830152614b7f816144da565b9050919050565b60006020820190508181036000830152614b9f816144fd565b9050919050565b60006020820190508181036000830152614bbf81614520565b9050919050565b60006020820190508181036000830152614bdf81614543565b9050919050565b60006020820190508181036000830152614bff81614566565b9050919050565b60006020820190508181036000830152614c1f81614589565b9050919050565b60006020820190508181036000830152614c3f816145ac565b9050919050565b60006020820190508181036000830152614c5f816145cf565b9050919050565b60006020820190508181036000830152614c7f816145f2565b9050919050565b60006020820190508181036000830152614c9f81614615565b9050919050565b60006020820190508181036000830152614cbf81614638565b9050919050565b60006020820190508181036000830152614cdf8161465b565b9050919050565b60006020820190508181036000830152614cff8161467e565b9050919050565b60006020820190508181036000830152614d1f816146a1565b9050919050565b60006020820190508181036000830152614d3f816146c4565b9050919050565b60006020820190508181036000830152614d5f816146e7565b9050919050565b60006020820190508181036000830152614d7f8161470a565b9050919050565b60006020820190508181036000830152614d9f8161472d565b9050919050565b60006020820190508181036000830152614dbf81614750565b9050919050565b60006020820190508181036000830152614ddf81614773565b9050919050565b60006020820190508181036000830152614dff81614796565b9050919050565b60006020820190508181036000830152614e1f816147b9565b9050919050565b60006020820190508181036000830152614e3f816147dc565b9050919050565b60006020820190508181036000830152614e5f816147ff565b9050919050565b60006020820190508181036000830152614e7f81614822565b9050919050565b60006020820190508181036000830152614e9f81614845565b9050919050565b60006020820190508181036000830152614ebf81614868565b9050919050565b60006020820190508181036000830152614edf8161488b565b9050919050565b60006020820190508181036000830152614eff816148ae565b9050919050565b60006020820190508181036000830152614f1f816148d1565b9050919050565b6000602082019050614f3b6000830184614903565b92915050565b6000614f4b614f5c565b9050614f578282615258565b919050565b6000604051905090565b600067ffffffffffffffff821115614f8157614f806153ee565b5b614f8a8261543b565b9050602081019050919050565b600067ffffffffffffffff821115614fb257614fb16153ee565b5b614fbb8261543b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504f826151cd565b915061505a836151cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561508f5761508e615303565b5b828201905092915050565b60006150a5826151cd565b91506150b0836151cd565b9250826150c0576150bf615332565b5b828204905092915050565b60006150d6826151cd565b91506150e1836151cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511a57615119615303565b5b828202905092915050565b6000615130826151cd565b915061513b836151cd565b92508282101561514e5761514d615303565b5b828203905092915050565b6000615164826151ad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152115780820151818401526020810190506151f6565b83811115615220576000848401525b50505050565b6000600282049050600182168061523e57607f821691505b6020821081141561525257615251615361565b5b50919050565b6152618261543b565b810181811067ffffffffffffffff821117156152805761527f6153ee565b5b80604052505050565b6000615294826151cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c7576152c6615303565b5b600182019050919050565b60006152dd826151cd565b91506152e8836151cd565b9250826152f8576152f7615332565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546865207369676e2064617465206973206e6f7420746f646179000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546865207369676e657220646f6573206e6f742068617665207468652072657160008201527f756972656420726f6c6500000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865207369676e61747572652070726f766964656420646f6573206e6f742060008201527f6d61746368000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f536f6369616c5363616e42616467653a206d757374206861766520706175736560008201527f7220726f6c6520746f2070617573650000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a204164647265737320616c7265616479206f776e732061207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4572723a20746f6b656e207472616e7366657220697320424c4f434b45440000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f536f6369616c5363616e42616467653a206d7573742068617665206d696e746560008201527f7220726f6c6520746f206d696e74000000000000000000000000000000000000602082015250565b615d2e81615159565b8114615d3957600080fd5b50565b615d458161516b565b8114615d5057600080fd5b50565b615d5c81615177565b8114615d6757600080fd5b50565b615d7381615181565b8114615d7e57600080fd5b50565b615d8a816151cd565b8114615d9557600080fd5b5056fea2646970667358221220b4f7be18061984099ff0b695ef75b45543535a4bb67457035bc5940ad768740564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011556c74697665727365204149202444415900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035541440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102725760003560e01c806355f804b31161014f57806391d14854116100c1578063d53913931161007a578063d53913931461097b578063d547741f146109a6578063e63ab1e9146109cf578063e985e9c5146109fa578063eb79554914610a37578063f2fde38b14610a6057610272565b806391d148541461086657806395d89b41146108a3578063a217fddf146108ce578063a22cb465146108f9578063b88d4fde14610922578063c87b56dd1461093e57610272565b8063715018a611610113578063715018a6146107775780637da525911461078e57806381e6dd5c146107cb5780638456cb59146107e75780638462151c146107fe5780638da5cb5b1461083b57610272565b806355f804b31461067e5780635c975abb146106a75780636352211e146106d25780636c0360eb1461070f57806370a082311461073a57610272565b80632f745c59116101e857806342842e0e116101ac57806342842e0e1461054557806342966c6814610561578063484b973c1461058a5780634d0ed891146105c75780634f6ccce71461060457806353fb99b31461064157610272565b80632f745c591461046257806336568abe1461049f5780633f4ba83a146104c8578063417db48f146104df578063423f6cef1461051c57610272565b8063170bbf241161023a578063170bbf241461036157806318160ddd1461037d57806323b872dd146103a8578063248a9ca3146103d157806329cb924d1461040e5780632f2ff15d1461043957610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c578063110ee30014610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906140b2565b610a89565b6040516102ab9190614a69565b60405180910390f35b3480156102c057600080fd5b506102c9610a9b565b6040516102d69190614ae4565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614291565b610b2d565b6040516103139190614945565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613f1d565b610bb2565b005b61035f600480360381019061035a919061410c565b610cca565b005b61037b60048036038101906103769190613d72565b610e0c565b005b34801561038957600080fd5b50610392610f63565b60405161039f9190614f26565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca9190613d1f565b610f70565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190614045565b610fd0565b6040516104059190614a84565b60405180910390f35b34801561041a57600080fd5b50610423610ff0565b6040516104309190614f26565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190614072565b610ff8565b005b34801561046e57600080fd5b5061048960048036038101906104849190613f1d565b61105e565b6040516104969190614f26565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190614072565b611103565b005b3480156104d457600080fd5b506104dd611186565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613ebd565b611200565b6040516105139190614a84565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613f1d565b611236565b005b61055f600480360381019061055a9190613d1f565b61125c565b005b34801561056d57600080fd5b5061058860048036038101906105839190614291565b61127c565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613f1d565b6112d8565b6040516105be9190614a69565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190613fd1565b611373565b6040516105fb9190614a84565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190614291565b6113ac565b6040516106389190614f26565b60405180910390f35b34801561064d57600080fd5b50610668600480360381019061066391906142be565b61141d565b6040516106759190614a69565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190614248565b611542565b005b3480156106b357600080fd5b506106bc6115ca565b6040516106c99190614a69565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190614291565b6115e1565b6040516107069190614945565b60405180910390f35b34801561071b57600080fd5b50610724611693565b6040516107319190614ae4565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613cb2565b611725565b60405161076e9190614f26565b60405180910390f35b34801561078357600080fd5b5061078c6117dd565b005b34801561079a57600080fd5b506107b560048036038101906107b09190613f1d565b611865565b6040516107c29190614a84565b60405180910390f35b6107e560048036038101906107e091906141a1565b611898565b005b3480156107f357600080fd5b506107fc611a32565b005b34801561080a57600080fd5b5061082560048036038101906108209190613cb2565b611aac565b6040516108329190614a47565b60405180910390f35b34801561084757600080fd5b50610850611ba3565b60405161085d9190614945565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190614072565b611bcc565b60405161089a9190614a69565b60405180910390f35b3480156108af57600080fd5b506108b8611c37565b6040516108c59190614ae4565b60405180910390f35b3480156108da57600080fd5b506108e3611cc9565b6040516108f09190614a84565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613e7d565b611cd0565b005b61093c60048036038101906109379190613dfa565b611e51565b005b34801561094a57600080fd5b5061096560048036038101906109609190614291565b611eb3565b6040516109729190614ae4565b60405180910390f35b34801561098757600080fd5b50610990611ec5565b60405161099d9190614a84565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190614072565b611ee9565b005b3480156109db57600080fd5b506109e4611f4f565b6040516109f19190614a84565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190613cdf565b611f73565b604051610a2e9190614a69565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613f5d565b612007565b005b348015610a6c57600080fd5b50610a876004803603810190610a829190613cb2565b612064565b005b6000610a948261215c565b9050919050565b606060018054610aaa90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad690615226565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000610b38826121d6565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90614d86565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bbd826115e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590614e06565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4d612242565b73ffffffffffffffffffffffffffffffffffffffff161480610c7c5750610c7b81610c76612242565b611f73565b5b610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290614cc6565b60405180910390fd5b610cc5838361224a565b505050565b610cf47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684611bcc565b610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614c46565b60405180910390fd5b6000610d47610d40612242565b8787611200565b90508373ffffffffffffffffffffffffffffffffffffffff16610dae8285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614ca6565b60405180910390fd5b505050505050565b610e367f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a686611bcc565b610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90614c46565b60405180910390fd5b6000610e818585611865565b90508573ffffffffffffffffffffffffffffffffffffffff16610ee88285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614ca6565b60405180910390fd5b610f48600f612372565b610f5b85610f56600f612388565b612396565b505050505050565b6000600a80549050905090565b610f81610f7b612242565b826123b4565b610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790614e26565b60405180910390fd5b610fcb838383612492565b505050565b6000600d6000838152602001908152602001600020600101549050919050565b600042905090565b61101161100483610fd0565b61100c612242565b611bcc565b611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790614b06565b60405180910390fd5b61105a82826126ee565b5050565b600061106983611725565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614b46565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61110b612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90614ee6565b60405180910390fd5b61118282826127cf565b5050565b6111b77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111b2612242565b611bcc565b6111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90614d26565b60405180910390fd5b6111fe6128b1565b565b6000838383604051602001611217939291906149ac565b6040516020818303038152906040528051906020012090509392505050565b611258611241612242565b838360405180602001604052806000815250612953565b5050565b61127783838360405180602001604052806000815250611e51565b505050565b61128d611287612242565b826123b4565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c390614ea6565b60405180910390fd5b6112d5816129af565b50565b6000600e60009054906101000a900460ff1661135f5761131f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661131a612242565b611bcc565b61135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614f06565b60405180910390fd5b5b6113698383612396565b6001905092915050565b60008484848460405160200161138c9493929190614a07565b604051602081830303815290604052805190602001209050949350505050565b60006113b6610f63565b82106113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90614e46565b60405180910390fd5b600a828154811061140b5761140a6153bf565b5b90600052602060002001549050919050565b60008062015180905060008185611434919061509a565b905060008285611444919061509a565b9050600083601e61145591906150cb565b905060008461016d61146791906150cb565b84611472919061509a565b90506000828661016d61148591906150cb565b8661149091906152d2565b61149a919061509a565b905060008684876114ab91906152d2565b6114b5919061509a565b905060008761016d6114c791906150cb565b866114d2919061509a565b90506000858961016d6114e591906150cb565b886114f091906152d2565b6114fa919061509a565b9050600089878961150b91906152d2565b611515919061509a565b9050828614801561152557508185145b801561153057508084145b9a505050505050505050505092915050565b61154a612242565b73ffffffffffffffffffffffffffffffffffffffff16611568611ba3565b73ffffffffffffffffffffffffffffffffffffffff16146115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590614da6565b60405180910390fd5b6115c7816129bb565b50565b6000600c60009054906101000a900460ff16905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190614d06565b60405180910390fd5b80915050919050565b6060600780546116a290615226565b80601f01602080910402602001604051908101604052809291908181526020018280546116ce90615226565b801561171b5780601f106116f05761010080835404028352916020019161171b565b820191906000526020600020905b8154815290600101906020018083116116fe57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d90614ce6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e5612242565b73ffffffffffffffffffffffffffffffffffffffff16611803611ba3565b73ffffffffffffffffffffffffffffffffffffffff1614611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614da6565b60405180910390fd5b61186360006129d5565b565b6000828260405160200161187a9291906149de565b60405160208183030381529060405280519060200120905092915050565b60006118a2610ff0565b90506118ae818561141d565b6118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490614c06565b60405180910390fd5b6119177f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a686611bcc565b611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d90614c46565b60405180910390fd5b600061196b611963612242565b868a8a611373565b90508573ffffffffffffffffffffffffffffffffffffffff166119d28286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612303565b73ffffffffffffffffffffffffffffffffffffffff1614611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614ca6565b60405180910390fd5b5050505050505050565b611a637f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611a5e612242565b611bcc565b611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614d26565b60405180910390fd5b611aaa612a99565b565b60606000611ab983611725565b67ffffffffffffffff811115611ad257611ad16153ee565b5b604051908082528060200260200182016040528015611b005781602001602082028036833780820191505090505b50905060005b611b0f84611725565b811015611b9957600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110611b7a57611b796153bf565b5b6020026020010181815250508080611b9190615289565b915050611b06565b5080915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060028054611c4690615226565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7290615226565b8015611cbf5780601f10611c9457610100808354040283529160200191611cbf565b820191906000526020600020905b815481529060010190602001808311611ca257829003601f168201915b5050505050905090565b6000801b81565b611cd8612242565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614be6565b60405180910390fd5b8060066000611d53612242565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e00612242565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e459190614a69565b60405180910390a35050565b611e62611e5c612242565b836123b4565b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614e26565b60405180910390fd5b611ead84848484612953565b50505050565b6060611ebe82612b3c565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611f02611ef583610fd0565b611efd612242565b611bcc565b611f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3890614c66565b60405180910390fd5b611f4b82826127cf565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61205e612012612242565b858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612953565b50505050565b61206c612242565b73ffffffffffffffffffffffffffffffffffffffff1661208a611ba3565b73ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d790614da6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214790614b86565b60405180910390fd5b612159816129d5565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121cf57506121ce82612b96565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122bd836115e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008061231285612c10565b9250925092506001868285856040516000815260200160405260405161233b9493929190614a9f565b6020604051602081039080840390855afa15801561235d573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6123b0828260405180602001604052806000815250612c78565b5050565b60006123bf826121d6565b6123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614c26565b60405180910390fd5b6000612409836115e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061247857508373ffffffffffffffffffffffffffffffffffffffff1661246084610b2d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061248957506124888185611f73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124b2826115e1565b73ffffffffffffffffffffffffffffffffffffffff1614612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90614dc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256f90614bc6565b60405180910390fd5b612583838383612cd3565b61258e60008261224a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125de9190615125565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126359190615044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126f88282611bcc565b6127cb576001600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612770612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6127d98282611bcc565b156128ad576000600d600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612852612242565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6128b96115ca565b6128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef90614b26565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61293c612242565b6040516129499190614945565b60405180910390a1565b61295e848484612492565b61296a84848484612d9a565b6129a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a090614b66565b60405180910390fd5b50505050565b6129b881612f31565b50565b80600790805190602001906129d1929190613a05565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa16115ca565b15612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890614c86565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b25612242565b604051612b329190614945565b60405180910390a1565b6060612b47826121d6565b612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d90614d66565b60405180910390fd5b612b8f82612f3d565b9050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c095750612c0882612fc5565b5b9050919050565b60008060006041845114612c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5090614e86565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b612c8283836130a7565b612c8f6000848484612d9a565b612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc590614b66565b60405180910390fd5b505050565b612cdb6115ca565b15612d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1290614c86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190614ec6565b60405180910390fd5b612d958383836132f7565b505050565b6000612dbb8473ffffffffffffffffffffffffffffffffffffffff1661340b565b15612f24578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612de4612242565b8786866040518563ffffffff1660e01b8152600401612e069493929190614960565b602060405180830381600087803b158015612e2057600080fd5b505af1925050508015612e5157506040513d601f19601f82011682018060405250810190612e4e91906140df565b60015b612ed4573d8060008114612e81576040519150601f19603f3d011682016040523d82523d6000602084013e612e86565b606091505b50600081511415612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec390614b66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f29565b600190505b949350505050565b612f3a8161341e565b50565b6060612f48826121d6565b612f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7e90614de6565b60405180910390fd5b6000612f91611693565b905080612f9d8461352f565b604051602001612fae929190614921565b604051602081830303815290604052915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061309057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806130a0575061309f82613690565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310e90614d46565b60405180910390fd5b613120816121d6565b15613160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315790614ba6565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990614e66565b60405180910390fd5b6131ee60008383612cd3565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461323e9190615044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6133028383836136fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561334557613340816136ff565b613384565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613383576133828382613748565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133c7576133c2816138b5565b613406565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613405576134048282613986565b5b5b505050565b600080823b905060008111915050919050565b6000613429826115e1565b905061343781600084612cd3565b61344260008361224a565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134929190615125565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60606000821415613577576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061368b565b600082905060005b600082146135a957808061359290615289565b915050600a826135a2919061509a565b915061357f565b60008167ffffffffffffffff8111156135c5576135c46153ee565b5b6040519080825280601f01601f1916602001820160405280156135f75781602001600182028036833780820191505090505b5090505b60008514613684576001826136109190615125565b9150600a8561361f91906152d2565b603061362b9190615044565b60f81b818381518110613641576136406153bf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561367d919061509a565b94506135fb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161375584611725565b61375f9190615125565b9050600060096000848152602001908152602001600020549050818114613844576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506138c99190615125565b90506000600b60008481526020019081526020016000205490506000600a83815481106138f9576138f86153bf565b5b9060005260206000200154905080600a838154811061391b5761391a6153bf565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a80548061396a57613969615390565b5b6001900381819060005260206000200160009055905550505050565b600061399183611725565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b828054613a1190615226565b90600052602060002090601f016020900481019282613a335760008555613a7a565b82601f10613a4c57805160ff1916838001178555613a7a565b82800160010185558215613a7a579182015b82811115613a79578251825591602001919060010190613a5e565b5b509050613a879190613a8b565b5090565b5b80821115613aa4576000816000905550600101613a8c565b5090565b6000613abb613ab684614f66565b614f41565b905082815260208101848484011115613ad757613ad661542c565b5b613ae28482856151e4565b509392505050565b6000613afd613af884614f97565b614f41565b905082815260208101848484011115613b1957613b1861542c565b5b613b248482856151e4565b509392505050565b600081359050613b3b81615d25565b92915050565b600081359050613b5081615d3c565b92915050565b600081359050613b6581615d53565b92915050565b600081359050613b7a81615d6a565b92915050565b600081519050613b8f81615d6a565b92915050565b60008083601f840112613bab57613baa615422565b5b8235905067ffffffffffffffff811115613bc857613bc761541d565b5b602083019150836001820283011115613be457613be3615427565b5b9250929050565b600082601f830112613c0057613bff615422565b5b8135613c10848260208601613aa8565b91505092915050565b60008083601f840112613c2f57613c2e615422565b5b8235905067ffffffffffffffff811115613c4c57613c4b61541d565b5b602083019150836001820283011115613c6857613c67615427565b5b9250929050565b600082601f830112613c8457613c83615422565b5b8135613c94848260208601613aea565b91505092915050565b600081359050613cac81615d81565b92915050565b600060208284031215613cc857613cc7615436565b5b6000613cd684828501613b2c565b91505092915050565b60008060408385031215613cf657613cf5615436565b5b6000613d0485828601613b2c565b9250506020613d1585828601613b2c565b9150509250929050565b600080600060608486031215613d3857613d37615436565b5b6000613d4686828701613b2c565b9350506020613d5786828701613b2c565b9250506040613d6886828701613c9d565b9150509250925092565b600080600080600060808688031215613d8e57613d8d615436565b5b6000613d9c88828901613b2c565b9550506020613dad88828901613b2c565b9450506040613dbe88828901613c9d565b935050606086013567ffffffffffffffff811115613ddf57613dde615431565b5b613deb88828901613b95565b92509250509295509295909350565b60008060008060808587031215613e1457613e13615436565b5b6000613e2287828801613b2c565b9450506020613e3387828801613b2c565b9350506040613e4487828801613c9d565b925050606085013567ffffffffffffffff811115613e6557613e64615431565b5b613e7187828801613beb565b91505092959194509250565b60008060408385031215613e9457613e93615436565b5b6000613ea285828601613b2c565b9250506020613eb385828601613b41565b9150509250929050565b600080600060408486031215613ed657613ed5615436565b5b6000613ee486828701613b2c565b935050602084013567ffffffffffffffff811115613f0557613f04615431565b5b613f1186828701613c19565b92509250509250925092565b60008060408385031215613f3457613f33615436565b5b6000613f4285828601613b2c565b9250506020613f5385828601613c9d565b9150509250929050565b60008060008060608587031215613f7757613f76615436565b5b6000613f8587828801613b2c565b9450506020613f9687828801613c9d565b935050604085013567ffffffffffffffff811115613fb757613fb6615431565b5b613fc387828801613b95565b925092505092959194509250565b60008060008060608587031215613feb57613fea615436565b5b6000613ff987828801613b2c565b945050602061400a87828801613c9d565b935050604085013567ffffffffffffffff81111561402b5761402a615431565b5b61403787828801613c19565b925092505092959194509250565b60006020828403121561405b5761405a615436565b5b600061406984828501613b56565b91505092915050565b6000806040838503121561408957614088615436565b5b600061409785828601613b56565b92505060206140a885828601613b2c565b9150509250929050565b6000602082840312156140c8576140c7615436565b5b60006140d684828501613b6b565b91505092915050565b6000602082840312156140f5576140f4615436565b5b600061410384828501613b80565b91505092915050565b60008060008060006060868803121561412857614127615436565b5b600086013567ffffffffffffffff81111561414657614145615431565b5b61415288828901613c19565b9550955050602061416588828901613b2c565b935050604086013567ffffffffffffffff81111561418657614185615431565b5b61419288828901613b95565b92509250509295509295909350565b600080600080600080608087890312156141be576141bd615436565b5b600087013567ffffffffffffffff8111156141dc576141db615431565b5b6141e889828a01613c19565b965096505060206141fb89828a01613b2c565b945050604061420c89828a01613c9d565b935050606087013567ffffffffffffffff81111561422d5761422c615431565b5b61423989828a01613b95565b92509250509295509295509295565b60006020828403121561425e5761425d615436565b5b600082013567ffffffffffffffff81111561427c5761427b615431565b5b61428884828501613c6f565b91505092915050565b6000602082840312156142a7576142a6615436565b5b60006142b584828501613c9d565b91505092915050565b600080604083850312156142d5576142d4615436565b5b60006142e385828601613c9d565b92505060206142f485828601613c9d565b9150509250929050565b600061430a83836148f4565b60208301905092915050565b61431f81615159565b82525050565b600061433082614fd8565b61433a8185615006565b935061434583614fc8565b8060005b8381101561437657815161435d88826142fe565b975061436883614ff9565b925050600181019050614349565b5085935050505092915050565b61438c8161516b565b82525050565b61439b81615177565b82525050565b60006143ac82614fe3565b6143b68185615017565b93506143c68185602086016151f3565b6143cf8161543b565b840191505092915050565b60006143e68385615028565b93506143f38385846151e4565b6143fc8361543b565b840190509392505050565b600061441282614fee565b61441c8185615028565b935061442c8185602086016151f3565b6144358161543b565b840191505092915050565b600061444b82614fee565b6144558185615039565b93506144658185602086016151f3565b80840191505092915050565b600061447e602f83615028565b91506144898261544c565b604082019050919050565b60006144a1601483615028565b91506144ac8261549b565b602082019050919050565b60006144c4602b83615028565b91506144cf826154c4565b604082019050919050565b60006144e7603283615028565b91506144f282615513565b604082019050919050565b600061450a602683615028565b915061451582615562565b604082019050919050565b600061452d601c83615028565b9150614538826155b1565b602082019050919050565b6000614550602483615028565b915061455b826155da565b604082019050919050565b6000614573601983615028565b915061457e82615629565b602082019050919050565b6000614596601a83615028565b91506145a182615652565b602082019050919050565b60006145b9602c83615028565b91506145c48261567b565b604082019050919050565b60006145dc602a83615028565b91506145e7826156ca565b604082019050919050565b60006145ff603083615028565b915061460a82615719565b604082019050919050565b6000614622601083615028565b915061462d82615768565b602082019050919050565b6000614645602583615028565b915061465082615791565b604082019050919050565b6000614668603883615028565b9150614673826157e0565b604082019050919050565b600061468b602a83615028565b91506146968261582f565b604082019050919050565b60006146ae602983615028565b91506146b98261587e565b604082019050919050565b60006146d1602f83615028565b91506146dc826158cd565b604082019050919050565b60006146f4602083615028565b91506146ff8261591c565b602082019050919050565b6000614717603183615028565b915061472282615945565b604082019050919050565b600061473a602c83615028565b915061474582615994565b604082019050919050565b600061475d602083615028565b9150614768826159e3565b602082019050919050565b6000614780602983615028565b915061478b82615a0c565b604082019050919050565b60006147a3602f83615028565b91506147ae82615a5b565b604082019050919050565b60006147c6602183615028565b91506147d182615aaa565b604082019050919050565b60006147e9603183615028565b91506147f482615af9565b604082019050919050565b600061480c602c83615028565b915061481782615b48565b604082019050919050565b600061482f602483615028565b915061483a82615b97565b604082019050919050565b6000614852601883615028565b915061485d82615be6565b602082019050919050565b6000614875603083615028565b915061488082615c0f565b604082019050919050565b6000614898601e83615028565b91506148a382615c5e565b602082019050919050565b60006148bb602f83615028565b91506148c682615c87565b604082019050919050565b60006148de602e83615028565b91506148e982615cd6565b604082019050919050565b6148fd816151cd565b82525050565b61490c816151cd565b82525050565b61491b816151d7565b82525050565b600061492d8285614440565b91506149398284614440565b91508190509392505050565b600060208201905061495a6000830184614316565b92915050565b60006080820190506149756000830187614316565b6149826020830186614316565b61498f6040830185614903565b81810360608301526149a181846143a1565b905095945050505050565b60006040820190506149c16000830186614316565b81810360208301526149d48184866143da565b9050949350505050565b60006040820190506149f36000830185614316565b614a006020830184614903565b9392505050565b6000606082019050614a1c6000830187614316565b614a296020830186614903565b8181036040830152614a3c8184866143da565b905095945050505050565b60006020820190508181036000830152614a618184614325565b905092915050565b6000602082019050614a7e6000830184614383565b92915050565b6000602082019050614a996000830184614392565b92915050565b6000608082019050614ab46000830187614392565b614ac16020830186614912565b614ace6040830185614392565b614adb6060830184614392565b95945050505050565b60006020820190508181036000830152614afe8184614407565b905092915050565b60006020820190508181036000830152614b1f81614471565b9050919050565b60006020820190508181036000830152614b3f81614494565b9050919050565b60006020820190508181036000830152614b5f816144b7565b9050919050565b60006020820190508181036000830152614b7f816144da565b9050919050565b60006020820190508181036000830152614b9f816144fd565b9050919050565b60006020820190508181036000830152614bbf81614520565b9050919050565b60006020820190508181036000830152614bdf81614543565b9050919050565b60006020820190508181036000830152614bff81614566565b9050919050565b60006020820190508181036000830152614c1f81614589565b9050919050565b60006020820190508181036000830152614c3f816145ac565b9050919050565b60006020820190508181036000830152614c5f816145cf565b9050919050565b60006020820190508181036000830152614c7f816145f2565b9050919050565b60006020820190508181036000830152614c9f81614615565b9050919050565b60006020820190508181036000830152614cbf81614638565b9050919050565b60006020820190508181036000830152614cdf8161465b565b9050919050565b60006020820190508181036000830152614cff8161467e565b9050919050565b60006020820190508181036000830152614d1f816146a1565b9050919050565b60006020820190508181036000830152614d3f816146c4565b9050919050565b60006020820190508181036000830152614d5f816146e7565b9050919050565b60006020820190508181036000830152614d7f8161470a565b9050919050565b60006020820190508181036000830152614d9f8161472d565b9050919050565b60006020820190508181036000830152614dbf81614750565b9050919050565b60006020820190508181036000830152614ddf81614773565b9050919050565b60006020820190508181036000830152614dff81614796565b9050919050565b60006020820190508181036000830152614e1f816147b9565b9050919050565b60006020820190508181036000830152614e3f816147dc565b9050919050565b60006020820190508181036000830152614e5f816147ff565b9050919050565b60006020820190508181036000830152614e7f81614822565b9050919050565b60006020820190508181036000830152614e9f81614845565b9050919050565b60006020820190508181036000830152614ebf81614868565b9050919050565b60006020820190508181036000830152614edf8161488b565b9050919050565b60006020820190508181036000830152614eff816148ae565b9050919050565b60006020820190508181036000830152614f1f816148d1565b9050919050565b6000602082019050614f3b6000830184614903565b92915050565b6000614f4b614f5c565b9050614f578282615258565b919050565b6000604051905090565b600067ffffffffffffffff821115614f8157614f806153ee565b5b614f8a8261543b565b9050602081019050919050565b600067ffffffffffffffff821115614fb257614fb16153ee565b5b614fbb8261543b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504f826151cd565b915061505a836151cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561508f5761508e615303565b5b828201905092915050565b60006150a5826151cd565b91506150b0836151cd565b9250826150c0576150bf615332565b5b828204905092915050565b60006150d6826151cd565b91506150e1836151cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511a57615119615303565b5b828202905092915050565b6000615130826151cd565b915061513b836151cd565b92508282101561514e5761514d615303565b5b828203905092915050565b6000615164826151ad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152115780820151818401526020810190506151f6565b83811115615220576000848401525b50505050565b6000600282049050600182168061523e57607f821691505b6020821081141561525257615251615361565b5b50919050565b6152618261543b565b810181811067ffffffffffffffff821117156152805761527f6153ee565b5b80604052505050565b6000615294826151cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c7576152c6615303565b5b600182019050919050565b60006152dd826151cd565b91506152e8836151cd565b9250826152f8576152f7615332565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546865207369676e2064617465206973206e6f7420746f646179000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546865207369676e657220646f6573206e6f742068617665207468652072657160008201527f756972656420726f6c6500000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546865207369676e61747572652070726f766964656420646f6573206e6f742060008201527f6d61746368000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f536f6369616c5363616e42616467653a206d757374206861766520706175736560008201527f7220726f6c6520746f2070617573650000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a204164647265737320616c7265616479206f776e732061207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4572723a20746f6b656e207472616e7366657220697320424c4f434b45440000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f536f6369616c5363616e42616467653a206d7573742068617665206d696e746560008201527f7220726f6c6520746f206d696e74000000000000000000000000000000000000602082015250565b615d2e81615159565b8114615d3957600080fd5b50565b615d458161516b565b8114615d5057600080fd5b50565b615d5c81615177565b8114615d6757600080fd5b50565b615d7381615181565b8114615d7e57600080fd5b50565b615d8a816151cd565b8114615d9557600080fd5b5056fea2646970667358221220b4f7be18061984099ff0b695ef75b45543535a4bb67457035bc5940ad768740564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011556c74697665727365204149202444415900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035541440000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Ultiverse AI $DAY
Arg [1] : symbol_ (string): UAD
Arg [2] : publicMint (bool): False
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [4] : 556c746976657273652041492024444159000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5541440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
55125:7229:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62140:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25342:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27261:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26791:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57887:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59488:469;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38565:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28151:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51202:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58289:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51587:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37904:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52806:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56003:197;;;;;;;;;;;;;:::i;:::-;;57089:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61321:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28527:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54871:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56451:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56816:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38755:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58403:786;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61048:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45852:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25036:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26302:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24766:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19479:103;;;;;;;;;;;;;:::i;:::-;;59199:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57323:555;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55802:193;;;;;;;;;;;;;:::i;:::-;;38168:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18828:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50874:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25511:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49330:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27554:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28757:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61952:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55313:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52064:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55244:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27920:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61155:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19737:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62140:211;62278:4;62307:36;62331:11;62307:23;:36::i;:::-;62300:43;;62140:211;;;:::o;25342:100::-;25396:13;25429:5;25422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25342:100;:::o;27261:221::-;27337:7;27365:16;27373:7;27365;:16::i;:::-;27357:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27450:15;:24;27466:7;27450:24;;;;;;;;;;;;;;;;;;;;;27443:31;;27261:221;;;:::o;26791:404::-;26872:13;26888:23;26903:7;26888:14;:23::i;:::-;26872:39;;26936:5;26930:11;;:2;:11;;;;26922:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27016:5;27000:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;27025:44;27049:5;27056:12;:10;:12::i;:::-;27025:23;:44::i;:::-;27000:69;26992:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;27166:21;27175:2;27179:7;27166:8;:21::i;:::-;26861:334;26791:404;;:::o;57887:394::-;58023:28;55351:24;58044:6;58023:7;:28::i;:::-;58015:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58111:16;58130:34;58142:12;:10;:12::i;:::-;58156:7;;58130:11;:34::i;:::-;58111:53;;58223:6;58185:44;;:34;58199:8;58209:9;;58185:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:34::i;:::-;:44;;;58177:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;58004:277;57887:394;;;;;:::o;59488:469::-;59636:28;55351:24;59657:6;59636:7;:28::i;:::-;59628:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;59722:16;59741:25;59753:2;59757:8;59741:11;:25::i;:::-;59722:44;;59823:6;59785:44;;:34;59799:8;59809:9;;59785:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:34::i;:::-;:44;;;59777:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;59882:21;:9;:19;:21::i;:::-;59914:35;59924:2;59929:19;:9;:17;:19::i;:::-;59914:9;:35::i;:::-;59607:350;59488:469;;;;;:::o;38565:113::-;38626:7;38653:10;:17;;;;38646:24;;38565:113;:::o;28151:305::-;28312:41;28331:12;:10;:12::i;:::-;28345:7;28312:18;:41::i;:::-;28304:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28420:28;28430:4;28436:2;28440:7;28420:9;:28::i;:::-;28151:305;;;:::o;51202:123::-;51268:7;51295:6;:12;51302:4;51295:12;;;;;;;;;;;:22;;;51288:29;;51202:123;;;:::o;58289:106::-;58336:7;58371:15;58356:31;;58289:106;:::o;51587:232::-;51680:41;51688:18;51701:4;51688:12;:18::i;:::-;51708:12;:10;:12::i;:::-;51680:7;:41::i;:::-;51672:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;51786:25;51797:4;51803:7;51786:10;:25::i;:::-;51587:232;;:::o;37904:256::-;38001:7;38037:23;38054:5;38037:16;:23::i;:::-;38029:5;:31;38021:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38126:12;:19;38139:5;38126:19;;;;;;;;;;;;;;;:26;38146:5;38126:26;;;;;;;;;;;;38119:33;;37904:256;;;;:::o;52806:218::-;52913:12;:10;:12::i;:::-;52902:23;;:7;:23;;;52894:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52990:26;53002:4;53008:7;52990:11;:26::i;:::-;52806:218;;:::o;56003:197::-;56062:34;55282:24;56083:12;:10;:12::i;:::-;56062:7;:34::i;:::-;56040:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;56182:10;:8;:10::i;:::-;56003:197::o;57089:226::-;57201:7;57276:9;57287:8;;57265:31;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57241:66;;;;;;57221:86;;57089:226;;;;;:::o;61321:135::-;61398:50;61418:12;:10;:12::i;:::-;61432:2;61436:7;61398:50;;;;;;;;;;;;:19;:50::i;:::-;61321:135;;:::o;28527:159::-;28639:39;28656:4;28662:2;28666:7;28639:39;;;;;;;;;;;;:16;:39::i;:::-;28527:159;;;:::o;54871:245::-;54989:41;55008:12;:10;:12::i;:::-;55022:7;54989:18;:41::i;:::-;54981:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;55094:14;55100:7;55094:5;:14::i;:::-;54871:245;:::o;56451:355::-;56540:4;56562:11;;;;;;;;;;;56557:187;;56616:34;55351:24;56637:12;:10;:12::i;:::-;56616:7;:34::i;:::-;56590:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;56557:187;56754:22;56764:2;56768:7;56754:9;:22::i;:::-;56794:4;56787:11;;56451:355;;;;:::o;56816:265::-;56956:7;57031:9;57042;57053:8;;57020:42;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56996:77;;;;;;56976:97;;56816:265;;;;;;:::o;38755:233::-;38830:7;38866:30;:28;:30::i;:::-;38858:5;:38;38850:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38963:10;38974:5;38963:17;;;;;;;;:::i;:::-;;;;;;;;;;38956:24;;38755:233;;;:::o;58403:786::-;58486:4;58499:20;58522:5;58499:28;;58554:12;58582;58569:10;:25;;;;:::i;:::-;58554:40;;58601:12;58629;58616:10;:25;;;;:::i;:::-;58601:40;;58650:22;58680:12;58675:2;:17;;;;:::i;:::-;58650:42;;58736:13;58766:12;58760:3;:18;;;;:::i;:::-;58752:4;:27;;;;:::i;:::-;58736:43;;58786:14;58835;58818:12;58812:3;:18;;;;:::i;:::-;58804:4;:27;;;;:::i;:::-;58803:46;;;;:::i;:::-;58786:63;;58856:19;58904:12;58886:14;58879:4;:21;;;;:::i;:::-;58878:38;;;;:::i;:::-;58856:60;;58925:13;58955:12;58949:3;:18;;;;:::i;:::-;58941:4;:27;;;;:::i;:::-;58925:43;;58975:14;59024;59007:12;59001:3;:18;;;;:::i;:::-;58993:4;:27;;;;:::i;:::-;58992:46;;;;:::i;:::-;58975:63;;59045:19;59093:12;59075:14;59068:4;:21;;;;:::i;:::-;59067:38;;;;:::i;:::-;59045:60;;59130:5;59121;:14;:34;;;;;59149:6;59139;:16;59121:34;:64;;;;;59174:11;59159;:26;59121:64;59114:71;;;;;;;;;;;;58403:786;;;;:::o;61048:99::-;19059:12;:10;:12::i;:::-;19048:23;;:7;:5;:7::i;:::-;:23;;;19040:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61119:20:::1;61131:7;61119:11;:20::i;:::-;61048:99:::0;:::o;45852:86::-;45899:4;45923:7;;;;;;;;;;;45916:14;;45852:86;:::o;25036:239::-;25108:7;25128:13;25144:7;:16;25152:7;25144:16;;;;;;;;;;;;;;;;;;;;;25128:32;;25196:1;25179:19;;:5;:19;;;;25171:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25262:5;25255:12;;;25036:239;;;:::o;26302:97::-;26350:13;26383:8;26376:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26302:97;:::o;24766:208::-;24838:7;24883:1;24866:19;;:5;:19;;;;24858:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24950:9;:16;24960:5;24950:16;;;;;;;;;;;;;;;;24943:23;;24766:208;;;:::o;19479:103::-;19059:12;:10;:12::i;:::-;19048:23;;:7;:5;:7::i;:::-;:23;;;19040:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19544:30:::1;19571:1;19544:18;:30::i;:::-;19479:103::o:0;59199:208::-;59298:7;59373:3;59378:9;59362:26;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59338:61;;;;;;59318:81;;59199:208;;;;:::o;57323:555::-;57469:19;57491:16;:14;:16::i;:::-;57469:38;;57526:35;57539:11;57552:8;57526:12;:35::i;:::-;57518:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57610:28;55351:24;57631:6;57610:7;:28::i;:::-;57602:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57698:16;57717:44;57729:12;:10;:12::i;:::-;57743:8;57753:7;;57717:11;:44::i;:::-;57698:63;;57820:6;57782:44;;:34;57796:8;57806:9;;57782:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:34::i;:::-;:44;;;57774:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;57458:420;;57323:555;;;;;;:::o;55802:193::-;55859:34;55282:24;55880:12;:10;:12::i;:::-;55859:7;:34::i;:::-;55837:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;55979:8;:6;:8::i;:::-;55802:193::o;38168:321::-;38227:16;38256:28;38301:23;38318:5;38301:16;:23::i;:::-;38287:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38256:69;;38341:6;38336:117;38357:23;38374:5;38357:16;:23::i;:::-;38353:1;:27;38336:117;;;38419:12;:19;38432:5;38419:19;;;;;;;;;;;;;;;:22;38439:1;38419:22;;;;;;;;;;;;38402:11;38414:1;38402:14;;;;;;;;:::i;:::-;;;;;;;:39;;;;;38382:3;;;;;:::i;:::-;;;;38336:117;;;;38470:11;38463:18;;;38168:321;;;:::o;18828:87::-;18874:7;18901:6;;;;;;;;;;;18894:13;;18828:87;:::o;50874:139::-;50952:4;50976:6;:12;50983:4;50976:12;;;;;;;;;;;:20;;:29;50997:7;50976:29;;;;;;;;;;;;;;;;;;;;;;;;;50969:36;;50874:139;;;;:::o;25511:104::-;25567:13;25600:7;25593:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25511:104;:::o;49330:49::-;49375:4;49330:49;;;:::o;27554:295::-;27669:12;:10;:12::i;:::-;27657:24;;:8;:24;;;;27649:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27769:8;27724:18;:32;27743:12;:10;:12::i;:::-;27724:32;;;;;;;;;;;;;;;:42;27757:8;27724:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27822:8;27793:48;;27808:12;:10;:12::i;:::-;27793:48;;;27832:8;27793:48;;;;;;:::i;:::-;;;;;;;;27554:295;;:::o;28757:293::-;28897:41;28916:12;:10;:12::i;:::-;28930:7;28897:18;:41::i;:::-;28889:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29003:39;29017:4;29023:2;29027:7;29036:5;29003:13;:39::i;:::-;28757:293;;;;:::o;61952:180::-;62063:13;62101:23;62116:7;62101:14;:23::i;:::-;62094:30;;61952:180;;;:::o;55313:62::-;55351:24;55313:62;:::o;52064:235::-;52158:41;52166:18;52179:4;52166:12;:18::i;:::-;52186:12;:10;:12::i;:::-;52158:7;:41::i;:::-;52150:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;52265:26;52277:4;52283:7;52265:11;:26::i;:::-;52064:235;;:::o;55244:62::-;55282:24;55244:62;:::o;27920:164::-;28017:4;28041:18;:25;28060:5;28041:25;;;;;;;;;;;;;;;:35;28067:8;28041:35;;;;;;;;;;;;;;;;;;;;;;;;;28034:42;;27920:164;;;;:::o;61155:158::-;61253:52;61273:12;:10;:12::i;:::-;61287:2;61291:7;61300:4;;61253:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:52::i;:::-;61155:158;;;;:::o;19737:201::-;19059:12;:10;:12::i;:::-;19048:23;;:7;:5;:7::i;:::-;:23;;;19040:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19846:1:::1;19826:22;;:8;:22;;;;19818:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19902:28;19921:8;19902:18;:28::i;:::-;19737:201:::0;:::o;50565:217::-;50650:4;50689:32;50674:47;;;:11;:47;;;;:100;;;;50738:36;50762:11;50738:23;:36::i;:::-;50674:100;50667:107;;50565:217;;;:::o;30517:127::-;30582:4;30634:1;30606:30;;:7;:16;30614:7;30606:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30599:37;;30517:127;;;:::o;17497:98::-;17550:7;17577:10;17570:17;;17497:98;:::o;34479:174::-;34581:2;34554:15;:24;34570:7;34554:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34637:7;34633:2;34599:46;;34608:23;34623:7;34608:14;:23::i;:::-;34599:46;;;;;;;;;;;;34479:174;;:::o;59965:276::-;60092:7;60113:9;60124;60135:7;60146:26;60161:10;60146:14;:26::i;:::-;60112:60;;;;;;60192:41;60202:21;60225:1;60228;60231;60192:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60185:48;;;;;59965:276;;;;:::o;16487:127::-;16594:1;16576:7;:14;;;:19;;;;;;;;;;;16487:127;:::o;16365:114::-;16430:7;16457;:14;;;16450:21;;16365:114;;;:::o;31509:110::-;31585:26;31595:2;31599:7;31585:26;;;;;;;;;;;;:9;:26::i;:::-;31509:110;;:::o;30811:355::-;30904:4;30929:16;30937:7;30929;:16::i;:::-;30921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31005:13;31021:23;31036:7;31021:14;:23::i;:::-;31005:39;;31074:5;31063:16;;:7;:16;;;:51;;;;31107:7;31083:31;;:20;31095:7;31083:11;:20::i;:::-;:31;;;31063:51;:94;;;;31118:39;31142:5;31149:7;31118:23;:39::i;:::-;31063:94;31055:103;;;30811:355;;;;:::o;33817:544::-;33942:4;33915:31;;:23;33930:7;33915:14;:23::i;:::-;:31;;;33907:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34025:1;34011:16;;:2;:16;;;;34003:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34081:39;34102:4;34108:2;34112:7;34081:20;:39::i;:::-;34185:29;34202:1;34206:7;34185:8;:29::i;:::-;34246:1;34227:9;:15;34237:4;34227:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34275:1;34258:9;:13;34268:2;34258:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34306:2;34287:7;:16;34295:7;34287:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34345:7;34341:2;34326:27;;34335:4;34326:27;;;;;;;;;;;;33817:544;;;:::o;54054:229::-;54129:22;54137:4;54143:7;54129;:22::i;:::-;54124:152;;54200:4;54168:6;:12;54175:4;54168:12;;;;;;;;;;;:20;;:29;54189:7;54168:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54251:12;:10;:12::i;:::-;54224:40;;54242:7;54224:40;;54236:4;54224:40;;;;;;;;;;54124:152;54054:229;;:::o;54291:230::-;54366:22;54374:4;54380:7;54366;:22::i;:::-;54362:152;;;54437:5;54405:6;:12;54412:4;54405:12;;;;;;;;;;;:20;;:29;54426:7;54405:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54489:12;:10;:12::i;:::-;54462:40;;54480:7;54462:40;;54474:4;54462:40;;;;;;;;;;54362:152;54291:230;;:::o;46911:120::-;46455:8;:6;:8::i;:::-;46447:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;46980:5:::1;46970:7;;:15;;;;;;;;;;;;;;;;;;47001:22;47010:12;:10;:12::i;:::-;47001:22;;;;;;:::i;:::-;;;;;;;;46911:120::o:0;29932:272::-;30046:28;30056:4;30062:2;30066:7;30046:9;:28::i;:::-;30093:48;30116:4;30122:2;30126:7;30135:5;30093:22;:48::i;:::-;30085:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29932:272;;;;:::o;61829:115::-;61916:20;61928:7;61916:11;:20::i;:::-;61829:115;:::o;26629:100::-;26713:8;26702;:19;;;;;;;;;;;;:::i;:::-;;26629:100;:::o;20098:191::-;20172:16;20191:6;;;;;;;;;;;20172:25;;20217:8;20208:6;;:17;;;;;;;;;;;;;;;;;;20272:8;20241:40;;20262:8;20241:40;;;;;;;;;;;;20161:128;20098:191;:::o;46652:118::-;46178:8;:6;:8::i;:::-;46177:9;46169:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46722:4:::1;46712:7;;:14;;;;;;;;;;;;;;;;;;46742:20;46749:12;:10;:12::i;:::-;46742:20;;;;;;:::i;:::-;;;;;;;;46652:118::o:0;44307:226::-;44380:13;44414:16;44422:7;44414;:16::i;:::-;44406:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44502:23;44517:7;44502:14;:23::i;:::-;44495:30;;44307:226;;;:::o;37583:237::-;37685:4;37724:35;37709:50;;;:11;:50;;;;:103;;;;37776:36;37800:11;37776:23;:36::i;:::-;37709:103;37702:110;;37583:237;;;:::o;60249:791::-;60330:9;60341;60352:7;60394:2;60380:3;:10;:16;60372:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60806:2;60801:3;60797:12;60791:19;60786:24;;60872:2;60867:3;60863:12;60857:19;60852:24;;60975:2;60970:3;60966:12;60960:19;60957:1;60952:28;60947:33;;60249:791;;;;;:::o;31846:250::-;31942:18;31948:2;31952:7;31942:5;:18::i;:::-;31979:54;32010:1;32014:2;32018:7;32027:5;31979:22;:54::i;:::-;31971:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;31846:250;;;:::o;61464:287::-;46178:8;:6;:8::i;:::-;46177:9;46169:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;61650:1:::1;61634:18;;:4;:18;;;61626:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61698:45;61725:4;61731:2;61735:7;61698:26;:45::i;:::-;61464:287:::0;;;:::o;35218:839::-;35335:4;35361:15;:2;:13;;;:15::i;:::-;35357:693;;;35413:2;35397:36;;;35434:12;:10;:12::i;:::-;35448:4;35454:7;35463:5;35397:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35393:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35660:1;35643:6;:13;:18;35639:341;;;35686:60;;;;;;;;;;:::i;:::-;;;;;;;;35639:341;35930:6;35924:13;35915:6;35911:2;35907:15;35900:38;35393:602;35530:45;;;35520:55;;;:6;:55;;;;35513:62;;;;;35357:693;36034:4;36027:11;;35218:839;;;;;;;:::o;44764:97::-;44833:20;44845:7;44833:11;:20::i;:::-;44764:97;:::o;25680:383::-;25753:13;25787:16;25795:7;25787;:16::i;:::-;25779:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25866:18;25887:9;:7;:9::i;:::-;25866:30;;26029:4;26035:18;:7;:16;:18::i;:::-;26012:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25998:57;;;25680:383;;;:::o;24414:288::-;24516:4;24555:25;24540:40;;;:11;:40;;;;:101;;;;24608:33;24593:48;;;:11;:48;;;;24540:101;:154;;;;24658:36;24682:11;24658:23;:36::i;:::-;24540:154;24533:161;;24414:288;;;:::o;32432:459::-;32526:1;32512:16;;:2;:16;;;;32504:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32585:16;32593:7;32585;:16::i;:::-;32584:17;32576:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32669:1;32653:9;:13;32663:2;32653:13;;;;;;;;;;;;;;;;:17;32645:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32724:45;32753:1;32757:2;32761:7;32724:20;:45::i;:::-;32799:1;32782:9;:13;32792:2;32782:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32830:2;32811:7;:16;32819:7;32811:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32875:7;32871:2;32850:33;;32867:1;32850:33;;;;;;;;;;;;32432:459;;:::o;39601:555::-;39711:45;39738:4;39744:2;39748:7;39711:26;:45::i;:::-;39789:1;39773:18;;:4;:18;;;39769:187;;;39808:40;39840:7;39808:31;:40::i;:::-;39769:187;;;39878:2;39870:10;;:4;:10;;;39866:90;;39897:47;39930:4;39936:7;39897:32;:47::i;:::-;39866:90;39769:187;39984:1;39970:16;;:2;:16;;;39966:183;;;40003:45;40040:7;40003:36;:45::i;:::-;39966:183;;;40076:4;40070:10;;:2;:10;;;40066:83;;40097:40;40125:2;40129:7;40097:27;:40::i;:::-;40066:83;39966:183;39601:555;;;:::o;8377:420::-;8437:4;8645:12;8755:7;8743:20;8735:28;;8788:1;8781:4;:8;8774:15;;;8377:420;;;:::o;33120:360::-;33180:13;33196:23;33211:7;33196:14;:23::i;:::-;33180:39;;33232:48;33253:5;33268:1;33272:7;33232:20;:48::i;:::-;33321:29;33338:1;33342:7;33321:8;:29::i;:::-;33383:1;33363:9;:16;33373:5;33363:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;33402:7;:16;33410:7;33402:16;;;;;;;;;;;;33395:23;;;;;;;;;;;33464:7;33460:1;33436:36;;33445:5;33436:36;;;;;;;;;;;;33169:311;33120:360;:::o;20518:723::-;20574:13;20804:1;20795:5;:10;20791:53;;;20822:10;;;;;;;;;;;;;;;;;;;;;20791:53;20854:12;20869:5;20854:20;;20885:14;20910:78;20925:1;20917:4;:9;20910:78;;20943:8;;;;;:::i;:::-;;;;20974:2;20966:10;;;;;:::i;:::-;;;20910:78;;;20998:19;21030:6;21020:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20998:39;;21048:154;21064:1;21055:5;:10;21048:154;;21092:1;21082:11;;;;;:::i;:::-;;;21159:2;21151:5;:10;;;;:::i;:::-;21138:2;:24;;;;:::i;:::-;21125:39;;21108:6;21115;21108:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21188:2;21179:11;;;;;:::i;:::-;;;21048:154;;;21226:6;21212:21;;;;;20518:723;;;;:::o;22973:157::-;23058:4;23097:25;23082:40;;;:11;:40;;;;23075:47;;22973:157;;;:::o;36670:92::-;;;;:::o;40879:164::-;40983:10;:17;;;;40956:15;:24;40972:7;40956:24;;;;;;;;;;;:44;;;;41011:10;41027:7;41011:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40879:164;:::o;41670:1014::-;41936:22;41986:1;41961:22;41978:4;41961:16;:22::i;:::-;:26;;;;:::i;:::-;41936:51;;41998:18;42019:17;:26;42037:7;42019:26;;;;;;;;;;;;41998:47;;42166:14;42152:10;:28;42148:354;;42197:19;42219:12;:18;42232:4;42219:18;;;;;;;;;;;;;;;:34;42238:14;42219:34;;;;;;;;;;;;42197:56;;42303:11;42270:12;:18;42283:4;42270:18;;;;;;;;;;;;;;;:30;42289:10;42270:30;;;;;;;;;;;:44;;;;42433:10;42400:17;:30;42418:11;42400:30;;;;;;;;;;;:43;;;;42182:320;42148:354;42598:17;:26;42616:7;42598:26;;;;;;;;;;;42591:33;;;42642:12;:18;42655:4;42642:18;;;;;;;;;;;;;;;:34;42661:14;42642:34;;;;;;;;;;;42635:41;;;41751:933;;41670:1014;;:::o;42979:1097::-;43232:22;43277:1;43257:10;:17;;;;:21;;;;:::i;:::-;43232:46;;43289:18;43310:15;:24;43326:7;43310:24;;;;;;;;;;;;43289:45;;43661:19;43683:10;43694:14;43683:26;;;;;;;;:::i;:::-;;;;;;;;;;43661:48;;43747:11;43722:10;43733;43722:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43867:10;43836:15;:28;43852:11;43836:28;;;;;;;;;;;:41;;;;44017:15;:24;44033:7;44017:24;;;;;;;;;;;44010:31;;;44052:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43050:1026;;;42979:1097;:::o;40457:221::-;40542:14;40559:20;40576:2;40559:16;:20::i;:::-;40542:37;;40617:7;40590:12;:16;40603:2;40590:16;;;;;;;;;;;;;;;:24;40607:6;40590:24;;;;;;;;;;;:34;;;;40664:6;40635:17;:26;40653:7;40635:26;;;;;;;;;;;:35;;;;40531:147;40457:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:552::-;1630:8;1640:6;1690:3;1683:4;1675:6;1671:17;1667:27;1657:122;;1698:79;;:::i;:::-;1657:122;1811:6;1798:20;1788:30;;1841:18;1833:6;1830:30;1827:117;;;1863:79;;:::i;:::-;1827:117;1977:4;1969:6;1965:17;1953:29;;2031:3;2023:4;2015:6;2011:17;2001:8;1997:32;1994:41;1991:128;;;2038:79;;:::i;:::-;1991:128;1573:552;;;;;:::o;2144:338::-;2199:5;2248:3;2241:4;2233:6;2229:17;2225:27;2215:122;;2256:79;;:::i;:::-;2215:122;2373:6;2360:20;2398:78;2472:3;2464:6;2457:4;2449:6;2445:17;2398:78;:::i;:::-;2389:87;;2205:277;2144:338;;;;:::o;2502:553::-;2560:8;2570:6;2620:3;2613:4;2605:6;2601:17;2597:27;2587:122;;2628:79;;:::i;:::-;2587:122;2741:6;2728:20;2718:30;;2771:18;2763:6;2760:30;2757:117;;;2793:79;;:::i;:::-;2757:117;2907:4;2899:6;2895:17;2883:29;;2961:3;2953:4;2945:6;2941:17;2931:8;2927:32;2924:41;2921:128;;;2968:79;;:::i;:::-;2921:128;2502:553;;;;;:::o;3075:340::-;3131:5;3180:3;3173:4;3165:6;3161:17;3157:27;3147:122;;3188:79;;:::i;:::-;3147:122;3305:6;3292:20;3330:79;3405:3;3397:6;3390:4;3382:6;3378:17;3330:79;:::i;:::-;3321:88;;3137:278;3075:340;;;;:::o;3421:139::-;3467:5;3505:6;3492:20;3483:29;;3521:33;3548:5;3521:33;:::i;:::-;3421:139;;;;:::o;3566:329::-;3625:6;3674:2;3662:9;3653:7;3649:23;3645:32;3642:119;;;3680:79;;:::i;:::-;3642:119;3800:1;3825:53;3870:7;3861:6;3850:9;3846:22;3825:53;:::i;:::-;3815:63;;3771:117;3566:329;;;;:::o;3901:474::-;3969:6;3977;4026:2;4014:9;4005:7;4001:23;3997:32;3994:119;;;4032:79;;:::i;:::-;3994:119;4152:1;4177:53;4222:7;4213:6;4202:9;4198:22;4177:53;:::i;:::-;4167:63;;4123:117;4279:2;4305:53;4350:7;4341:6;4330:9;4326:22;4305:53;:::i;:::-;4295:63;;4250:118;3901:474;;;;;:::o;4381:619::-;4458:6;4466;4474;4523:2;4511:9;4502:7;4498:23;4494:32;4491:119;;;4529:79;;:::i;:::-;4491:119;4649:1;4674:53;4719:7;4710:6;4699:9;4695:22;4674:53;:::i;:::-;4664:63;;4620:117;4776:2;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4747:118;4904:2;4930:53;4975:7;4966:6;4955:9;4951:22;4930:53;:::i;:::-;4920:63;;4875:118;4381:619;;;;;:::o;5006:963::-;5103:6;5111;5119;5127;5135;5184:3;5172:9;5163:7;5159:23;5155:33;5152:120;;;5191:79;;:::i;:::-;5152:120;5311:1;5336:53;5381:7;5372:6;5361:9;5357:22;5336:53;:::i;:::-;5326:63;;5282:117;5438:2;5464:53;5509:7;5500:6;5489:9;5485:22;5464:53;:::i;:::-;5454:63;;5409:118;5566:2;5592:53;5637:7;5628:6;5617:9;5613:22;5592:53;:::i;:::-;5582:63;;5537:118;5722:2;5711:9;5707:18;5694:32;5753:18;5745:6;5742:30;5739:117;;;5775:79;;:::i;:::-;5739:117;5888:64;5944:7;5935:6;5924:9;5920:22;5888:64;:::i;:::-;5870:82;;;;5665:297;5006:963;;;;;;;;:::o;5975:943::-;6070:6;6078;6086;6094;6143:3;6131:9;6122:7;6118:23;6114:33;6111:120;;;6150:79;;:::i;:::-;6111:120;6270:1;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6241:117;6397:2;6423:53;6468:7;6459:6;6448:9;6444:22;6423:53;:::i;:::-;6413:63;;6368:118;6525:2;6551:53;6596:7;6587:6;6576:9;6572:22;6551:53;:::i;:::-;6541:63;;6496:118;6681:2;6670:9;6666:18;6653:32;6712:18;6704:6;6701:30;6698:117;;;6734:79;;:::i;:::-;6698:117;6839:62;6893:7;6884:6;6873:9;6869:22;6839:62;:::i;:::-;6829:72;;6624:287;5975:943;;;;;;;:::o;6924:468::-;6989:6;6997;7046:2;7034:9;7025:7;7021:23;7017:32;7014:119;;;7052:79;;:::i;:::-;7014:119;7172:1;7197:53;7242:7;7233:6;7222:9;7218:22;7197:53;:::i;:::-;7187:63;;7143:117;7299:2;7325:50;7367:7;7358:6;7347:9;7343:22;7325:50;:::i;:::-;7315:60;;7270:115;6924:468;;;;;:::o;7398:674::-;7478:6;7486;7494;7543:2;7531:9;7522:7;7518:23;7514:32;7511:119;;;7549:79;;:::i;:::-;7511:119;7669:1;7694:53;7739:7;7730:6;7719:9;7715:22;7694:53;:::i;:::-;7684:63;;7640:117;7824:2;7813:9;7809:18;7796:32;7855:18;7847:6;7844:30;7841:117;;;7877:79;;:::i;:::-;7841:117;7990:65;8047:7;8038:6;8027:9;8023:22;7990:65;:::i;:::-;7972:83;;;;7767:298;7398:674;;;;;:::o;8078:474::-;8146:6;8154;8203:2;8191:9;8182:7;8178:23;8174:32;8171:119;;;8209:79;;:::i;:::-;8171:119;8329:1;8354:53;8399:7;8390:6;8379:9;8375:22;8354:53;:::i;:::-;8344:63;;8300:117;8456:2;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8427:118;8078:474;;;;;:::o;8558:817::-;8646:6;8654;8662;8670;8719:2;8707:9;8698:7;8694:23;8690:32;8687:119;;;8725:79;;:::i;:::-;8687:119;8845:1;8870:53;8915:7;8906:6;8895:9;8891:22;8870:53;:::i;:::-;8860:63;;8816:117;8972:2;8998:53;9043:7;9034:6;9023:9;9019:22;8998:53;:::i;:::-;8988:63;;8943:118;9128:2;9117:9;9113:18;9100:32;9159:18;9151:6;9148:30;9145:117;;;9181:79;;:::i;:::-;9145:117;9294:64;9350:7;9341:6;9330:9;9326:22;9294:64;:::i;:::-;9276:82;;;;9071:297;8558:817;;;;;;;:::o;9381:819::-;9470:6;9478;9486;9494;9543:2;9531:9;9522:7;9518:23;9514:32;9511:119;;;9549:79;;:::i;:::-;9511:119;9669:1;9694:53;9739:7;9730:6;9719:9;9715:22;9694:53;:::i;:::-;9684:63;;9640:117;9796:2;9822:53;9867:7;9858:6;9847:9;9843:22;9822:53;:::i;:::-;9812:63;;9767:118;9952:2;9941:9;9937:18;9924:32;9983:18;9975:6;9972:30;9969:117;;;10005:79;;:::i;:::-;9969:117;10118:65;10175:7;10166:6;10155:9;10151:22;10118:65;:::i;:::-;10100:83;;;;9895:298;9381:819;;;;;;;:::o;10206:329::-;10265:6;10314:2;10302:9;10293:7;10289:23;10285:32;10282:119;;;10320:79;;:::i;:::-;10282:119;10440:1;10465:53;10510:7;10501:6;10490:9;10486:22;10465:53;:::i;:::-;10455:63;;10411:117;10206:329;;;;:::o;10541:474::-;10609:6;10617;10666:2;10654:9;10645:7;10641:23;10637:32;10634:119;;;10672:79;;:::i;:::-;10634:119;10792:1;10817:53;10862:7;10853:6;10842:9;10838:22;10817:53;:::i;:::-;10807:63;;10763:117;10919:2;10945:53;10990:7;10981:6;10970:9;10966:22;10945:53;:::i;:::-;10935:63;;10890:118;10541:474;;;;;:::o;11021:327::-;11079:6;11128:2;11116:9;11107:7;11103:23;11099:32;11096:119;;;11134:79;;:::i;:::-;11096:119;11254:1;11279:52;11323:7;11314:6;11303:9;11299:22;11279:52;:::i;:::-;11269:62;;11225:116;11021:327;;;;:::o;11354:349::-;11423:6;11472:2;11460:9;11451:7;11447:23;11443:32;11440:119;;;11478:79;;:::i;:::-;11440:119;11598:1;11623:63;11678:7;11669:6;11658:9;11654:22;11623:63;:::i;:::-;11613:73;;11569:127;11354:349;;;;:::o;11709:1017::-;11809:6;11817;11825;11833;11841;11890:2;11878:9;11869:7;11865:23;11861:32;11858:119;;;11896:79;;:::i;:::-;11858:119;12044:1;12033:9;12029:17;12016:31;12074:18;12066:6;12063:30;12060:117;;;12096:79;;:::i;:::-;12060:117;12209:65;12266:7;12257:6;12246:9;12242:22;12209:65;:::i;:::-;12191:83;;;;11987:297;12323:2;12349:53;12394:7;12385:6;12374:9;12370:22;12349:53;:::i;:::-;12339:63;;12294:118;12479:2;12468:9;12464:18;12451:32;12510:18;12502:6;12499:30;12496:117;;;12532:79;;:::i;:::-;12496:117;12645:64;12701:7;12692:6;12681:9;12677:22;12645:64;:::i;:::-;12627:82;;;;12422:297;11709:1017;;;;;;;;:::o;12732:1163::-;12841:6;12849;12857;12865;12873;12881;12930:3;12918:9;12909:7;12905:23;12901:33;12898:120;;;12937:79;;:::i;:::-;12898:120;13085:1;13074:9;13070:17;13057:31;13115:18;13107:6;13104:30;13101:117;;;13137:79;;:::i;:::-;13101:117;13250:65;13307:7;13298:6;13287:9;13283:22;13250:65;:::i;:::-;13232:83;;;;13028:297;13364:2;13390:53;13435:7;13426:6;13415:9;13411:22;13390:53;:::i;:::-;13380:63;;13335:118;13492:2;13518:53;13563:7;13554:6;13543:9;13539:22;13518:53;:::i;:::-;13508:63;;13463:118;13648:2;13637:9;13633:18;13620:32;13679:18;13671:6;13668:30;13665:117;;;13701:79;;:::i;:::-;13665:117;13814:64;13870:7;13861:6;13850:9;13846:22;13814:64;:::i;:::-;13796:82;;;;13591:297;12732:1163;;;;;;;;:::o;13901:509::-;13970:6;14019:2;14007:9;13998:7;13994:23;13990:32;13987:119;;;14025:79;;:::i;:::-;13987:119;14173:1;14162:9;14158:17;14145:31;14203:18;14195:6;14192:30;14189:117;;;14225:79;;:::i;:::-;14189:117;14330:63;14385:7;14376:6;14365:9;14361:22;14330:63;:::i;:::-;14320:73;;14116:287;13901:509;;;;:::o;14416:329::-;14475:6;14524:2;14512:9;14503:7;14499:23;14495:32;14492:119;;;14530:79;;:::i;:::-;14492:119;14650:1;14675:53;14720:7;14711:6;14700:9;14696:22;14675:53;:::i;:::-;14665:63;;14621:117;14416:329;;;;:::o;14751:474::-;14819:6;14827;14876:2;14864:9;14855:7;14851:23;14847:32;14844:119;;;14882:79;;:::i;:::-;14844:119;15002:1;15027:53;15072:7;15063:6;15052:9;15048:22;15027:53;:::i;:::-;15017:63;;14973:117;15129:2;15155:53;15200:7;15191:6;15180:9;15176:22;15155:53;:::i;:::-;15145:63;;15100:118;14751:474;;;;;:::o;15231:179::-;15300:10;15321:46;15363:3;15355:6;15321:46;:::i;:::-;15399:4;15394:3;15390:14;15376:28;;15231:179;;;;:::o;15416:118::-;15503:24;15521:5;15503:24;:::i;:::-;15498:3;15491:37;15416:118;;:::o;15570:732::-;15689:3;15718:54;15766:5;15718:54;:::i;:::-;15788:86;15867:6;15862:3;15788:86;:::i;:::-;15781:93;;15898:56;15948:5;15898:56;:::i;:::-;15977:7;16008:1;15993:284;16018:6;16015:1;16012:13;15993:284;;;16094:6;16088:13;16121:63;16180:3;16165:13;16121:63;:::i;:::-;16114:70;;16207:60;16260:6;16207:60;:::i;:::-;16197:70;;16053:224;16040:1;16037;16033:9;16028:14;;15993:284;;;15997:14;16293:3;16286:10;;15694:608;;;15570:732;;;;:::o;16308:109::-;16389:21;16404:5;16389:21;:::i;:::-;16384:3;16377:34;16308:109;;:::o;16423:118::-;16510:24;16528:5;16510:24;:::i;:::-;16505:3;16498:37;16423:118;;:::o;16547:360::-;16633:3;16661:38;16693:5;16661:38;:::i;:::-;16715:70;16778:6;16773:3;16715:70;:::i;:::-;16708:77;;16794:52;16839:6;16834:3;16827:4;16820:5;16816:16;16794:52;:::i;:::-;16871:29;16893:6;16871:29;:::i;:::-;16866:3;16862:39;16855:46;;16637:270;16547:360;;;;:::o;16937:304::-;17035:3;17056:71;17120:6;17115:3;17056:71;:::i;:::-;17049:78;;17137:43;17173:6;17168:3;17161:5;17137:43;:::i;:::-;17205:29;17227:6;17205:29;:::i;:::-;17200:3;17196:39;17189:46;;16937:304;;;;;:::o;17247:364::-;17335:3;17363:39;17396:5;17363:39;:::i;:::-;17418:71;17482:6;17477:3;17418:71;:::i;:::-;17411:78;;17498:52;17543:6;17538:3;17531:4;17524:5;17520:16;17498:52;:::i;:::-;17575:29;17597:6;17575:29;:::i;:::-;17570:3;17566:39;17559:46;;17339:272;17247:364;;;;:::o;17617:377::-;17723:3;17751:39;17784:5;17751:39;:::i;:::-;17806:89;17888:6;17883:3;17806:89;:::i;:::-;17799:96;;17904:52;17949:6;17944:3;17937:4;17930:5;17926:16;17904:52;:::i;:::-;17981:6;17976:3;17972:16;17965:23;;17727:267;17617:377;;;;:::o;18000:366::-;18142:3;18163:67;18227:2;18222:3;18163:67;:::i;:::-;18156:74;;18239:93;18328:3;18239:93;:::i;:::-;18357:2;18352:3;18348:12;18341:19;;18000:366;;;:::o;18372:::-;18514:3;18535:67;18599:2;18594:3;18535:67;:::i;:::-;18528:74;;18611:93;18700:3;18611:93;:::i;:::-;18729:2;18724:3;18720:12;18713:19;;18372:366;;;:::o;18744:::-;18886:3;18907:67;18971:2;18966:3;18907:67;:::i;:::-;18900:74;;18983:93;19072:3;18983:93;:::i;:::-;19101:2;19096:3;19092:12;19085:19;;18744:366;;;:::o;19116:::-;19258:3;19279:67;19343:2;19338:3;19279:67;:::i;:::-;19272:74;;19355:93;19444:3;19355:93;:::i;:::-;19473:2;19468:3;19464:12;19457:19;;19116:366;;;:::o;19488:::-;19630:3;19651:67;19715:2;19710:3;19651:67;:::i;:::-;19644:74;;19727:93;19816:3;19727:93;:::i;:::-;19845:2;19840:3;19836:12;19829:19;;19488:366;;;:::o;19860:::-;20002:3;20023:67;20087:2;20082:3;20023:67;:::i;:::-;20016:74;;20099:93;20188:3;20099:93;:::i;:::-;20217:2;20212:3;20208:12;20201:19;;19860:366;;;:::o;20232:::-;20374:3;20395:67;20459:2;20454:3;20395:67;:::i;:::-;20388:74;;20471:93;20560:3;20471:93;:::i;:::-;20589:2;20584:3;20580:12;20573:19;;20232:366;;;:::o;20604:::-;20746:3;20767:67;20831:2;20826:3;20767:67;:::i;:::-;20760:74;;20843:93;20932:3;20843:93;:::i;:::-;20961:2;20956:3;20952:12;20945:19;;20604:366;;;:::o;20976:::-;21118:3;21139:67;21203:2;21198:3;21139:67;:::i;:::-;21132:74;;21215:93;21304:3;21215:93;:::i;:::-;21333:2;21328:3;21324:12;21317:19;;20976:366;;;:::o;21348:::-;21490:3;21511:67;21575:2;21570:3;21511:67;:::i;:::-;21504:74;;21587:93;21676:3;21587:93;:::i;:::-;21705:2;21700:3;21696:12;21689:19;;21348:366;;;:::o;21720:::-;21862:3;21883:67;21947:2;21942:3;21883:67;:::i;:::-;21876:74;;21959:93;22048:3;21959:93;:::i;:::-;22077:2;22072:3;22068:12;22061:19;;21720:366;;;:::o;22092:::-;22234:3;22255:67;22319:2;22314:3;22255:67;:::i;:::-;22248:74;;22331:93;22420:3;22331:93;:::i;:::-;22449:2;22444:3;22440:12;22433:19;;22092:366;;;:::o;22464:::-;22606:3;22627:67;22691:2;22686:3;22627:67;:::i;:::-;22620:74;;22703:93;22792:3;22703:93;:::i;:::-;22821:2;22816:3;22812:12;22805:19;;22464:366;;;:::o;22836:::-;22978:3;22999:67;23063:2;23058:3;22999:67;:::i;:::-;22992:74;;23075:93;23164:3;23075:93;:::i;:::-;23193:2;23188:3;23184:12;23177:19;;22836:366;;;:::o;23208:::-;23350:3;23371:67;23435:2;23430:3;23371:67;:::i;:::-;23364:74;;23447:93;23536:3;23447:93;:::i;:::-;23565:2;23560:3;23556:12;23549:19;;23208:366;;;:::o;23580:::-;23722:3;23743:67;23807:2;23802:3;23743:67;:::i;:::-;23736:74;;23819:93;23908:3;23819:93;:::i;:::-;23937:2;23932:3;23928:12;23921:19;;23580:366;;;:::o;23952:::-;24094:3;24115:67;24179:2;24174:3;24115:67;:::i;:::-;24108:74;;24191:93;24280:3;24191:93;:::i;:::-;24309:2;24304:3;24300:12;24293:19;;23952:366;;;:::o;24324:::-;24466:3;24487:67;24551:2;24546:3;24487:67;:::i;:::-;24480:74;;24563:93;24652:3;24563:93;:::i;:::-;24681:2;24676:3;24672:12;24665:19;;24324:366;;;:::o;24696:::-;24838:3;24859:67;24923:2;24918:3;24859:67;:::i;:::-;24852:74;;24935:93;25024:3;24935:93;:::i;:::-;25053:2;25048:3;25044:12;25037:19;;24696:366;;;:::o;25068:::-;25210:3;25231:67;25295:2;25290:3;25231:67;:::i;:::-;25224:74;;25307:93;25396:3;25307:93;:::i;:::-;25425:2;25420:3;25416:12;25409:19;;25068:366;;;:::o;25440:::-;25582:3;25603:67;25667:2;25662:3;25603:67;:::i;:::-;25596:74;;25679:93;25768:3;25679:93;:::i;:::-;25797:2;25792:3;25788:12;25781:19;;25440:366;;;:::o;25812:::-;25954:3;25975:67;26039:2;26034:3;25975:67;:::i;:::-;25968:74;;26051:93;26140:3;26051:93;:::i;:::-;26169:2;26164:3;26160:12;26153:19;;25812:366;;;:::o;26184:::-;26326:3;26347:67;26411:2;26406:3;26347:67;:::i;:::-;26340:74;;26423:93;26512:3;26423:93;:::i;:::-;26541:2;26536:3;26532:12;26525:19;;26184:366;;;:::o;26556:::-;26698:3;26719:67;26783:2;26778:3;26719:67;:::i;:::-;26712:74;;26795:93;26884:3;26795:93;:::i;:::-;26913:2;26908:3;26904:12;26897:19;;26556:366;;;:::o;26928:::-;27070:3;27091:67;27155:2;27150:3;27091:67;:::i;:::-;27084:74;;27167:93;27256:3;27167:93;:::i;:::-;27285:2;27280:3;27276:12;27269:19;;26928:366;;;:::o;27300:::-;27442:3;27463:67;27527:2;27522:3;27463:67;:::i;:::-;27456:74;;27539:93;27628:3;27539:93;:::i;:::-;27657:2;27652:3;27648:12;27641:19;;27300:366;;;:::o;27672:::-;27814:3;27835:67;27899:2;27894:3;27835:67;:::i;:::-;27828:74;;27911:93;28000:3;27911:93;:::i;:::-;28029:2;28024:3;28020:12;28013:19;;27672:366;;;:::o;28044:::-;28186:3;28207:67;28271:2;28266:3;28207:67;:::i;:::-;28200:74;;28283:93;28372:3;28283:93;:::i;:::-;28401:2;28396:3;28392:12;28385:19;;28044:366;;;:::o;28416:::-;28558:3;28579:67;28643:2;28638:3;28579:67;:::i;:::-;28572:74;;28655:93;28744:3;28655:93;:::i;:::-;28773:2;28768:3;28764:12;28757:19;;28416:366;;;:::o;28788:::-;28930:3;28951:67;29015:2;29010:3;28951:67;:::i;:::-;28944:74;;29027:93;29116:3;29027:93;:::i;:::-;29145:2;29140:3;29136:12;29129:19;;28788:366;;;:::o;29160:::-;29302:3;29323:67;29387:2;29382:3;29323:67;:::i;:::-;29316:74;;29399:93;29488:3;29399:93;:::i;:::-;29517:2;29512:3;29508:12;29501:19;;29160:366;;;:::o;29532:::-;29674:3;29695:67;29759:2;29754:3;29695:67;:::i;:::-;29688:74;;29771:93;29860:3;29771:93;:::i;:::-;29889:2;29884:3;29880:12;29873:19;;29532:366;;;:::o;29904:::-;30046:3;30067:67;30131:2;30126:3;30067:67;:::i;:::-;30060:74;;30143:93;30232:3;30143:93;:::i;:::-;30261:2;30256:3;30252:12;30245:19;;29904:366;;;:::o;30276:108::-;30353:24;30371:5;30353:24;:::i;:::-;30348:3;30341:37;30276:108;;:::o;30390:118::-;30477:24;30495:5;30477:24;:::i;:::-;30472:3;30465:37;30390:118;;:::o;30514:112::-;30597:22;30613:5;30597:22;:::i;:::-;30592:3;30585:35;30514:112;;:::o;30632:435::-;30812:3;30834:95;30925:3;30916:6;30834:95;:::i;:::-;30827:102;;30946:95;31037:3;31028:6;30946:95;:::i;:::-;30939:102;;31058:3;31051:10;;30632:435;;;;;:::o;31073:222::-;31166:4;31204:2;31193:9;31189:18;31181:26;;31217:71;31285:1;31274:9;31270:17;31261:6;31217:71;:::i;:::-;31073:222;;;;:::o;31301:640::-;31496:4;31534:3;31523:9;31519:19;31511:27;;31548:71;31616:1;31605:9;31601:17;31592:6;31548:71;:::i;:::-;31629:72;31697:2;31686:9;31682:18;31673:6;31629:72;:::i;:::-;31711;31779:2;31768:9;31764:18;31755:6;31711:72;:::i;:::-;31830:9;31824:4;31820:20;31815:2;31804:9;31800:18;31793:48;31858:76;31929:4;31920:6;31858:76;:::i;:::-;31850:84;;31301:640;;;;;;;:::o;31947:443::-;32098:4;32136:2;32125:9;32121:18;32113:26;;32149:71;32217:1;32206:9;32202:17;32193:6;32149:71;:::i;:::-;32267:9;32261:4;32257:20;32252:2;32241:9;32237:18;32230:48;32295:88;32378:4;32369:6;32361;32295:88;:::i;:::-;32287:96;;31947:443;;;;;;:::o;32396:332::-;32517:4;32555:2;32544:9;32540:18;32532:26;;32568:71;32636:1;32625:9;32621:17;32612:6;32568:71;:::i;:::-;32649:72;32717:2;32706:9;32702:18;32693:6;32649:72;:::i;:::-;32396:332;;;;;:::o;32734:553::-;32913:4;32951:2;32940:9;32936:18;32928:26;;32964:71;33032:1;33021:9;33017:17;33008:6;32964:71;:::i;:::-;33045:72;33113:2;33102:9;33098:18;33089:6;33045:72;:::i;:::-;33164:9;33158:4;33154:20;33149:2;33138:9;33134:18;33127:48;33192:88;33275:4;33266:6;33258;33192:88;:::i;:::-;33184:96;;32734:553;;;;;;;:::o;33293:373::-;33436:4;33474:2;33463:9;33459:18;33451:26;;33523:9;33517:4;33513:20;33509:1;33498:9;33494:17;33487:47;33551:108;33654:4;33645:6;33551:108;:::i;:::-;33543:116;;33293:373;;;;:::o;33672:210::-;33759:4;33797:2;33786:9;33782:18;33774:26;;33810:65;33872:1;33861:9;33857:17;33848:6;33810:65;:::i;:::-;33672:210;;;;:::o;33888:222::-;33981:4;34019:2;34008:9;34004:18;33996:26;;34032:71;34100:1;34089:9;34085:17;34076:6;34032:71;:::i;:::-;33888:222;;;;:::o;34116:545::-;34289:4;34327:3;34316:9;34312:19;34304:27;;34341:71;34409:1;34398:9;34394:17;34385:6;34341:71;:::i;:::-;34422:68;34486:2;34475:9;34471:18;34462:6;34422:68;:::i;:::-;34500:72;34568:2;34557:9;34553:18;34544:6;34500:72;:::i;:::-;34582;34650:2;34639:9;34635:18;34626:6;34582:72;:::i;:::-;34116:545;;;;;;;:::o;34667:313::-;34780:4;34818:2;34807:9;34803:18;34795:26;;34867:9;34861:4;34857:20;34853:1;34842:9;34838:17;34831:47;34895:78;34968:4;34959:6;34895:78;:::i;:::-;34887:86;;34667:313;;;;:::o;34986:419::-;35152:4;35190:2;35179:9;35175:18;35167:26;;35239:9;35233:4;35229:20;35225:1;35214:9;35210:17;35203:47;35267:131;35393:4;35267:131;:::i;:::-;35259:139;;34986:419;;;:::o;35411:::-;35577:4;35615:2;35604:9;35600:18;35592:26;;35664:9;35658:4;35654:20;35650:1;35639:9;35635:17;35628:47;35692:131;35818:4;35692:131;:::i;:::-;35684:139;;35411:419;;;:::o;35836:::-;36002:4;36040:2;36029:9;36025:18;36017:26;;36089:9;36083:4;36079:20;36075:1;36064:9;36060:17;36053:47;36117:131;36243:4;36117:131;:::i;:::-;36109:139;;35836:419;;;:::o;36261:::-;36427:4;36465:2;36454:9;36450:18;36442:26;;36514:9;36508:4;36504:20;36500:1;36489:9;36485:17;36478:47;36542:131;36668:4;36542:131;:::i;:::-;36534:139;;36261:419;;;:::o;36686:::-;36852:4;36890:2;36879:9;36875:18;36867:26;;36939:9;36933:4;36929:20;36925:1;36914:9;36910:17;36903:47;36967:131;37093:4;36967:131;:::i;:::-;36959:139;;36686:419;;;:::o;37111:::-;37277:4;37315:2;37304:9;37300:18;37292:26;;37364:9;37358:4;37354:20;37350:1;37339:9;37335:17;37328:47;37392:131;37518:4;37392:131;:::i;:::-;37384:139;;37111:419;;;:::o;37536:::-;37702:4;37740:2;37729:9;37725:18;37717:26;;37789:9;37783:4;37779:20;37775:1;37764:9;37760:17;37753:47;37817:131;37943:4;37817:131;:::i;:::-;37809:139;;37536:419;;;:::o;37961:::-;38127:4;38165:2;38154:9;38150:18;38142:26;;38214:9;38208:4;38204:20;38200:1;38189:9;38185:17;38178:47;38242:131;38368:4;38242:131;:::i;:::-;38234:139;;37961:419;;;:::o;38386:::-;38552:4;38590:2;38579:9;38575:18;38567:26;;38639:9;38633:4;38629:20;38625:1;38614:9;38610:17;38603:47;38667:131;38793:4;38667:131;:::i;:::-;38659:139;;38386:419;;;:::o;38811:::-;38977:4;39015:2;39004:9;39000:18;38992:26;;39064:9;39058:4;39054:20;39050:1;39039:9;39035:17;39028:47;39092:131;39218:4;39092:131;:::i;:::-;39084:139;;38811:419;;;:::o;39236:::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:::-;39827:4;39865:2;39854:9;39850:18;39842:26;;39914:9;39908:4;39904:20;39900:1;39889:9;39885:17;39878:47;39942:131;40068:4;39942:131;:::i;:::-;39934:139;;39661:419;;;:::o;40086:::-;40252:4;40290:2;40279:9;40275:18;40267:26;;40339:9;40333:4;40329:20;40325:1;40314:9;40310:17;40303:47;40367:131;40493:4;40367:131;:::i;:::-;40359:139;;40086:419;;;:::o;40511:::-;40677:4;40715:2;40704:9;40700:18;40692:26;;40764:9;40758:4;40754:20;40750:1;40739:9;40735:17;40728:47;40792:131;40918:4;40792:131;:::i;:::-;40784:139;;40511:419;;;:::o;40936:::-;41102:4;41140:2;41129:9;41125:18;41117:26;;41189:9;41183:4;41179:20;41175:1;41164:9;41160:17;41153:47;41217:131;41343:4;41217:131;:::i;:::-;41209:139;;40936:419;;;:::o;41361:::-;41527:4;41565:2;41554:9;41550:18;41542:26;;41614:9;41608:4;41604:20;41600:1;41589:9;41585:17;41578:47;41642:131;41768:4;41642:131;:::i;:::-;41634:139;;41361:419;;;:::o;41786:::-;41952:4;41990:2;41979:9;41975:18;41967:26;;42039:9;42033:4;42029:20;42025:1;42014:9;42010:17;42003:47;42067:131;42193:4;42067:131;:::i;:::-;42059:139;;41786:419;;;:::o;42211:::-;42377:4;42415:2;42404:9;42400:18;42392:26;;42464:9;42458:4;42454:20;42450:1;42439:9;42435:17;42428:47;42492:131;42618:4;42492:131;:::i;:::-;42484:139;;42211:419;;;:::o;42636:::-;42802:4;42840:2;42829:9;42825:18;42817:26;;42889:9;42883:4;42879:20;42875:1;42864:9;42860:17;42853:47;42917:131;43043:4;42917:131;:::i;:::-;42909:139;;42636:419;;;:::o;43061:::-;43227:4;43265:2;43254:9;43250:18;43242:26;;43314:9;43308:4;43304:20;43300:1;43289:9;43285:17;43278:47;43342:131;43468:4;43342:131;:::i;:::-;43334:139;;43061:419;;;:::o;43486:::-;43652:4;43690:2;43679:9;43675:18;43667:26;;43739:9;43733:4;43729:20;43725:1;43714:9;43710:17;43703:47;43767:131;43893:4;43767:131;:::i;:::-;43759:139;;43486:419;;;:::o;43911:::-;44077:4;44115:2;44104:9;44100:18;44092:26;;44164:9;44158:4;44154:20;44150:1;44139:9;44135:17;44128:47;44192:131;44318:4;44192:131;:::i;:::-;44184:139;;43911:419;;;:::o;44336:::-;44502:4;44540:2;44529:9;44525:18;44517:26;;44589:9;44583:4;44579:20;44575:1;44564:9;44560:17;44553:47;44617:131;44743:4;44617:131;:::i;:::-;44609:139;;44336:419;;;:::o;44761:::-;44927:4;44965:2;44954:9;44950:18;44942:26;;45014:9;45008:4;45004:20;45000:1;44989:9;44985:17;44978:47;45042:131;45168:4;45042:131;:::i;:::-;45034:139;;44761:419;;;:::o;45186:::-;45352:4;45390:2;45379:9;45375:18;45367:26;;45439:9;45433:4;45429:20;45425:1;45414:9;45410:17;45403:47;45467:131;45593:4;45467:131;:::i;:::-;45459:139;;45186:419;;;:::o;45611:::-;45777:4;45815:2;45804:9;45800:18;45792:26;;45864:9;45858:4;45854:20;45850:1;45839:9;45835:17;45828:47;45892:131;46018:4;45892:131;:::i;:::-;45884:139;;45611:419;;;:::o;46036:::-;46202:4;46240:2;46229:9;46225:18;46217:26;;46289:9;46283:4;46279:20;46275:1;46264:9;46260:17;46253:47;46317:131;46443:4;46317:131;:::i;:::-;46309:139;;46036:419;;;:::o;46461:::-;46627:4;46665:2;46654:9;46650:18;46642:26;;46714:9;46708:4;46704:20;46700:1;46689:9;46685:17;46678:47;46742:131;46868:4;46742:131;:::i;:::-;46734:139;;46461:419;;;:::o;46886:::-;47052:4;47090:2;47079:9;47075:18;47067:26;;47139:9;47133:4;47129:20;47125:1;47114:9;47110:17;47103:47;47167:131;47293:4;47167:131;:::i;:::-;47159:139;;46886:419;;;:::o;47311:::-;47477:4;47515:2;47504:9;47500:18;47492:26;;47564:9;47558:4;47554:20;47550:1;47539:9;47535:17;47528:47;47592:131;47718:4;47592:131;:::i;:::-;47584:139;;47311:419;;;:::o;47736:::-;47902:4;47940:2;47929:9;47925:18;47917:26;;47989:9;47983:4;47979:20;47975:1;47964:9;47960:17;47953:47;48017:131;48143:4;48017:131;:::i;:::-;48009:139;;47736:419;;;:::o;48161:::-;48327:4;48365:2;48354:9;48350:18;48342:26;;48414:9;48408:4;48404:20;48400:1;48389:9;48385:17;48378:47;48442:131;48568:4;48442:131;:::i;:::-;48434:139;;48161:419;;;:::o;48586:::-;48752:4;48790:2;48779:9;48775:18;48767:26;;48839:9;48833:4;48829:20;48825:1;48814:9;48810:17;48803:47;48867:131;48993:4;48867:131;:::i;:::-;48859:139;;48586:419;;;:::o;49011:222::-;49104:4;49142:2;49131:9;49127:18;49119:26;;49155:71;49223:1;49212:9;49208:17;49199:6;49155:71;:::i;:::-;49011:222;;;;:::o;49239:129::-;49273:6;49300:20;;:::i;:::-;49290:30;;49329:33;49357:4;49349:6;49329:33;:::i;:::-;49239:129;;;:::o;49374:75::-;49407:6;49440:2;49434:9;49424:19;;49374:75;:::o;49455:307::-;49516:4;49606:18;49598:6;49595:30;49592:56;;;49628:18;;:::i;:::-;49592:56;49666:29;49688:6;49666:29;:::i;:::-;49658:37;;49750:4;49744;49740:15;49732:23;;49455:307;;;:::o;49768:308::-;49830:4;49920:18;49912:6;49909:30;49906:56;;;49942:18;;:::i;:::-;49906:56;49980:29;50002:6;49980:29;:::i;:::-;49972:37;;50064:4;50058;50054:15;50046:23;;49768:308;;;:::o;50082:132::-;50149:4;50172:3;50164:11;;50202:4;50197:3;50193:14;50185:22;;50082:132;;;:::o;50220:114::-;50287:6;50321:5;50315:12;50305:22;;50220:114;;;:::o;50340:98::-;50391:6;50425:5;50419:12;50409:22;;50340:98;;;:::o;50444:99::-;50496:6;50530:5;50524:12;50514:22;;50444:99;;;:::o;50549:113::-;50619:4;50651;50646:3;50642:14;50634:22;;50549:113;;;:::o;50668:184::-;50767:11;50801:6;50796:3;50789:19;50841:4;50836:3;50832:14;50817:29;;50668:184;;;;:::o;50858:168::-;50941:11;50975:6;50970:3;50963:19;51015:4;51010:3;51006:14;50991:29;;50858:168;;;;:::o;51032:169::-;51116:11;51150:6;51145:3;51138:19;51190:4;51185:3;51181:14;51166:29;;51032:169;;;;:::o;51207:148::-;51309:11;51346:3;51331:18;;51207:148;;;;:::o;51361:305::-;51401:3;51420:20;51438:1;51420:20;:::i;:::-;51415:25;;51454:20;51472:1;51454:20;:::i;:::-;51449:25;;51608:1;51540:66;51536:74;51533:1;51530:81;51527:107;;;51614:18;;:::i;:::-;51527:107;51658:1;51655;51651:9;51644:16;;51361:305;;;;:::o;51672:185::-;51712:1;51729:20;51747:1;51729:20;:::i;:::-;51724:25;;51763:20;51781:1;51763:20;:::i;:::-;51758:25;;51802:1;51792:35;;51807:18;;:::i;:::-;51792:35;51849:1;51846;51842:9;51837:14;;51672:185;;;;:::o;51863:348::-;51903:7;51926:20;51944:1;51926:20;:::i;:::-;51921:25;;51960:20;51978:1;51960:20;:::i;:::-;51955:25;;52148:1;52080:66;52076:74;52073:1;52070:81;52065:1;52058:9;52051:17;52047:105;52044:131;;;52155:18;;:::i;:::-;52044:131;52203:1;52200;52196:9;52185:20;;51863:348;;;;:::o;52217:191::-;52257:4;52277:20;52295:1;52277:20;:::i;:::-;52272:25;;52311:20;52329:1;52311:20;:::i;:::-;52306:25;;52350:1;52347;52344:8;52341:34;;;52355:18;;:::i;:::-;52341:34;52400:1;52397;52393:9;52385:17;;52217:191;;;;:::o;52414:96::-;52451:7;52480:24;52498:5;52480:24;:::i;:::-;52469:35;;52414:96;;;:::o;52516:90::-;52550:7;52593:5;52586:13;52579:21;52568:32;;52516:90;;;:::o;52612:77::-;52649:7;52678:5;52667:16;;52612:77;;;:::o;52695:149::-;52731:7;52771:66;52764:5;52760:78;52749:89;;52695:149;;;:::o;52850:126::-;52887:7;52927:42;52920:5;52916:54;52905:65;;52850:126;;;:::o;52982:77::-;53019:7;53048:5;53037:16;;52982:77;;;:::o;53065:86::-;53100:7;53140:4;53133:5;53129:16;53118:27;;53065:86;;;:::o;53157:154::-;53241:6;53236:3;53231;53218:30;53303:1;53294:6;53289:3;53285:16;53278:27;53157:154;;;:::o;53317:307::-;53385:1;53395:113;53409:6;53406:1;53403:13;53395:113;;;53494:1;53489:3;53485:11;53479:18;53475:1;53470:3;53466:11;53459:39;53431:2;53428:1;53424:10;53419:15;;53395:113;;;53526:6;53523:1;53520:13;53517:101;;;53606:1;53597:6;53592:3;53588:16;53581:27;53517:101;53366:258;53317:307;;;:::o;53630:320::-;53674:6;53711:1;53705:4;53701:12;53691:22;;53758:1;53752:4;53748:12;53779:18;53769:81;;53835:4;53827:6;53823:17;53813:27;;53769:81;53897:2;53889:6;53886:14;53866:18;53863:38;53860:84;;;53916:18;;:::i;:::-;53860:84;53681:269;53630:320;;;:::o;53956:281::-;54039:27;54061:4;54039:27;:::i;:::-;54031:6;54027:40;54169:6;54157:10;54154:22;54133:18;54121:10;54118:34;54115:62;54112:88;;;54180:18;;:::i;:::-;54112:88;54220:10;54216:2;54209:22;53999:238;53956:281;;:::o;54243:233::-;54282:3;54305:24;54323:5;54305:24;:::i;:::-;54296:33;;54351:66;54344:5;54341:77;54338:103;;;54421:18;;:::i;:::-;54338:103;54468:1;54461:5;54457:13;54450:20;;54243:233;;;:::o;54482:176::-;54514:1;54531:20;54549:1;54531:20;:::i;:::-;54526:25;;54565:20;54583:1;54565:20;:::i;:::-;54560:25;;54604:1;54594:35;;54609:18;;:::i;:::-;54594:35;54650:1;54647;54643:9;54638:14;;54482:176;;;;:::o;54664:180::-;54712:77;54709:1;54702:88;54809:4;54806:1;54799:15;54833:4;54830:1;54823:15;54850:180;54898:77;54895:1;54888:88;54995:4;54992:1;54985:15;55019:4;55016:1;55009:15;55036:180;55084:77;55081:1;55074:88;55181:4;55178:1;55171:15;55205:4;55202:1;55195:15;55222:180;55270:77;55267:1;55260:88;55367:4;55364:1;55357:15;55391:4;55388:1;55381:15;55408:180;55456:77;55453:1;55446:88;55553:4;55550:1;55543:15;55577:4;55574:1;55567:15;55594:180;55642:77;55639:1;55632:88;55739:4;55736:1;55729:15;55763:4;55760:1;55753:15;55780:117;55889:1;55886;55879:12;55903:117;56012:1;56009;56002:12;56026:117;56135:1;56132;56125:12;56149:117;56258:1;56255;56248:12;56272:117;56381:1;56378;56371:12;56395:117;56504:1;56501;56494:12;56518:102;56559:6;56610:2;56606:7;56601:2;56594:5;56590:14;56586:28;56576:38;;56518:102;;;:::o;56626:234::-;56766:34;56762:1;56754:6;56750:14;56743:58;56835:17;56830:2;56822:6;56818:15;56811:42;56626:234;:::o;56866:170::-;57006:22;57002:1;56994:6;56990:14;56983:46;56866:170;:::o;57042:230::-;57182:34;57178:1;57170:6;57166:14;57159:58;57251:13;57246:2;57238:6;57234:15;57227:38;57042:230;:::o;57278:237::-;57418:34;57414:1;57406:6;57402:14;57395:58;57487:20;57482:2;57474:6;57470:15;57463:45;57278:237;:::o;57521:225::-;57661:34;57657:1;57649:6;57645:14;57638:58;57730:8;57725:2;57717:6;57713:15;57706:33;57521:225;:::o;57752:178::-;57892:30;57888:1;57880:6;57876:14;57869:54;57752:178;:::o;57936:223::-;58076:34;58072:1;58064:6;58060:14;58053:58;58145:6;58140:2;58132:6;58128:15;58121:31;57936:223;:::o;58165:175::-;58305:27;58301:1;58293:6;58289:14;58282:51;58165:175;:::o;58346:176::-;58486:28;58482:1;58474:6;58470:14;58463:52;58346:176;:::o;58528:231::-;58668:34;58664:1;58656:6;58652:14;58645:58;58737:14;58732:2;58724:6;58720:15;58713:39;58528:231;:::o;58765:229::-;58905:34;58901:1;58893:6;58889:14;58882:58;58974:12;58969:2;58961:6;58957:15;58950:37;58765:229;:::o;59000:235::-;59140:34;59136:1;59128:6;59124:14;59117:58;59209:18;59204:2;59196:6;59192:15;59185:43;59000:235;:::o;59241:166::-;59381:18;59377:1;59369:6;59365:14;59358:42;59241:166;:::o;59413:224::-;59553:34;59549:1;59541:6;59537:14;59530:58;59622:7;59617:2;59609:6;59605:15;59598:32;59413:224;:::o;59643:243::-;59783:34;59779:1;59771:6;59767:14;59760:58;59852:26;59847:2;59839:6;59835:15;59828:51;59643:243;:::o;59892:229::-;60032:34;60028:1;60020:6;60016:14;60009:58;60101:12;60096:2;60088:6;60084:15;60077:37;59892:229;:::o;60127:228::-;60267:34;60263:1;60255:6;60251:14;60244:58;60336:11;60331:2;60323:6;60319:15;60312:36;60127:228;:::o;60361:234::-;60501:34;60497:1;60489:6;60485:14;60478:58;60570:17;60565:2;60557:6;60553:15;60546:42;60361:234;:::o;60601:182::-;60741:34;60737:1;60729:6;60725:14;60718:58;60601:182;:::o;60789:236::-;60929:34;60925:1;60917:6;60913:14;60906:58;60998:19;60993:2;60985:6;60981:15;60974:44;60789:236;:::o;61031:231::-;61171:34;61167:1;61159:6;61155:14;61148:58;61240:14;61235:2;61227:6;61223:15;61216:39;61031:231;:::o;61268:182::-;61408:34;61404:1;61396:6;61392:14;61385:58;61268:182;:::o;61456:228::-;61596:34;61592:1;61584:6;61580:14;61573:58;61665:11;61660:2;61652:6;61648:15;61641:36;61456:228;:::o;61690:234::-;61830:34;61826:1;61818:6;61814:14;61807:58;61899:17;61894:2;61886:6;61882:15;61875:42;61690:234;:::o;61930:220::-;62070:34;62066:1;62058:6;62054:14;62047:58;62139:3;62134:2;62126:6;62122:15;62115:28;61930:220;:::o;62156:236::-;62296:34;62292:1;62284:6;62280:14;62273:58;62365:19;62360:2;62352:6;62348:15;62341:44;62156:236;:::o;62398:231::-;62538:34;62534:1;62526:6;62522:14;62515:58;62607:14;62602:2;62594:6;62590:15;62583:39;62398:231;:::o;62635:223::-;62775:34;62771:1;62763:6;62759:14;62752:58;62844:6;62839:2;62831:6;62827:15;62820:31;62635:223;:::o;62864:174::-;63004:26;63000:1;62992:6;62988:14;62981:50;62864:174;:::o;63044:235::-;63184:34;63180:1;63172:6;63168:14;63161:58;63253:18;63248:2;63240:6;63236:15;63229:43;63044:235;:::o;63285:180::-;63425:32;63421:1;63413:6;63409:14;63402:56;63285:180;:::o;63471:234::-;63611:34;63607:1;63599:6;63595:14;63588:58;63680:17;63675:2;63667:6;63663:15;63656:42;63471:234;:::o;63711:233::-;63851:34;63847:1;63839:6;63835:14;63828:58;63920:16;63915:2;63907:6;63903:15;63896:41;63711:233;:::o;63950:122::-;64023:24;64041:5;64023:24;:::i;:::-;64016:5;64013:35;64003:63;;64062:1;64059;64052:12;64003:63;63950:122;:::o;64078:116::-;64148:21;64163:5;64148:21;:::i;:::-;64141:5;64138:32;64128:60;;64184:1;64181;64174:12;64128:60;64078:116;:::o;64200:122::-;64273:24;64291:5;64273:24;:::i;:::-;64266:5;64263:35;64253:63;;64312:1;64309;64302:12;64253:63;64200:122;:::o;64328:120::-;64400:23;64417:5;64400:23;:::i;:::-;64393:5;64390:34;64380:62;;64438:1;64435;64428:12;64380:62;64328:120;:::o;64454:122::-;64527:24;64545:5;64527:24;:::i;:::-;64520:5;64517:35;64507:63;;64566:1;64563;64556:12;64507:63;64454:122;:::o
Swarm Source
ipfs://b4f7be18061984099ff0b695ef75b45543535a4bb67457035bc5940ad7687405
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.