More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 4,560 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 69882823 | 18 days ago | IN | 0 POL | 0.00427797 | ||||
Set Approval For... | 69841636 | 19 days ago | IN | 0 POL | 0.00084747 | ||||
Set Approval For... | 69841631 | 19 days ago | IN | 0 POL | 0.00077935 | ||||
Set Approval For... | 69687509 | 23 days ago | IN | 0 POL | 0.00145092 | ||||
Set Approval For... | 69659539 | 24 days ago | IN | 0 POL | 0.00139902 | ||||
Safe Transfer Fr... | 69606422 | 25 days ago | IN | 0 POL | 0.00435003 | ||||
Set Approval For... | 69474853 | 28 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 68008002 | 65 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 67825180 | 70 days ago | IN | 0 POL | 0.00148258 | ||||
Set Approval For... | 67409080 | 80 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 66602121 | 100 days ago | IN | 0 POL | 0.00139902 | ||||
Safe Transfer Fr... | 66478414 | 104 days ago | IN | 0 POL | 0.00182259 | ||||
Set Approval For... | 66176197 | 111 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 66091333 | 114 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 65793594 | 121 days ago | IN | 0 POL | 0.00178685 | ||||
Set Approval For... | 65694780 | 124 days ago | IN | 0 POL | 0.00177523 | ||||
Set Approval For... | 65524219 | 128 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 65321980 | 133 days ago | IN | 0 POL | 0.00216345 | ||||
Set Approval For... | 65209155 | 136 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 65207055 | 136 days ago | IN | 0 POL | 0.00139902 | ||||
Set Approval For... | 64877816 | 144 days ago | IN | 0 POL | 0.00411647 | ||||
Set Approval For... | 64701202 | 149 days ago | IN | 0 POL | 0.001457 | ||||
Set URI | 64087314 | 164 days ago | IN | 0 POL | 0.0023929 | ||||
Airdrop_cycle | 64086881 | 164 days ago | IN | 0 POL | 0.0939695 | ||||
Airdrop_cycle | 64086877 | 164 days ago | IN | 0 POL | 0.09493487 |
Loading...
Loading
Contract Name:
FlowerGirlsSpecials
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-12-24 */ // SPDX-License-Identifier: MIT // Flower Girl Special Editions (FlowerGirlsSpecials.sol) /* * Flower Girl Special Editions is an ERC-1155 Smart Contract * Deployed on the Polygon Layer-2 Ethereum network * It was created for The Flower Girls NFT project by Ryan Meyers (@sreyeMnayR) * Web: https://flowergirlsnft.com Twitter: @FlowerGirlsNFT * */ pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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 {AccessControl-_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 Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @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) external; /** * @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) external; /** * @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) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin_contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts v4.4.0 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin_contracts/token/common/ERC2981.sol // OpenZeppelin Contracts v4.4.0 (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the Royalty Standard allowing royalty information to be stored and retrieved. * * Adds the {_setTokenRoyalty} methods to set the token royalty information, and {_setDefaultRoyalty} method to set a default * royalty information. * * NOTE: As specified in EIP-2981, royalties are technically optional and payment is not enforced by this contract. * See https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Sets the royalty info for a specific token id, overriding the default royalty info. * * Requirements: * - `tokenId` must be already mined. * - `receiver` cannot be the zero address. * - `fraction` must indicate the percentage fraction using two decimals. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 fraction ) internal virtual { require(fraction <= _feeDenominator(), "ERC2981: Royalty percentage will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, fraction); } /** * @dev Sets the royalty info that tokens will default to. * * Requirements: * - `receiver` cannot be the zero address. * - `fraction` must indicate the percentage fraction. Needs to be set appropriately * according to the _feeDenominator granularity. */ function _setDefaultRoyalty(address receiver, uint96 fraction) internal virtual { require(fraction <= _feeDenominator(), "ERC2981: Royalty percentage will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, fraction); } /** * @dev See {IERC2981-royaltyInfo} */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev Returns the percentage granularity being used. The default denominator is 10000 * but it can be customized by an override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Removes `tokenId` royalty information. * The royalty information is cleared and the token royalty fallbacks to the default royalty. * * Requirements: * * - `tokenId` royalty information must exist. * */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } /** * @dev Removes default royalty information. * */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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 Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @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 Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @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 onlyRole(getRoleAdmin(role)) { _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 onlyRole(getRoleAdmin(role)) { _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 revoked `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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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 { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } // Flower Girl Specials (FlowerGirlsSpecials.sol) pragma solidity ^0.8.2; contract FlowerGirlsSpecials is ERC1155, ERC2981, AccessControl, Pausable, ERC1155Burnable, ERC1155Supply { bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant ROYALTY_ROLE = keccak256("ROYALTY_ROLE"); constructor() ERC1155("https://moshpit.mypinata.cloud/ipfs/QmUnLQUxKJKwFFbTbNQJN3kqLckQbwprNpTgS1vQJqyp3d/{id}.json") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(URI_SETTER_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _grantRole(ROYALTY_ROLE, msg.sender); _grantRole(DEFAULT_ADMIN_ROLE, 0x3D2198fC3907e9D095c2D973D7EC3f42B7C62Dfc); _grantRole(URI_SETTER_ROLE, 0x3D2198fC3907e9D095c2D973D7EC3f42B7C62Dfc); _grantRole(PAUSER_ROLE, 0x3D2198fC3907e9D095c2D973D7EC3f42B7C62Dfc); _grantRole(MINTER_ROLE, 0x3D2198fC3907e9D095c2D973D7EC3f42B7C62Dfc); _grantRole(ROYALTY_ROLE, 0x3D2198fC3907e9D095c2D973D7EC3f42B7C62Dfc); _grantRole(DEFAULT_ADMIN_ROLE, 0x58136e0909b71981F1a37F1f87859c562ed3657a); _grantRole(URI_SETTER_ROLE, 0x58136e0909b71981F1a37F1f87859c562ed3657a); _grantRole(PAUSER_ROLE, 0x58136e0909b71981F1a37F1f87859c562ed3657a); _grantRole(MINTER_ROLE, 0x58136e0909b71981F1a37F1f87859c562ed3657a); _grantRole(ROYALTY_ROLE, 0x58136e0909b71981F1a37F1f87859c562ed3657a); _setDefaultRoyalty(0x58136e0909b71981F1a37F1f87859c562ed3657a, 1000); } function setTokenRoyalty( uint256 tokenId, address receiver, uint96 fraction ) external onlyRole(ROYALTY_ROLE) { _setTokenRoyalty(tokenId, receiver, fraction); } function setDefaultRoyalty(address receiver, uint96 fraction) external onlyRole(ROYALTY_ROLE) { _setDefaultRoyalty(receiver, fraction); } function setURI(string calldata newuri) external onlyRole(URI_SETTER_ROLE) { _setURI(newuri); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function mint(address account, uint256 id, uint256 amount) external onlyRole(MINTER_ROLE) { _mint(account, id, amount, ""); } function mintBatch(address to, uint256[] calldata ids, uint256[] calldata amounts) external onlyRole(MINTER_ROLE) { _mintBatch(to, ids, amounts, ""); } function airdrop_cycle( address[] calldata recipients, uint256[] calldata amounts, uint256 startTokenId, uint256 endTokenId ) external onlyRole(MINTER_ROLE) { require(recipients.length == amounts.length, "Airdrop: addresses and amounts length mismatch"); uint256 tokenId = startTokenId; for (uint256 i = 0; i < recipients.length; i++) { for (uint256 ii = 0; ii < amounts[i]; ii++) { _mint(recipients[i], tokenId, 1, ""); tokenId += 1; if (tokenId > endTokenId) { tokenId = startTokenId; } } } } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal whenNotPaused override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981, AccessControl) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } } // According the the USDA, at least 10.5% of all households in the United States // are food insecure. Their definition for food insecurity is "uncertain of having, // or unable to acquire, enough food to meet the needs of all their members because // they had insufficient money or other resources for food. // [https://www.ers.usda.gov/topics/food-nutrition-assistance/food-security-in-the-us/key-statistics-graphics.aspx] // Other "developed" countries have similar challenges making sure everyone has // enough to eat. An estimated 7.2% of the population in high income countries // used food banks in 2013. [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6572174/] // We can do better than this! While we wait and work for social structures to // improve, however, it's super important to support the existing systems of // food banks and other charitable organizations focused on feeding people. // Non-Fungible Forks [forkhunger.art] is a 100% charity project created by // Ryan [dad/dev] & Anna [daughter/artiste] to attempt to do just that. // F**K HUNGER!
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","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":[],"name":"ROYALTY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"startTokenId","type":"uint256"},{"internalType":"uint256","name":"endTokenId","type":"uint256"}],"name":"airdrop_cycle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"fraction","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"fraction","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060800160405280605c815260200162005f9c605c91396200003d81620003e660201b60201c565b506000600660006101000a81548160ff0219169083151502179055506200006e6000801b336200040260201b60201c565b620000a07f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c336200040260201b60201c565b620000d27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200040260201b60201c565b620001047f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200040260201b60201c565b620001367feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e336200040260201b60201c565b6200015f6000801b733d2198fc3907e9d095c2d973d7ec3f42b7c62dfc6200040260201b60201c565b620001a57f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c733d2198fc3907e9d095c2d973d7ec3f42b7c62dfc6200040260201b60201c565b620001eb7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a733d2198fc3907e9d095c2d973d7ec3f42b7c62dfc6200040260201b60201c565b620002317f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6733d2198fc3907e9d095c2d973d7ec3f42b7c62dfc6200040260201b60201c565b620002777feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e733d2198fc3907e9d095c2d973d7ec3f42b7c62dfc6200040260201b60201c565b620002a06000801b7358136e0909b71981f1a37f1f87859c562ed3657a6200040260201b60201c565b620002e67f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c7358136e0909b71981f1a37f1f87859c562ed3657a6200040260201b60201c565b6200032c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a7358136e0909b71981f1a37f1f87859c562ed3657a6200040260201b60201c565b620003727f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a67358136e0909b71981f1a37f1f87859c562ed3657a6200040260201b60201c565b620003b87feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e7358136e0909b71981f1a37f1f87859c562ed3657a6200040260201b60201c565b620003e07358136e0909b71981f1a37f1f87859c562ed3657a6103e8620004f460201b60201c565b62000945565b8060029080519060200190620003fe92919062000715565b5050565b6200041482826200069860201b60201c565b620004f05760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004956200070360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620005046200070b60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000565576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055c906200084c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005cf90620008be565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000612710905090565b82805462000723906200090f565b90600052602060002090601f01602090048101928262000747576000855562000793565b82601f106200076257805160ff191683800117855562000793565b8280016001018555821562000793579182015b828111156200079257825182559160200191906001019062000775565b5b509050620007a29190620007a6565b5090565b5b80821115620007c1576000816000905550600101620007a7565b5090565b600082825260208201905092915050565b7f455243323938313a20526f79616c74792070657263656e746167652077696c6c60008201527f206578636565642073616c655072696365000000000000000000000000000000602082015250565b600062000834603183620007c5565b91506200084182620007d6565b604082019050919050565b60006020820190508181036000830152620008678162000825565b9050919050565b7f455243323938313a20496e76616c696420726563656976657200000000000000600082015250565b6000620008a6601983620007c5565b9150620008b3826200086e565b602082019050919050565b60006020820190508181036000830152620008d98162000897565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200092857607f821691505b602082108114156200093f576200093e620008e0565b5b50919050565b61564780620009556000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80636b20c4541161010f578063cb9fcffb116100a2578063e63ab1e911610071578063e63ab1e91461059f578063e985e9c5146105bd578063f242432a146105ed578063f5298aca14610609576101ef565b8063cb9fcffb1461052b578063d539139314610549578063d547741f14610567578063d81d0a1514610583576101ef565b806391d14854116100de57806391d1485414610491578063a217fddf146104c1578063a22cb465146104df578063bd85b039146104fb576101ef565b80636b20c454146104315780637577485b1461044d5780637f345710146104695780638456cb5914610487576101ef565b80632eb2c2d6116101875780634e1273f4116101565780634e1273f4146103975780634f558e79146103c75780635944c753146103f75780635c975abb14610413576101ef565b80632eb2c2d6146103395780632f2ff15d1461035557806336568abe146103715780633f4ba83a1461038d576101ef565b80630e89341c116101c35780630e89341c1461028c578063156e29f6146102bc578063248a9ca3146102d85780632a55205a14610308576101ef565b8062fdd58e146101f457806301ffc9a71461022457806302fe53051461025457806304634d8d14610270575b600080fd5b61020e600480360381019061020991906136ca565b610625565b60405161021b9190613719565b60405180910390f35b61023e6004803603810190610239919061378c565b6106ee565b60405161024b91906137d4565b60405180910390f35b61026e60048036038101906102699190613854565b610768565b005b61028a600480360381019061028591906138e5565b6107ec565b005b6102a660048036038101906102a19190613925565b61082d565b6040516102b391906139eb565b60405180910390f35b6102d660048036038101906102d19190613a0d565b6108c1565b005b6102f260048036038101906102ed9190613a96565b610914565b6040516102ff9190613ad2565b60405180910390f35b610322600480360381019061031d9190613aed565b610934565b604051610330929190613b3c565b60405180910390f35b610353600480360381019061034e9190613d58565b610b1f565b005b61036f600480360381019061036a9190613e27565b610bc0565b005b61038b60048036038101906103869190613e27565b610be9565b005b610395610c6c565b005b6103b160048036038101906103ac9190613f2a565b610ca9565b6040516103be9190614060565b60405180910390f35b6103e160048036038101906103dc9190613925565b610dc2565b6040516103ee91906137d4565b60405180910390f35b610411600480360381019061040c9190614082565b610dd6565b005b61041b610e19565b60405161042891906137d4565b60405180910390f35b61044b600480360381019061044691906140d5565b610e30565b005b6104676004803603810190610462919061420c565b610ecd565b005b61047161100e565b60405161047e9190613ad2565b60405180910390f35b61048f611032565b005b6104ab60048036038101906104a69190613e27565b61106f565b6040516104b891906137d4565b60405180910390f35b6104c96110da565b6040516104d69190613ad2565b60405180910390f35b6104f960048036038101906104f491906142df565b6110e1565b005b61051560048036038101906105109190613925565b6110f7565b6040516105229190613719565b60405180910390f35b610533611114565b6040516105409190613ad2565b60405180910390f35b610551611138565b60405161055e9190613ad2565b60405180910390f35b610581600480360381019061057c9190613e27565b61115c565b005b61059d6004803603810190610598919061431f565b611185565b005b6105a761125c565b6040516105b49190613ad2565b60405180910390f35b6105d760048036038101906105d291906143b4565b611280565b6040516105e491906137d4565b60405180910390f35b610607600480360381019061060291906143f4565b611314565b005b610623600480360381019061061e9190613a0d565b6113b5565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906144fd565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610761575061076082611452565b5b9050919050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61079a816107956114cc565b6114d4565b6107e783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611571565b505050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e61081e816108196114cc565b6114d4565b610828838361158b565b505050565b60606002805461083c9061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546108689061454c565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108f3816108ee6114cc565b6114d4565b61090e84848460405180602001604052806000815250611721565b50505050565b600060056000838152602001908152602001600020600101549050919050565b6000806000600460008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610aca5760036040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ad46118b7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b0091906145ad565b610b0a9190614636565b90508160000151819350935050509250929050565b610b276114cc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b6d5750610b6c85610b676114cc565b611280565b5b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3906146d9565b60405180910390fd5b610bb985858585856118c1565b5050505050565b610bc982610914565b610bda81610bd56114cc565b6114d4565b610be48383611bd5565b505050565b610bf16114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c559061476b565b60405180910390fd5b610c688282611cb6565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c9e81610c996114cc565b6114d4565b610ca6611d98565b50565b60608151835114610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce6906147fd565b60405180910390fd5b6000835167ffffffffffffffff811115610d0c57610d0b613b65565b5b604051908082528060200260200182016040528015610d3a5781602001602082028036833780820191505090505b50905060005b8451811015610db757610d87858281518110610d5f57610d5e61481d565b5b6020026020010151858381518110610d7a57610d7961481d565b5b6020026020010151610625565b828281518110610d9a57610d9961481d565b5b60200260200101818152505080610db09061484c565b9050610d40565b508091505092915050565b600080610dce836110f7565b119050919050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e610e0881610e036114cc565b6114d4565b610e13848484611e3a565b50505050565b6000600660009054906101000a900460ff16905090565b610e386114cc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e7e5750610e7d83610e786114cc565b611280565b5b610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614907565b60405180910390fd5b610ec8838383611fe2565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610eff81610efa6114cc565b6114d4565b848490508787905014610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614999565b60405180910390fd5b600083905060005b888890508110156110035760005b878783818110610f7057610f6f61481d565b5b90506020020135811015610fef57610fc18a8a84818110610f9457610f9361481d565b5b9050602002016020810190610fa991906149b9565b84600160405180602001604052806000815250611721565b600183610fce91906149e6565b925084831115610fdc578592505b8080610fe79061484c565b915050610f5d565b508080610ffb9061484c565b915050610f4f565b505050505050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110648161105f6114cc565b6114d4565b61106c612293565b50565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b6110f36110ec6114cc565b8383612336565b5050565b600060076000838152602001908152602001600020549050919050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e81565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61116582610914565b611176816111716114cc565b6114d4565b6111808383611cb6565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111b7816111b26114cc565b6114d4565b61125486868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050604051806020016040528060008152506124a3565b505050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61131c6114cc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061136257506113618561135c6114cc565b611280565b5b6113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890614907565b60405180910390fd5b6113ae85858585856126c1565b5050505050565b6113bd6114cc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806114035750611402836113fd6114cc565b611280565b5b611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614907565b60405180910390fd5b61144d838383612943565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114c557506114c482612b60565b5b9050919050565b600033905090565b6114de828261106f565b61156d576115038173ffffffffffffffffffffffffffffffffffffffff166014612bda565b6115118360001c6020612bda565b604051602001611522929190614b10565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156491906139eb565b60405180910390fd5b5050565b806002908051906020019061158792919061357f565b5050565b6115936118b7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614bbc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890614c28565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890614cba565b60405180910390fd5b600061179b6114cc565b90506117bc816000876117ad88612e16565b6117b688612e16565b87612e90565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181b91906149e6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611899929190614cda565b60405180910390a46118b081600087878787612eee565b5050505050565b6000612710905090565b8151835114611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc90614d75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90614e07565b60405180910390fd5b600061197f6114cc565b905061198f818787878787612e90565b60005b8451811015611b405760008582815181106119b0576119af61481d565b5b6020026020010151905060008583815181106119cf576119ce61481d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790614e99565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2591906149e6565b9250508190555050505080611b399061484c565b9050611992565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bb7929190614eb9565b60405180910390a4611bcd8187878787876130c6565b505050505050565b611bdf828261106f565b611cb25760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c576114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611cc0828261106f565b15611d945760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d396114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611da0610e19565b611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614f3c565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e236114cc565b604051611e309190614f5c565b60405180910390a1565b611e426118b7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790614bbc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790614fc3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990615055565b60405180910390fd5b8051825114612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614d75565b60405180910390fd5b60006120a06114cc565b90506120c081856000868660405180602001604052806000815250612e90565b60005b835181101561220d5760008482815181106120e1576120e061481d565b5b602002602001015190506000848381518110612100576120ff61481d565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612198906150e7565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122059061484c565b9150506120c3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612285929190614eb9565b60405180910390a450505050565b61229b610e19565b156122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290615153565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861231f6114cc565b60405161232c9190614f5c565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c906151e5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249691906137d4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614cba565b60405180910390fd5b8151835114612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614d75565b60405180910390fd5b60006125616114cc565b905061257281600087878787612e90565b60005b845181101561262b578381815181106125915761259061481d565b5b60200260200101516000808784815181106125af576125ae61481d565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261191906149e6565b9250508190555080806126239061484c565b915050612575565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126a3929190614eb9565b60405180910390a46126ba816000878787876130c6565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272890614e07565b60405180910390fd5b600061273b6114cc565b905061275b81878761274c88612e16565b61275588612e16565b87612e90565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614e99565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a791906149e6565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612924929190614cda565b60405180910390a461293a828888888888612eee565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90615055565b60405180910390fd5b60006129bd6114cc565b90506129ed818560006129cf87612e16565b6129d887612e16565b60405180602001604052806000815250612e90565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906150e7565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612b51929190614cda565b60405180910390a45050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd35750612bd28261329e565b5b9050919050565b606060006002836002612bed91906145ad565b612bf791906149e6565b67ffffffffffffffff811115612c1057612c0f613b65565b5b6040519080825280601f01601f191660200182016040528015612c425781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c7a57612c7961481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612cde57612cdd61481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d1e91906145ad565b612d2891906149e6565b90505b6001811115612dc8577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612d6a57612d6961481d565b5b1a60f81b828281518110612d8157612d8061481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612dc190615205565b9050612d2b565b5060008414612e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e039061527b565b60405180910390fd5b8091505092915050565b60606000600167ffffffffffffffff811115612e3557612e34613b65565b5b604051908082528060200260200182016040528015612e635781602001602082028036833780820191505090505b5090508281600081518110612e7b57612e7a61481d565b5b60200260200101818152505080915050919050565b612e98610e19565b15612ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecf90615153565b60405180910390fd5b612ee6868686868686613380565b505050505050565b612f0d8473ffffffffffffffffffffffffffffffffffffffff166134fa565b156130be578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612f539594939291906152f0565b6020604051808303816000875af1925050508015612f8f57506040513d601f19601f82011682018060405250810190612f8c919061535f565b60015b61303557612f9b615399565b806308c379a01415612ff85750612fb06153bb565b80612fbb5750612ffa565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fef91906139eb565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302c906154c3565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b390615555565b60405180910390fd5b505b505050505050565b6130e58473ffffffffffffffffffffffffffffffffffffffff166134fa565b15613296578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161312b959493929190615575565b6020604051808303816000875af192505050801561316757506040513d601f19601f82011682018060405250810190613164919061535f565b60015b61320d57613173615399565b806308c379a014156131d057506131886153bb565b8061319357506131d2565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c791906139eb565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613204906154c3565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328b90615555565b60405180910390fd5b505b505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061336957507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061337957506133788261350d565b5b9050919050565b61338e868686868686613577565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134405760005b835181101561343e578281815181106133e2576133e161481d565b5b6020026020010151600760008684815181106134015761340061481d565b5b60200260200101518152602001908152602001600020600082825461342691906149e6565b92505081905550806134379061484c565b90506133c6565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134f25760005b83518110156134f0578281815181106134945761349361481d565b5b6020026020010151600760008684815181106134b3576134b261481d565b5b6020026020010151815260200190815260200160002060008282546134d891906155dd565b92505081905550806134e99061484c565b9050613478565b505b505050505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b82805461358b9061454c565b90600052602060002090601f0160209004810192826135ad57600085556135f4565b82601f106135c657805160ff19168380011785556135f4565b828001600101855582156135f4579182015b828111156135f35782518255916020019190600101906135d8565b5b5090506136019190613605565b5090565b5b8082111561361e576000816000905550600101613606565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366182613636565b9050919050565b61367181613656565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b6000819050919050565b6136a781613694565b81146136b257600080fd5b50565b6000813590506136c48161369e565b92915050565b600080604083850312156136e1576136e061362c565b5b60006136ef8582860161367f565b9250506020613700858286016136b5565b9150509250929050565b61371381613694565b82525050565b600060208201905061372e600083018461370a565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61376981613734565b811461377457600080fd5b50565b60008135905061378681613760565b92915050565b6000602082840312156137a2576137a161362c565b5b60006137b084828501613777565b91505092915050565b60008115159050919050565b6137ce816137b9565b82525050565b60006020820190506137e960008301846137c5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613814576138136137ef565b5b8235905067ffffffffffffffff811115613831576138306137f4565b5b60208301915083600182028301111561384d5761384c6137f9565b5b9250929050565b6000806020838503121561386b5761386a61362c565b5b600083013567ffffffffffffffff81111561388957613888613631565b5b613895858286016137fe565b92509250509250929050565b60006bffffffffffffffffffffffff82169050919050565b6138c2816138a1565b81146138cd57600080fd5b50565b6000813590506138df816138b9565b92915050565b600080604083850312156138fc576138fb61362c565b5b600061390a8582860161367f565b925050602061391b858286016138d0565b9150509250929050565b60006020828403121561393b5761393a61362c565b5b6000613949848285016136b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561398c578082015181840152602081019050613971565b8381111561399b576000848401525b50505050565b6000601f19601f8301169050919050565b60006139bd82613952565b6139c7818561395d565b93506139d781856020860161396e565b6139e0816139a1565b840191505092915050565b60006020820190508181036000830152613a0581846139b2565b905092915050565b600080600060608486031215613a2657613a2561362c565b5b6000613a348682870161367f565b9350506020613a45868287016136b5565b9250506040613a56868287016136b5565b9150509250925092565b6000819050919050565b613a7381613a60565b8114613a7e57600080fd5b50565b600081359050613a9081613a6a565b92915050565b600060208284031215613aac57613aab61362c565b5b6000613aba84828501613a81565b91505092915050565b613acc81613a60565b82525050565b6000602082019050613ae76000830184613ac3565b92915050565b60008060408385031215613b0457613b0361362c565b5b6000613b12858286016136b5565b9250506020613b23858286016136b5565b9150509250929050565b613b3681613656565b82525050565b6000604082019050613b516000830185613b2d565b613b5e602083018461370a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b9d826139a1565b810181811067ffffffffffffffff82111715613bbc57613bbb613b65565b5b80604052505050565b6000613bcf613622565b9050613bdb8282613b94565b919050565b600067ffffffffffffffff821115613bfb57613bfa613b65565b5b602082029050602081019050919050565b6000613c1f613c1a84613be0565b613bc5565b90508083825260208201905060208402830185811115613c4257613c416137f9565b5b835b81811015613c6b5780613c5788826136b5565b845260208401935050602081019050613c44565b5050509392505050565b600082601f830112613c8a57613c896137ef565b5b8135613c9a848260208601613c0c565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cc357613cc2613b65565b5b613ccc826139a1565b9050602081019050919050565b82818337600083830152505050565b6000613cfb613cf684613ca8565b613bc5565b905082815260208101848484011115613d1757613d16613ca3565b5b613d22848285613cd9565b509392505050565b600082601f830112613d3f57613d3e6137ef565b5b8135613d4f848260208601613ce8565b91505092915050565b600080600080600060a08688031215613d7457613d7361362c565b5b6000613d828882890161367f565b9550506020613d938882890161367f565b945050604086013567ffffffffffffffff811115613db457613db3613631565b5b613dc088828901613c75565b935050606086013567ffffffffffffffff811115613de157613de0613631565b5b613ded88828901613c75565b925050608086013567ffffffffffffffff811115613e0e57613e0d613631565b5b613e1a88828901613d2a565b9150509295509295909350565b60008060408385031215613e3e57613e3d61362c565b5b6000613e4c85828601613a81565b9250506020613e5d8582860161367f565b9150509250929050565b600067ffffffffffffffff821115613e8257613e81613b65565b5b602082029050602081019050919050565b6000613ea6613ea184613e67565b613bc5565b90508083825260208201905060208402830185811115613ec957613ec86137f9565b5b835b81811015613ef25780613ede888261367f565b845260208401935050602081019050613ecb565b5050509392505050565b600082601f830112613f1157613f106137ef565b5b8135613f21848260208601613e93565b91505092915050565b60008060408385031215613f4157613f4061362c565b5b600083013567ffffffffffffffff811115613f5f57613f5e613631565b5b613f6b85828601613efc565b925050602083013567ffffffffffffffff811115613f8c57613f8b613631565b5b613f9885828601613c75565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd781613694565b82525050565b6000613fe98383613fce565b60208301905092915050565b6000602082019050919050565b600061400d82613fa2565b6140178185613fad565b935061402283613fbe565b8060005b8381101561405357815161403a8882613fdd565b975061404583613ff5565b925050600181019050614026565b5085935050505092915050565b6000602082019050818103600083015261407a8184614002565b905092915050565b60008060006060848603121561409b5761409a61362c565b5b60006140a9868287016136b5565b93505060206140ba8682870161367f565b92505060406140cb868287016138d0565b9150509250925092565b6000806000606084860312156140ee576140ed61362c565b5b60006140fc8682870161367f565b935050602084013567ffffffffffffffff81111561411d5761411c613631565b5b61412986828701613c75565b925050604084013567ffffffffffffffff81111561414a57614149613631565b5b61415686828701613c75565b9150509250925092565b60008083601f840112614176576141756137ef565b5b8235905067ffffffffffffffff811115614193576141926137f4565b5b6020830191508360208202830111156141af576141ae6137f9565b5b9250929050565b60008083601f8401126141cc576141cb6137ef565b5b8235905067ffffffffffffffff8111156141e9576141e86137f4565b5b602083019150836020820283011115614205576142046137f9565b5b9250929050565b600080600080600080608087890312156142295761422861362c565b5b600087013567ffffffffffffffff81111561424757614246613631565b5b61425389828a01614160565b9650965050602087013567ffffffffffffffff81111561427657614275613631565b5b61428289828a016141b6565b9450945050604061429589828a016136b5565b92505060606142a689828a016136b5565b9150509295509295509295565b6142bc816137b9565b81146142c757600080fd5b50565b6000813590506142d9816142b3565b92915050565b600080604083850312156142f6576142f561362c565b5b60006143048582860161367f565b9250506020614315858286016142ca565b9150509250929050565b60008060008060006060868803121561433b5761433a61362c565b5b60006143498882890161367f565b955050602086013567ffffffffffffffff81111561436a57614369613631565b5b614376888289016141b6565b9450945050604086013567ffffffffffffffff81111561439957614398613631565b5b6143a5888289016141b6565b92509250509295509295909350565b600080604083850312156143cb576143ca61362c565b5b60006143d98582860161367f565b92505060206143ea8582860161367f565b9150509250929050565b600080600080600060a086880312156144105761440f61362c565b5b600061441e8882890161367f565b955050602061442f8882890161367f565b9450506040614440888289016136b5565b9350506060614451888289016136b5565b925050608086013567ffffffffffffffff81111561447257614471613631565b5b61447e88828901613d2a565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006144e7602b8361395d565b91506144f28261448b565b604082019050919050565b60006020820190508181036000830152614516816144da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456457607f821691505b602082108114156145785761457761451d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145b882613694565b91506145c383613694565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145fc576145fb61457e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464182613694565b915061464c83613694565b92508261465c5761465b614607565b5b828204905092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006146c360328361395d565b91506146ce82614667565b604082019050919050565b600060208201905081810360008301526146f2816146b6565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614755602f8361395d565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006147e760298361395d565b91506147f28261478b565b604082019050919050565b60006020820190508181036000830152614816816147da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061485782613694565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561488a5761488961457e565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006148f160298361395d565b91506148fc82614895565b604082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b7f41697264726f703a2061646472657373657320616e6420616d6f756e7473206c60008201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b6000614983602e8361395d565b915061498e82614927565b604082019050919050565b600060208201905081810360008301526149b281614976565b9050919050565b6000602082840312156149cf576149ce61362c565b5b60006149dd8482850161367f565b91505092915050565b60006149f182613694565b91506149fc83613694565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3157614a3061457e565b5b828201905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a7d601783614a3c565b9150614a8882614a47565b601782019050919050565b6000614a9e82613952565b614aa88185614a3c565b9350614ab881856020860161396e565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614afa601183614a3c565b9150614b0582614ac4565b601182019050919050565b6000614b1b82614a70565b9150614b278285614a93565b9150614b3282614aed565b9150614b3e8284614a93565b91508190509392505050565b7f455243323938313a20526f79616c74792070657263656e746167652077696c6c60008201527f206578636565642073616c655072696365000000000000000000000000000000602082015250565b6000614ba660318361395d565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b7f455243323938313a20496e76616c696420726563656976657200000000000000600082015250565b6000614c1260198361395d565b9150614c1d82614bdc565b602082019050919050565b60006020820190508181036000830152614c4181614c05565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ca460218361395d565b9150614caf82614c48565b604082019050919050565b60006020820190508181036000830152614cd381614c97565b9050919050565b6000604082019050614cef600083018561370a565b614cfc602083018461370a565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d5f60288361395d565b9150614d6a82614d03565b604082019050919050565b60006020820190508181036000830152614d8e81614d52565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614df160258361395d565b9150614dfc82614d95565b604082019050919050565b60006020820190508181036000830152614e2081614de4565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614e83602a8361395d565b9150614e8e82614e27565b604082019050919050565b60006020820190508181036000830152614eb281614e76565b9050919050565b60006040820190508181036000830152614ed38185614002565b90508181036020830152614ee78184614002565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f2660148361395d565b9150614f3182614ef0565b602082019050919050565b60006020820190508181036000830152614f5581614f19565b9050919050565b6000602082019050614f716000830184613b2d565b92915050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b6000614fad601b8361395d565b9150614fb882614f77565b602082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061503f60238361395d565b915061504a82614fe3565b604082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006150d160248361395d565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061513d60108361395d565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006151cf60298361395d565b91506151da82615173565b604082019050919050565b600060208201905081810360008301526151fe816151c2565b9050919050565b600061521082613694565b915060008214156152245761522361457e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061526560208361395d565b91506152708261522f565b602082019050919050565b6000602082019050818103600083015261529481615258565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152c28261529b565b6152cc81856152a6565b93506152dc81856020860161396e565b6152e5816139a1565b840191505092915050565b600060a0820190506153056000830188613b2d565b6153126020830187613b2d565b61531f604083018661370a565b61532c606083018561370a565b818103608083015261533e81846152b7565b90509695505050505050565b60008151905061535981613760565b92915050565b6000602082840312156153755761537461362c565b5b60006153838482850161534a565b91505092915050565b60008160e01c9050919050565b600060033d11156153b85760046000803e6153b560005161538c565b90505b90565b600060443d10156153cb5761544e565b6153d3613622565b60043d036004823e80513d602482011167ffffffffffffffff821117156153fb57505061544e565b808201805167ffffffffffffffff811115615419575050505061544e565b80602083010160043d03850181111561543657505050505061544e565b61544582602001850186613b94565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006154ad60348361395d565b91506154b882615451565b604082019050919050565b600060208201905081810360008301526154dc816154a0565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061553f60288361395d565b915061554a826154e3565b604082019050919050565b6000602082019050818103600083015261556e81615532565b9050919050565b600060a08201905061558a6000830188613b2d565b6155976020830187613b2d565b81810360408301526155a98186614002565b905081810360608301526155bd8185614002565b905081810360808301526155d181846152b7565b90509695505050505050565b60006155e882613694565b91506155f383613694565b9250828210156156065761560561457e565b5b82820390509291505056fea2646970667358221220eba87f7728ea1dad47ee67e54e77522466127b38aa57cf8db22255c0310a6bc264736f6c634300080b003368747470733a2f2f6d6f73687069742e6d7970696e6174612e636c6f75642f697066732f516d556e4c5155784b4a4b7746466254624e514a4e336b714c636b51627770724e705467533176514a71797033642f7b69647d2e6a736f6e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c80636b20c4541161010f578063cb9fcffb116100a2578063e63ab1e911610071578063e63ab1e91461059f578063e985e9c5146105bd578063f242432a146105ed578063f5298aca14610609576101ef565b8063cb9fcffb1461052b578063d539139314610549578063d547741f14610567578063d81d0a1514610583576101ef565b806391d14854116100de57806391d1485414610491578063a217fddf146104c1578063a22cb465146104df578063bd85b039146104fb576101ef565b80636b20c454146104315780637577485b1461044d5780637f345710146104695780638456cb5914610487576101ef565b80632eb2c2d6116101875780634e1273f4116101565780634e1273f4146103975780634f558e79146103c75780635944c753146103f75780635c975abb14610413576101ef565b80632eb2c2d6146103395780632f2ff15d1461035557806336568abe146103715780633f4ba83a1461038d576101ef565b80630e89341c116101c35780630e89341c1461028c578063156e29f6146102bc578063248a9ca3146102d85780632a55205a14610308576101ef565b8062fdd58e146101f457806301ffc9a71461022457806302fe53051461025457806304634d8d14610270575b600080fd5b61020e600480360381019061020991906136ca565b610625565b60405161021b9190613719565b60405180910390f35b61023e6004803603810190610239919061378c565b6106ee565b60405161024b91906137d4565b60405180910390f35b61026e60048036038101906102699190613854565b610768565b005b61028a600480360381019061028591906138e5565b6107ec565b005b6102a660048036038101906102a19190613925565b61082d565b6040516102b391906139eb565b60405180910390f35b6102d660048036038101906102d19190613a0d565b6108c1565b005b6102f260048036038101906102ed9190613a96565b610914565b6040516102ff9190613ad2565b60405180910390f35b610322600480360381019061031d9190613aed565b610934565b604051610330929190613b3c565b60405180910390f35b610353600480360381019061034e9190613d58565b610b1f565b005b61036f600480360381019061036a9190613e27565b610bc0565b005b61038b60048036038101906103869190613e27565b610be9565b005b610395610c6c565b005b6103b160048036038101906103ac9190613f2a565b610ca9565b6040516103be9190614060565b60405180910390f35b6103e160048036038101906103dc9190613925565b610dc2565b6040516103ee91906137d4565b60405180910390f35b610411600480360381019061040c9190614082565b610dd6565b005b61041b610e19565b60405161042891906137d4565b60405180910390f35b61044b600480360381019061044691906140d5565b610e30565b005b6104676004803603810190610462919061420c565b610ecd565b005b61047161100e565b60405161047e9190613ad2565b60405180910390f35b61048f611032565b005b6104ab60048036038101906104a69190613e27565b61106f565b6040516104b891906137d4565b60405180910390f35b6104c96110da565b6040516104d69190613ad2565b60405180910390f35b6104f960048036038101906104f491906142df565b6110e1565b005b61051560048036038101906105109190613925565b6110f7565b6040516105229190613719565b60405180910390f35b610533611114565b6040516105409190613ad2565b60405180910390f35b610551611138565b60405161055e9190613ad2565b60405180910390f35b610581600480360381019061057c9190613e27565b61115c565b005b61059d6004803603810190610598919061431f565b611185565b005b6105a761125c565b6040516105b49190613ad2565b60405180910390f35b6105d760048036038101906105d291906143b4565b611280565b6040516105e491906137d4565b60405180910390f35b610607600480360381019061060291906143f4565b611314565b005b610623600480360381019061061e9190613a0d565b6113b5565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906144fd565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610761575061076082611452565b5b9050919050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61079a816107956114cc565b6114d4565b6107e783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611571565b505050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e61081e816108196114cc565b6114d4565b610828838361158b565b505050565b60606002805461083c9061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546108689061454c565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108f3816108ee6114cc565b6114d4565b61090e84848460405180602001604052806000815250611721565b50505050565b600060056000838152602001908152602001600020600101549050919050565b6000806000600460008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610aca5760036040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ad46118b7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b0091906145ad565b610b0a9190614636565b90508160000151819350935050509250929050565b610b276114cc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b6d5750610b6c85610b676114cc565b611280565b5b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3906146d9565b60405180910390fd5b610bb985858585856118c1565b5050505050565b610bc982610914565b610bda81610bd56114cc565b6114d4565b610be48383611bd5565b505050565b610bf16114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c559061476b565b60405180910390fd5b610c688282611cb6565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c9e81610c996114cc565b6114d4565b610ca6611d98565b50565b60608151835114610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce6906147fd565b60405180910390fd5b6000835167ffffffffffffffff811115610d0c57610d0b613b65565b5b604051908082528060200260200182016040528015610d3a5781602001602082028036833780820191505090505b50905060005b8451811015610db757610d87858281518110610d5f57610d5e61481d565b5b6020026020010151858381518110610d7a57610d7961481d565b5b6020026020010151610625565b828281518110610d9a57610d9961481d565b5b60200260200101818152505080610db09061484c565b9050610d40565b508091505092915050565b600080610dce836110f7565b119050919050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e610e0881610e036114cc565b6114d4565b610e13848484611e3a565b50505050565b6000600660009054906101000a900460ff16905090565b610e386114cc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e7e5750610e7d83610e786114cc565b611280565b5b610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614907565b60405180910390fd5b610ec8838383611fe2565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610eff81610efa6114cc565b6114d4565b848490508787905014610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614999565b60405180910390fd5b600083905060005b888890508110156110035760005b878783818110610f7057610f6f61481d565b5b90506020020135811015610fef57610fc18a8a84818110610f9457610f9361481d565b5b9050602002016020810190610fa991906149b9565b84600160405180602001604052806000815250611721565b600183610fce91906149e6565b925084831115610fdc578592505b8080610fe79061484c565b915050610f5d565b508080610ffb9061484c565b915050610f4f565b505050505050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6110648161105f6114cc565b6114d4565b61106c612293565b50565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b6110f36110ec6114cc565b8383612336565b5050565b600060076000838152602001908152602001600020549050919050565b7feb54e1feee3ae17add098cbf58a47457bf5f7c3a89ceab263cbdb01b3da6d98e81565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61116582610914565b611176816111716114cc565b6114d4565b6111808383611cb6565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111b7816111b26114cc565b6114d4565b61125486868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050604051806020016040528060008152506124a3565b505050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61131c6114cc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061136257506113618561135c6114cc565b611280565b5b6113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890614907565b60405180910390fd5b6113ae85858585856126c1565b5050505050565b6113bd6114cc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806114035750611402836113fd6114cc565b611280565b5b611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614907565b60405180910390fd5b61144d838383612943565b505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114c557506114c482612b60565b5b9050919050565b600033905090565b6114de828261106f565b61156d576115038173ffffffffffffffffffffffffffffffffffffffff166014612bda565b6115118360001c6020612bda565b604051602001611522929190614b10565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156491906139eb565b60405180910390fd5b5050565b806002908051906020019061158792919061357f565b5050565b6115936118b7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614bbc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890614c28565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890614cba565b60405180910390fd5b600061179b6114cc565b90506117bc816000876117ad88612e16565b6117b688612e16565b87612e90565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181b91906149e6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611899929190614cda565b60405180910390a46118b081600087878787612eee565b5050505050565b6000612710905090565b8151835114611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc90614d75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90614e07565b60405180910390fd5b600061197f6114cc565b905061198f818787878787612e90565b60005b8451811015611b405760008582815181106119b0576119af61481d565b5b6020026020010151905060008583815181106119cf576119ce61481d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790614e99565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2591906149e6565b9250508190555050505080611b399061484c565b9050611992565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bb7929190614eb9565b60405180910390a4611bcd8187878787876130c6565b505050505050565b611bdf828261106f565b611cb25760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c576114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611cc0828261106f565b15611d945760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d396114cc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611da0610e19565b611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614f3c565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e236114cc565b604051611e309190614f5c565b60405180910390a1565b611e426118b7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790614bbc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790614fc3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990615055565b60405180910390fd5b8051825114612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614d75565b60405180910390fd5b60006120a06114cc565b90506120c081856000868660405180602001604052806000815250612e90565b60005b835181101561220d5760008482815181106120e1576120e061481d565b5b602002602001015190506000848381518110612100576120ff61481d565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612198906150e7565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122059061484c565b9150506120c3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612285929190614eb9565b60405180910390a450505050565b61229b610e19565b156122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290615153565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861231f6114cc565b60405161232c9190614f5c565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c906151e5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161249691906137d4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614cba565b60405180910390fd5b8151835114612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614d75565b60405180910390fd5b60006125616114cc565b905061257281600087878787612e90565b60005b845181101561262b578381815181106125915761259061481d565b5b60200260200101516000808784815181106125af576125ae61481d565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261191906149e6565b9250508190555080806126239061484c565b915050612575565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126a3929190614eb9565b60405180910390a46126ba816000878787876130c6565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272890614e07565b60405180910390fd5b600061273b6114cc565b905061275b81878761274c88612e16565b61275588612e16565b87612e90565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614e99565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a791906149e6565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612924929190614cda565b60405180910390a461293a828888888888612eee565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90615055565b60405180910390fd5b60006129bd6114cc565b90506129ed818560006129cf87612e16565b6129d887612e16565b60405180602001604052806000815250612e90565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906150e7565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612b51929190614cda565b60405180910390a45050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bd35750612bd28261329e565b5b9050919050565b606060006002836002612bed91906145ad565b612bf791906149e6565b67ffffffffffffffff811115612c1057612c0f613b65565b5b6040519080825280601f01601f191660200182016040528015612c425781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c7a57612c7961481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612cde57612cdd61481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d1e91906145ad565b612d2891906149e6565b90505b6001811115612dc8577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612d6a57612d6961481d565b5b1a60f81b828281518110612d8157612d8061481d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612dc190615205565b9050612d2b565b5060008414612e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e039061527b565b60405180910390fd5b8091505092915050565b60606000600167ffffffffffffffff811115612e3557612e34613b65565b5b604051908082528060200260200182016040528015612e635781602001602082028036833780820191505090505b5090508281600081518110612e7b57612e7a61481d565b5b60200260200101818152505080915050919050565b612e98610e19565b15612ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecf90615153565b60405180910390fd5b612ee6868686868686613380565b505050505050565b612f0d8473ffffffffffffffffffffffffffffffffffffffff166134fa565b156130be578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612f539594939291906152f0565b6020604051808303816000875af1925050508015612f8f57506040513d601f19601f82011682018060405250810190612f8c919061535f565b60015b61303557612f9b615399565b806308c379a01415612ff85750612fb06153bb565b80612fbb5750612ffa565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fef91906139eb565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302c906154c3565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b390615555565b60405180910390fd5b505b505050505050565b6130e58473ffffffffffffffffffffffffffffffffffffffff166134fa565b15613296578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161312b959493929190615575565b6020604051808303816000875af192505050801561316757506040513d601f19601f82011682018060405250810190613164919061535f565b60015b61320d57613173615399565b806308c379a014156131d057506131886153bb565b8061319357506131d2565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c791906139eb565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613204906154c3565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328b90615555565b60405180910390fd5b505b505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061336957507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061337957506133788261350d565b5b9050919050565b61338e868686868686613577565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134405760005b835181101561343e578281815181106133e2576133e161481d565b5b6020026020010151600760008684815181106134015761340061481d565b5b60200260200101518152602001908152602001600020600082825461342691906149e6565b92505081905550806134379061484c565b90506133c6565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134f25760005b83518110156134f0578281815181106134945761349361481d565b5b6020026020010151600760008684815181106134b3576134b261481d565b5b6020026020010151815260200190815260200160002060008282546134d891906155dd565b92505081905550806134e99061484c565b9050613478565b505b505050505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b82805461358b9061454c565b90600052602060002090601f0160209004810192826135ad57600085556135f4565b82601f106135c657805160ff19168380011785556135f4565b828001600101855582156135f4579182015b828111156135f35782518255916020019190600101906135d8565b5b5090506136019190613605565b5090565b5b8082111561361e576000816000905550600101613606565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366182613636565b9050919050565b61367181613656565b811461367c57600080fd5b50565b60008135905061368e81613668565b92915050565b6000819050919050565b6136a781613694565b81146136b257600080fd5b50565b6000813590506136c48161369e565b92915050565b600080604083850312156136e1576136e061362c565b5b60006136ef8582860161367f565b9250506020613700858286016136b5565b9150509250929050565b61371381613694565b82525050565b600060208201905061372e600083018461370a565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61376981613734565b811461377457600080fd5b50565b60008135905061378681613760565b92915050565b6000602082840312156137a2576137a161362c565b5b60006137b084828501613777565b91505092915050565b60008115159050919050565b6137ce816137b9565b82525050565b60006020820190506137e960008301846137c5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613814576138136137ef565b5b8235905067ffffffffffffffff811115613831576138306137f4565b5b60208301915083600182028301111561384d5761384c6137f9565b5b9250929050565b6000806020838503121561386b5761386a61362c565b5b600083013567ffffffffffffffff81111561388957613888613631565b5b613895858286016137fe565b92509250509250929050565b60006bffffffffffffffffffffffff82169050919050565b6138c2816138a1565b81146138cd57600080fd5b50565b6000813590506138df816138b9565b92915050565b600080604083850312156138fc576138fb61362c565b5b600061390a8582860161367f565b925050602061391b858286016138d0565b9150509250929050565b60006020828403121561393b5761393a61362c565b5b6000613949848285016136b5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561398c578082015181840152602081019050613971565b8381111561399b576000848401525b50505050565b6000601f19601f8301169050919050565b60006139bd82613952565b6139c7818561395d565b93506139d781856020860161396e565b6139e0816139a1565b840191505092915050565b60006020820190508181036000830152613a0581846139b2565b905092915050565b600080600060608486031215613a2657613a2561362c565b5b6000613a348682870161367f565b9350506020613a45868287016136b5565b9250506040613a56868287016136b5565b9150509250925092565b6000819050919050565b613a7381613a60565b8114613a7e57600080fd5b50565b600081359050613a9081613a6a565b92915050565b600060208284031215613aac57613aab61362c565b5b6000613aba84828501613a81565b91505092915050565b613acc81613a60565b82525050565b6000602082019050613ae76000830184613ac3565b92915050565b60008060408385031215613b0457613b0361362c565b5b6000613b12858286016136b5565b9250506020613b23858286016136b5565b9150509250929050565b613b3681613656565b82525050565b6000604082019050613b516000830185613b2d565b613b5e602083018461370a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b9d826139a1565b810181811067ffffffffffffffff82111715613bbc57613bbb613b65565b5b80604052505050565b6000613bcf613622565b9050613bdb8282613b94565b919050565b600067ffffffffffffffff821115613bfb57613bfa613b65565b5b602082029050602081019050919050565b6000613c1f613c1a84613be0565b613bc5565b90508083825260208201905060208402830185811115613c4257613c416137f9565b5b835b81811015613c6b5780613c5788826136b5565b845260208401935050602081019050613c44565b5050509392505050565b600082601f830112613c8a57613c896137ef565b5b8135613c9a848260208601613c0c565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cc357613cc2613b65565b5b613ccc826139a1565b9050602081019050919050565b82818337600083830152505050565b6000613cfb613cf684613ca8565b613bc5565b905082815260208101848484011115613d1757613d16613ca3565b5b613d22848285613cd9565b509392505050565b600082601f830112613d3f57613d3e6137ef565b5b8135613d4f848260208601613ce8565b91505092915050565b600080600080600060a08688031215613d7457613d7361362c565b5b6000613d828882890161367f565b9550506020613d938882890161367f565b945050604086013567ffffffffffffffff811115613db457613db3613631565b5b613dc088828901613c75565b935050606086013567ffffffffffffffff811115613de157613de0613631565b5b613ded88828901613c75565b925050608086013567ffffffffffffffff811115613e0e57613e0d613631565b5b613e1a88828901613d2a565b9150509295509295909350565b60008060408385031215613e3e57613e3d61362c565b5b6000613e4c85828601613a81565b9250506020613e5d8582860161367f565b9150509250929050565b600067ffffffffffffffff821115613e8257613e81613b65565b5b602082029050602081019050919050565b6000613ea6613ea184613e67565b613bc5565b90508083825260208201905060208402830185811115613ec957613ec86137f9565b5b835b81811015613ef25780613ede888261367f565b845260208401935050602081019050613ecb565b5050509392505050565b600082601f830112613f1157613f106137ef565b5b8135613f21848260208601613e93565b91505092915050565b60008060408385031215613f4157613f4061362c565b5b600083013567ffffffffffffffff811115613f5f57613f5e613631565b5b613f6b85828601613efc565b925050602083013567ffffffffffffffff811115613f8c57613f8b613631565b5b613f9885828601613c75565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd781613694565b82525050565b6000613fe98383613fce565b60208301905092915050565b6000602082019050919050565b600061400d82613fa2565b6140178185613fad565b935061402283613fbe565b8060005b8381101561405357815161403a8882613fdd565b975061404583613ff5565b925050600181019050614026565b5085935050505092915050565b6000602082019050818103600083015261407a8184614002565b905092915050565b60008060006060848603121561409b5761409a61362c565b5b60006140a9868287016136b5565b93505060206140ba8682870161367f565b92505060406140cb868287016138d0565b9150509250925092565b6000806000606084860312156140ee576140ed61362c565b5b60006140fc8682870161367f565b935050602084013567ffffffffffffffff81111561411d5761411c613631565b5b61412986828701613c75565b925050604084013567ffffffffffffffff81111561414a57614149613631565b5b61415686828701613c75565b9150509250925092565b60008083601f840112614176576141756137ef565b5b8235905067ffffffffffffffff811115614193576141926137f4565b5b6020830191508360208202830111156141af576141ae6137f9565b5b9250929050565b60008083601f8401126141cc576141cb6137ef565b5b8235905067ffffffffffffffff8111156141e9576141e86137f4565b5b602083019150836020820283011115614205576142046137f9565b5b9250929050565b600080600080600080608087890312156142295761422861362c565b5b600087013567ffffffffffffffff81111561424757614246613631565b5b61425389828a01614160565b9650965050602087013567ffffffffffffffff81111561427657614275613631565b5b61428289828a016141b6565b9450945050604061429589828a016136b5565b92505060606142a689828a016136b5565b9150509295509295509295565b6142bc816137b9565b81146142c757600080fd5b50565b6000813590506142d9816142b3565b92915050565b600080604083850312156142f6576142f561362c565b5b60006143048582860161367f565b9250506020614315858286016142ca565b9150509250929050565b60008060008060006060868803121561433b5761433a61362c565b5b60006143498882890161367f565b955050602086013567ffffffffffffffff81111561436a57614369613631565b5b614376888289016141b6565b9450945050604086013567ffffffffffffffff81111561439957614398613631565b5b6143a5888289016141b6565b92509250509295509295909350565b600080604083850312156143cb576143ca61362c565b5b60006143d98582860161367f565b92505060206143ea8582860161367f565b9150509250929050565b600080600080600060a086880312156144105761440f61362c565b5b600061441e8882890161367f565b955050602061442f8882890161367f565b9450506040614440888289016136b5565b9350506060614451888289016136b5565b925050608086013567ffffffffffffffff81111561447257614471613631565b5b61447e88828901613d2a565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006144e7602b8361395d565b91506144f28261448b565b604082019050919050565b60006020820190508181036000830152614516816144da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061456457607f821691505b602082108114156145785761457761451d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145b882613694565b91506145c383613694565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145fc576145fb61457e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061464182613694565b915061464c83613694565b92508261465c5761465b614607565b5b828204905092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006146c360328361395d565b91506146ce82614667565b604082019050919050565b600060208201905081810360008301526146f2816146b6565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614755602f8361395d565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006147e760298361395d565b91506147f28261478b565b604082019050919050565b60006020820190508181036000830152614816816147da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061485782613694565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561488a5761488961457e565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006148f160298361395d565b91506148fc82614895565b604082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b7f41697264726f703a2061646472657373657320616e6420616d6f756e7473206c60008201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b6000614983602e8361395d565b915061498e82614927565b604082019050919050565b600060208201905081810360008301526149b281614976565b9050919050565b6000602082840312156149cf576149ce61362c565b5b60006149dd8482850161367f565b91505092915050565b60006149f182613694565b91506149fc83613694565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3157614a3061457e565b5b828201905092915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a7d601783614a3c565b9150614a8882614a47565b601782019050919050565b6000614a9e82613952565b614aa88185614a3c565b9350614ab881856020860161396e565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614afa601183614a3c565b9150614b0582614ac4565b601182019050919050565b6000614b1b82614a70565b9150614b278285614a93565b9150614b3282614aed565b9150614b3e8284614a93565b91508190509392505050565b7f455243323938313a20526f79616c74792070657263656e746167652077696c6c60008201527f206578636565642073616c655072696365000000000000000000000000000000602082015250565b6000614ba660318361395d565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b7f455243323938313a20496e76616c696420726563656976657200000000000000600082015250565b6000614c1260198361395d565b9150614c1d82614bdc565b602082019050919050565b60006020820190508181036000830152614c4181614c05565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ca460218361395d565b9150614caf82614c48565b604082019050919050565b60006020820190508181036000830152614cd381614c97565b9050919050565b6000604082019050614cef600083018561370a565b614cfc602083018461370a565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614d5f60288361395d565b9150614d6a82614d03565b604082019050919050565b60006020820190508181036000830152614d8e81614d52565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614df160258361395d565b9150614dfc82614d95565b604082019050919050565b60006020820190508181036000830152614e2081614de4565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614e83602a8361395d565b9150614e8e82614e27565b604082019050919050565b60006020820190508181036000830152614eb281614e76565b9050919050565b60006040820190508181036000830152614ed38185614002565b90508181036020830152614ee78184614002565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614f2660148361395d565b9150614f3182614ef0565b602082019050919050565b60006020820190508181036000830152614f5581614f19565b9050919050565b6000602082019050614f716000830184613b2d565b92915050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b6000614fad601b8361395d565b9150614fb882614f77565b602082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061503f60238361395d565b915061504a82614fe3565b604082019050919050565b6000602082019050818103600083015261506e81615032565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006150d160248361395d565b91506150dc82615075565b604082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061513d60108361395d565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006151cf60298361395d565b91506151da82615173565b604082019050919050565b600060208201905081810360008301526151fe816151c2565b9050919050565b600061521082613694565b915060008214156152245761522361457e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061526560208361395d565b91506152708261522f565b602082019050919050565b6000602082019050818103600083015261529481615258565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152c28261529b565b6152cc81856152a6565b93506152dc81856020860161396e565b6152e5816139a1565b840191505092915050565b600060a0820190506153056000830188613b2d565b6153126020830187613b2d565b61531f604083018661370a565b61532c606083018561370a565b818103608083015261533e81846152b7565b90509695505050505050565b60008151905061535981613760565b92915050565b6000602082840312156153755761537461362c565b5b60006153838482850161534a565b91505092915050565b60008160e01c9050919050565b600060033d11156153b85760046000803e6153b560005161538c565b90505b90565b600060443d10156153cb5761544e565b6153d3613622565b60043d036004823e80513d602482011167ffffffffffffffff821117156153fb57505061544e565b808201805167ffffffffffffffff811115615419575050505061544e565b80602083010160043d03850181111561543657505050505061544e565b61544582602001850186613b94565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006154ad60348361395d565b91506154b882615451565b604082019050919050565b600060208201905081810360008301526154dc816154a0565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061553f60288361395d565b915061554a826154e3565b604082019050919050565b6000602082019050818103600083015261556e81615532565b9050919050565b600060a08201905061558a6000830188613b2d565b6155976020830187613b2d565b81810360408301526155a98186614002565b905081810360608301526155bd8185614002565b905081810360808301526155d181846152b7565b90509695505050505050565b60006155e882613694565b91506155f383613694565b9250828210156156065761560561457e565b5b82820390509291505056fea2646970667358221220eba87f7728ea1dad47ee67e54e77522466127b38aa57cf8db22255c0310a6bc264736f6c634300080b0033
Deployed Bytecode Sourcemap
57349:4113:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40847:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61193:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59389:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59230:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40591:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59672:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27839:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22577:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42786:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28224:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29272:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59587:77;;;:::i;:::-;;41244:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55286:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59015:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7457:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56905:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60038:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57462:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59506:73;;;:::i;:::-;;26724:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25815:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41841:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55075:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57677:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57608:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28616:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59842:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57539:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42068:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42308:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56576:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40847:231;40933:7;40980:1;40961:21;;:7;:21;;;;40953:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:9;:13;41058:2;41048:13;;;;;;;;;;;:22;41062:7;41048:22;;;;;;;;;;;;;;;;41041:29;;40847:231;;;;:::o;61193:264::-;61339:4;61383:26;61368:41;;;:11;:41;;;;:81;;;;61413:36;61437:11;61413:23;:36::i;:::-;61368:81;61361:88;;61193:264;;;:::o;59389:109::-;57504:28;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59475:15:::1;59483:6;;59475:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:15::i;:::-;59389:109:::0;;;:::o;59230:151::-;57716:25;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59335:38:::1;59354:8;59364;59335:18;:38::i;:::-;59230:151:::0;;;:::o;40591:105::-;40651:13;40684:4;40677:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40591:105;;;:::o;59672:162::-;57646:24;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59796::::1;59802:7;59811:2;59815:6;59796:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;59672:162:::0;;;;:::o;27839:123::-;27905:7;27932:6;:12;27939:4;27932:12;;;;;;;;;;;:22;;;27925:29;;27839:123;;;:::o;22577:436::-;22668:7;22677;22697:26;22726:17;:27;22744:8;22726:27;;;;;;;;;;;22697:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22798:1;22770:30;;:7;:16;;;:30;;;22766:92;;;22827:19;22817:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22766:92;22870:21;22935:17;:15;:17::i;:::-;22894:58;;22908:7;:23;;;22895:36;;:10;:36;;;;:::i;:::-;22894:58;;;;:::i;:::-;22870:82;;22973:7;:16;;;22991:13;22965:40;;;;;;22577:436;;;;;:::o;42786:442::-;43027:12;:10;:12::i;:::-;43019:20;;:4;:20;;;:60;;;;43043:36;43060:4;43066:12;:10;:12::i;:::-;43043:16;:36::i;:::-;43019:60;42997:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;43168:52;43191:4;43197:2;43201:3;43206:7;43215:4;43168:22;:52::i;:::-;42786:442;;;;;:::o;28224:147::-;28307:18;28320:4;28307:12;:18::i;:::-;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;28338:25:::1;28349:4;28355:7;28338:10;:25::i;:::-;28224:147:::0;;;:::o;29272:218::-;29379:12;:10;:12::i;:::-;29368:23;;:7;:23;;;29360:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;29456:26;29468:4;29474:7;29456:11;:26::i;:::-;29272:218;;:::o;59587:77::-;57577:24;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59646:10:::1;:8;:10::i;:::-;59587:77:::0;:::o;41244:524::-;41400:16;41461:3;:10;41442:8;:15;:29;41434:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41530:30;41577:8;:15;41563:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41530:63;;41611:9;41606:122;41630:8;:15;41626:1;:19;41606:122;;;41686:30;41696:8;41705:1;41696:11;;;;;;;;:::i;:::-;;;;;;;;41709:3;41713:1;41709:6;;;;;;;;:::i;:::-;;;;;;;;41686:9;:30::i;:::-;41667:13;41681:1;41667:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;41647:3;;;;:::i;:::-;;;41606:122;;;;41747:13;41740:20;;;41244:524;;;;:::o;55286:122::-;55343:4;55399:1;55367:29;55393:2;55367:25;:29::i;:::-;:33;55360:40;;55286:122;;;:::o;59015:207::-;57716:25;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59169:45:::1;59186:7;59195:8;59205;59169:16;:45::i;:::-;59015:207:::0;;;;:::o;7457:86::-;7504:4;7528:7;;;;;;;;;;;7521:14;;7457:86;:::o;56905:353::-;57081:12;:10;:12::i;:::-;57070:23;;:7;:23;;;:66;;;;57097:39;57114:7;57123:12;:10;:12::i;:::-;57097:16;:39::i;:::-;57070:66;57048:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;57218:32;57229:7;57238:3;57243:6;57218:10;:32::i;:::-;56905:353;;;:::o;60038:691::-;57646:24;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;60276:7:::1;;:14;;60255:10;;:17;;:35;60247:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;60352:15;60370:12;60352:30;;60398:9;60393:329;60417:10;;:17;;60413:1;:21;60393:329;;;60461:10;60456:255;60482:7;;60490:1;60482:10;;;;;;;:::i;:::-;;;;;;;;60477:2;:15;60456:255;;;60519:36;60525:10;;60536:1;60525:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;60540:7;60549:1;60519:36;;;;;;;;;;;::::0;:5:::1;:36::i;:::-;60585:1;60574:12;;;;;:::i;:::-;;;60619:10;60609:7;:20;60605:91;;;60664:12;60654:22;;60605:91;60494:4;;;;;:::i;:::-;;;;60456:255;;;;60436:3;;;;;:::i;:::-;;;;60393:329;;;;60236:493;60038:691:::0;;;;;;;:::o;57462:70::-;57504:28;57462:70;:::o;59506:73::-;57577:24;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59563:8:::1;:6;:8::i;:::-;59506:73:::0;:::o;26724:139::-;26802:4;26826:6;:12;26833:4;26826:12;;;;;;;;;;;:20;;:29;26847:7;26826:29;;;;;;;;;;;;;;;;;;;;;;;;;26819:36;;26724:139;;;;:::o;25815:49::-;25860:4;25815:49;;;:::o;41841:155::-;41936:52;41955:12;:10;:12::i;:::-;41969:8;41979;41936:18;:52::i;:::-;41841:155;;:::o;55075:113::-;55137:7;55164:12;:16;55177:2;55164:16;;;;;;;;;;;;55157:23;;55075:113;;;:::o;57677:64::-;57716:25;57677:64;:::o;57608:62::-;57646:24;57608:62;:::o;28616:149::-;28700:18;28713:4;28700:12;:18::i;:::-;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;28731:26:::1;28743:4;28749:7;28731:11;:26::i;:::-;28616:149:::0;;;:::o;59842:188::-;57646:24;26306:30;26317:4;26323:12;:10;:12::i;:::-;26306:10;:30::i;:::-;59990:32:::1;60001:2;60005:3;;59990:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60010:7;;59990:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;59842:188:::0;;;;;;:::o;57539:62::-;57577:24;57539:62;:::o;42068:168::-;42167:4;42191:18;:27;42210:7;42191:27;;;;;;;;;;;;;;;:37;42219:8;42191:37;;;;;;;;;;;;;;;;;;;;;;;;;42184:44;;42068:168;;;;:::o;42308:401::-;42524:12;:10;:12::i;:::-;42516:20;;:4;:20;;;:60;;;;42540:36;42557:4;42563:12;:10;:12::i;:::-;42540:16;:36::i;:::-;42516:60;42494:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;42656:45;42674:4;42680:2;42684;42688:6;42696:4;42656:17;:45::i;:::-;42308:401;;;;;:::o;56576:321::-;56727:12;:10;:12::i;:::-;56716:23;;:7;:23;;;:66;;;;56743:39;56760:7;56769:12;:10;:12::i;:::-;56743:16;:39::i;:::-;56716:66;56694:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;56864:25;56870:7;56879:2;56883:5;56864;:25::i;:::-;56576:321;;;:::o;26428:204::-;26513:4;26552:32;26537:47;;;:11;:47;;;;:87;;;;26588:36;26612:11;26588:23;:36::i;:::-;26537:87;26530:94;;26428:204;;;:::o;6111:98::-;6164:7;6191:10;6184:17;;6111:98;:::o;27153:497::-;27234:22;27242:4;27248:7;27234;:22::i;:::-;27229:414;;27422:41;27450:7;27422:41;;27460:2;27422:19;:41::i;:::-;27536:38;27564:4;27556:13;;27571:2;27536:19;:38::i;:::-;27327:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27273:358;;;;;;;;;;;:::i;:::-;;;;;;;;27229:414;27153:497;;:::o;46788:88::-;46862:6;46855:4;:13;;;;;;;;;;;;:::i;:::-;;46788:88;:::o;22184:327::-;22295:17;:15;:17::i;:::-;22283:29;;:8;:29;;;;22275:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;22405:1;22385:22;;:8;:22;;;;22377:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22472:31;;;;;;;;22484:8;22472:31;;;;;;22494:8;22472:31;;;;;22450:19;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22184:327;;:::o;47262:569::-;47429:1;47415:16;;:2;:16;;;;47407:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47482:16;47501:12;:10;:12::i;:::-;47482:31;;47526:102;47547:8;47565:1;47569:2;47573:21;47591:2;47573:17;:21::i;:::-;47596:25;47614:6;47596:17;:25::i;:::-;47623:4;47526:20;:102::i;:::-;47662:6;47641:9;:13;47651:2;47641:13;;;;;;;;;;;:17;47655:2;47641:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;47721:2;47684:52;;47717:1;47684:52;;47699:8;47684:52;;;47725:2;47729:6;47684:52;;;;;;;:::i;:::-;;;;;;;;47749:74;47780:8;47798:1;47802:2;47806;47810:6;47818:4;47749:30;:74::i;:::-;47396:435;47262:569;;;;:::o;23182:97::-;23240:6;23266:5;23259:12;;23182:97;:::o;44870:1074::-;45097:7;:14;45083:3;:10;:28;45075:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45189:1;45175:16;;:2;:16;;;;45167:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45246:16;45265:12;:10;:12::i;:::-;45246:31;;45290:60;45311:8;45321:4;45327:2;45331:3;45336:7;45345:4;45290:20;:60::i;:::-;45368:9;45363:421;45387:3;:10;45383:1;:14;45363:421;;;45419:10;45432:3;45436:1;45432:6;;;;;;;;:::i;:::-;;;;;;;;45419:19;;45453:14;45470:7;45478:1;45470:10;;;;;;;;:::i;:::-;;;;;;;;45453:27;;45497:19;45519:9;:13;45529:2;45519:13;;;;;;;;;;;:19;45533:4;45519:19;;;;;;;;;;;;;;;;45497:41;;45576:6;45561:11;:21;;45553:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45709:6;45695:11;:20;45673:9;:13;45683:2;45673:13;;;;;;;;;;;:19;45687:4;45673:19;;;;;;;;;;;;;;;:42;;;;45766:6;45745:9;:13;45755:2;45745:13;;;;;;;;;;;:17;45759:2;45745:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45404:380;;;45399:3;;;;:::i;:::-;;;45363:421;;;;45831:2;45801:47;;45825:4;45801:47;;45815:8;45801:47;;;45835:3;45840:7;45801:47;;;;;;;:::i;:::-;;;;;;;;45861:75;45897:8;45907:4;45913:2;45917:3;45922:7;45931:4;45861:35;:75::i;:::-;45064:880;44870:1074;;;;;:::o;30773:238::-;30857:22;30865:4;30871:7;30857;:22::i;:::-;30852:152;;30928:4;30896:6;:12;30903:4;30896:12;;;;;;;;;;;:20;;:29;30917:7;30896:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;30979:12;:10;:12::i;:::-;30952:40;;30970:7;30952:40;;30964:4;30952:40;;;;;;;;;;30852:152;30773:238;;:::o;31143:239::-;31227:22;31235:4;31241:7;31227;:22::i;:::-;31223:152;;;31298:5;31266:6;:12;31273:4;31266:12;;;;;;;;;;;:20;;:29;31287:7;31266:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31350:12;:10;:12::i;:::-;31323:40;;31341:7;31323:40;;31335:4;31323:40;;;;;;;;;;31223:152;31143:239;;:::o;8516:120::-;8060:8;:6;:8::i;:::-;8052:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;8585:5:::1;8575:7;;:15;;;;;;;;;;;;;;;;;;8606:22;8615:12;:10;:12::i;:::-;8606:22;;;;;;:::i;:::-;;;;;;;;8516:120::o:0;21486:385::-;21646:17;:15;:17::i;:::-;21634:29;;:8;:29;;;;21626:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;21756:1;21736:22;;:8;:22;;;;21728:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;21832:31;;;;;;;;21844:8;21832:31;;;;;;21854:8;21832:31;;;;;21803:17;:26;21821:7;21803:26;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21486:385;;;:::o;50023:891::-;50191:1;50175:18;;:4;:18;;;;50167:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50266:7;:14;50252:3;:10;:28;50244:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50338:16;50357:12;:10;:12::i;:::-;50338:31;;50382:66;50403:8;50413:4;50427:1;50431:3;50436:7;50382:66;;;;;;;;;;;;:20;:66::i;:::-;50466:9;50461:373;50485:3;:10;50481:1;:14;50461:373;;;50517:10;50530:3;50534:1;50530:6;;;;;;;;:::i;:::-;;;;;;;;50517:19;;50551:14;50568:7;50576:1;50568:10;;;;;;;;:::i;:::-;;;;;;;;50551:27;;50595:19;50617:9;:13;50627:2;50617:13;;;;;;;;;;;:19;50631:4;50617:19;;;;;;;;;;;;;;;;50595:41;;50674:6;50659:11;:21;;50651:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50801:6;50787:11;:20;50765:9;:13;50775:2;50765:13;;;;;;;;;;;:19;50779:4;50765:19;;;;;;;;;;;;;;;:42;;;;50502:332;;;50497:3;;;;;:::i;:::-;;;;50461:373;;;;50889:1;50851:55;;50875:4;50851:55;;50865:8;50851:55;;;50893:3;50898:7;50851:55;;;;;;;:::i;:::-;;;;;;;;50156:758;50023:891;;;:::o;8257:118::-;7783:8;:6;:8::i;:::-;7782:9;7774:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8327:4:::1;8317:7;;:14;;;;;;;;;;;;;;;;;;8347:20;8354:12;:10;:12::i;:::-;8347:20;;;;;;:::i;:::-;;;;;;;;8257:118::o:0;51056:331::-;51211:8;51202:17;;:5;:17;;;;51194:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51314:8;51276:18;:25;51295:5;51276:25;;;;;;;;;;;;;;;:35;51302:8;51276:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51360:8;51338:41;;51353:5;51338:41;;;51370:8;51338:41;;;;;;:::i;:::-;;;;;;;;51056:331;;;:::o;48187:735::-;48379:1;48365:16;;:2;:16;;;;48357:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48452:7;:14;48438:3;:10;:28;48430:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48524:16;48543:12;:10;:12::i;:::-;48524:31;;48568:66;48589:8;48607:1;48611:2;48615:3;48620:7;48629:4;48568:20;:66::i;:::-;48652:9;48647:103;48671:3;:10;48667:1;:14;48647:103;;;48728:7;48736:1;48728:10;;;;;;;;:::i;:::-;;;;;;;;48703:9;:17;48713:3;48717:1;48713:6;;;;;;;;:::i;:::-;;;;;;;;48703:17;;;;;;;;;;;:21;48721:2;48703:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;48683:3;;;;;:::i;:::-;;;;48647:103;;;;48803:2;48767:53;;48799:1;48767:53;;48781:8;48767:53;;;48807:3;48812:7;48767:53;;;;;;;:::i;:::-;;;;;;;;48833:81;48869:8;48887:1;48891:2;48895:3;48900:7;48909:4;48833:35;:81::i;:::-;48346:576;48187:735;;;;:::o;43692:820::-;43894:1;43880:16;;:2;:16;;;;43872:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43951:16;43970:12;:10;:12::i;:::-;43951:31;;43995:96;44016:8;44026:4;44032:2;44036:21;44054:2;44036:17;:21::i;:::-;44059:25;44077:6;44059:17;:25::i;:::-;44086:4;43995:20;:96::i;:::-;44104:19;44126:9;:13;44136:2;44126:13;;;;;;;;;;;:19;44140:4;44126:19;;;;;;;;;;;;;;;;44104:41;;44179:6;44164:11;:21;;44156:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44304:6;44290:11;:20;44268:9;:13;44278:2;44268:13;;;;;;;;;;;:19;44282:4;44268:19;;;;;;;;;;;;;;;:42;;;;44353:6;44332:9;:13;44342:2;44332:13;;;;;;;;;;;:17;44346:2;44332:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44408:2;44377:46;;44402:4;44377:46;;44392:8;44377:46;;;44412:2;44416:6;44377:46;;;;;;;:::i;:::-;;;;;;;;44436:68;44467:8;44477:4;44483:2;44487;44491:6;44499:4;44436:30;:68::i;:::-;43861:651;;43692:820;;;;;:::o;49172:648::-;49315:1;49299:18;;:4;:18;;;;49291:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49370:16;49389:12;:10;:12::i;:::-;49370:31;;49414:102;49435:8;49445:4;49459:1;49463:21;49481:2;49463:17;:21::i;:::-;49486:25;49504:6;49486:17;:25::i;:::-;49414:102;;;;;;;;;;;;:20;:102::i;:::-;49529:19;49551:9;:13;49561:2;49551:13;;;;;;;;;;;:19;49565:4;49551:19;;;;;;;;;;;;;;;;49529:41;;49604:6;49589:11;:21;;49581:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49723:6;49709:11;:20;49687:9;:13;49697:2;49687:13;;;;;;;;;;;:19;49701:4;49687:19;;;;;;;;;;;;;;;:42;;;;49797:1;49758:54;;49783:4;49758:54;;49773:8;49758:54;;;49801:2;49805:6;49758:54;;;;;;;:::i;:::-;;;;;;;;49280:540;;49172:648;;;:::o;20947:215::-;21049:4;21088:26;21073:41;;;:11;:41;;;;:81;;;;21118:36;21142:11;21118:23;:36::i;:::-;21073:81;21066:88;;20947:215;;;:::o;1933:451::-;2008:13;2034:19;2079:1;2070:6;2066:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2056:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2034:47;;2092:15;:6;2099:1;2092:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2118;:6;2125:1;2118:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;2149:9;2174:1;2165:6;2161:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2149:26;;2144:135;2181:1;2177;:5;2144:135;;;2216:12;2237:3;2229:5;:11;2216:25;;;;;;;:::i;:::-;;;;;2204:6;2211:1;2204:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;2266:1;2256:11;;;;;2184:3;;;;:::i;:::-;;;2144:135;;;;2306:1;2297:5;:10;2289:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2369:6;2355:21;;;1933:451;;;;:::o;54145:198::-;54211:16;54240:22;54279:1;54265:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54240:41;;54303:7;54292:5;54298:1;54292:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;54330:5;54323:12;;;54145:198;;;:::o;60807:314::-;7783:8;:6;:8::i;:::-;7782:9;7774:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;61047:66:::1;61074:8;61084:4;61090:2;61094:3;61099:7;61108:4;61047:26;:66::i;:::-;60807:314:::0;;;;;;:::o;52572:744::-;52787:15;:2;:13;;;:15::i;:::-;52783:526;;;52840:2;52823:38;;;52862:8;52872:4;52878:2;52882:6;52890:4;52823:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52819:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;53171:6;53164:14;;;;;;;;;;;:::i;:::-;;;;;;;;52819:479;;;53220:62;;;;;;;;;;:::i;:::-;;;;;;;;52819:479;52957:43;;;52945:55;;;:8;:55;;;;52941:154;;53025:50;;;;;;;;;;:::i;:::-;;;;;;;;52941:154;52896:214;52783:526;52572:744;;;;;;:::o;53324:813::-;53564:15;:2;:13;;;:15::i;:::-;53560:570;;;53617:2;53600:43;;;53644:8;53654:4;53660:3;53665:7;53674:4;53600:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53596:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;53992:6;53985:14;;;;;;;;;;;:::i;:::-;;;;;;;;53596:523;;;54041:62;;;;;;;;;;:::i;:::-;;;;;;;;53596:523;53773:48;;;53761:60;;;:8;:60;;;;53757:159;;53846:50;;;;;;;;;;:::i;:::-;;;;;;;;53757:159;53680:251;53560:570;53324:813;;;;;;:::o;39870:310::-;39972:4;40024:26;40009:41;;;:11;:41;;;;:110;;;;40082:37;40067:52;;;:11;:52;;;;40009:110;:163;;;;40136:36;40160:11;40136:23;:36::i;:::-;40009:163;39989:183;;39870:310;;;:::o;55483:655::-;55722:66;55749:8;55759:4;55765:2;55769:3;55774:7;55783:4;55722:26;:66::i;:::-;55821:1;55805:18;;:4;:18;;;55801:160;;;55845:9;55840:110;55864:3;:10;55860:1;:14;55840:110;;;55924:7;55932:1;55924:10;;;;;;;;:::i;:::-;;;;;;;;55900:12;:20;55913:3;55917:1;55913:6;;;;;;;;:::i;:::-;;;;;;;;55900:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;55876:3;;;;:::i;:::-;;;55840:110;;;;55801:160;55991:1;55977:16;;:2;:16;;;55973:158;;;56015:9;56010:110;56034:3;:10;56030:1;:14;56010:110;;;56094:7;56102:1;56094:10;;;;;;;;:::i;:::-;;;;;;;;56070:12;:20;56083:3;56087:1;56083:6;;;;;;;;:::i;:::-;;;;;;;;56070:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;56046:3;;;;:::i;:::-;;;56010:110;;;;55973:158;55483:655;;;;;;:::o;9463:387::-;9523:4;9731:12;9798:7;9786:20;9778:28;;9841:1;9834:4;:8;9827:15;;;9463:387;;;:::o;19781:157::-;19866:4;19905:25;19890:40;;;:11;:40;;;;19883:47;;19781:157;;;:::o;52343:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:117;3568:1;3565;3558:12;3596:553;3654:8;3664:6;3714:3;3707:4;3699:6;3695:17;3691:27;3681:122;;3722:79;;:::i;:::-;3681:122;3835:6;3822:20;3812:30;;3865:18;3857:6;3854:30;3851:117;;;3887:79;;:::i;:::-;3851:117;4001:4;3993:6;3989:17;3977:29;;4055:3;4047:4;4039:6;4035:17;4025:8;4021:32;4018:41;4015:128;;;4062:79;;:::i;:::-;4015:128;3596:553;;;;;:::o;4155:529::-;4226:6;4234;4283:2;4271:9;4262:7;4258:23;4254:32;4251:119;;;4289:79;;:::i;:::-;4251:119;4437:1;4426:9;4422:17;4409:31;4467:18;4459:6;4456:30;4453:117;;;4489:79;;:::i;:::-;4453:117;4602:65;4659:7;4650:6;4639:9;4635:22;4602:65;:::i;:::-;4584:83;;;;4380:297;4155:529;;;;;:::o;4690:109::-;4726:7;4766:26;4759:5;4755:38;4744:49;;4690:109;;;:::o;4805:120::-;4877:23;4894:5;4877:23;:::i;:::-;4870:5;4867:34;4857:62;;4915:1;4912;4905:12;4857:62;4805:120;:::o;4931:137::-;4976:5;5014:6;5001:20;4992:29;;5030:32;5056:5;5030:32;:::i;:::-;4931:137;;;;:::o;5074:472::-;5141:6;5149;5198:2;5186:9;5177:7;5173:23;5169:32;5166:119;;;5204:79;;:::i;:::-;5166:119;5324:1;5349:53;5394:7;5385:6;5374:9;5370:22;5349:53;:::i;:::-;5339:63;;5295:117;5451:2;5477:52;5521:7;5512:6;5501:9;5497:22;5477:52;:::i;:::-;5467:62;;5422:117;5074:472;;;;;:::o;5552:329::-;5611:6;5660:2;5648:9;5639:7;5635:23;5631:32;5628:119;;;5666:79;;:::i;:::-;5628:119;5786:1;5811:53;5856:7;5847:6;5836:9;5832:22;5811:53;:::i;:::-;5801:63;;5757:117;5552:329;;;;:::o;5887:99::-;5939:6;5973:5;5967:12;5957:22;;5887:99;;;:::o;5992:169::-;6076:11;6110:6;6105:3;6098:19;6150:4;6145:3;6141:14;6126:29;;5992:169;;;;:::o;6167:307::-;6235:1;6245:113;6259:6;6256:1;6253:13;6245:113;;;6344:1;6339:3;6335:11;6329:18;6325:1;6320:3;6316:11;6309:39;6281:2;6278:1;6274:10;6269:15;;6245:113;;;6376:6;6373:1;6370:13;6367:101;;;6456:1;6447:6;6442:3;6438:16;6431:27;6367:101;6216:258;6167:307;;;:::o;6480:102::-;6521:6;6572:2;6568:7;6563:2;6556:5;6552:14;6548:28;6538:38;;6480:102;;;:::o;6588:364::-;6676:3;6704:39;6737:5;6704:39;:::i;:::-;6759:71;6823:6;6818:3;6759:71;:::i;:::-;6752:78;;6839:52;6884:6;6879:3;6872:4;6865:5;6861:16;6839:52;:::i;:::-;6916:29;6938:6;6916:29;:::i;:::-;6911:3;6907:39;6900:46;;6680:272;6588:364;;;;:::o;6958:313::-;7071:4;7109:2;7098:9;7094:18;7086:26;;7158:9;7152:4;7148:20;7144:1;7133:9;7129:17;7122:47;7186:78;7259:4;7250:6;7186:78;:::i;:::-;7178:86;;6958:313;;;;:::o;7277:619::-;7354:6;7362;7370;7419:2;7407:9;7398:7;7394:23;7390:32;7387:119;;;7425:79;;:::i;:::-;7387:119;7545:1;7570:53;7615:7;7606:6;7595:9;7591:22;7570:53;:::i;:::-;7560:63;;7516:117;7672:2;7698:53;7743:7;7734:6;7723:9;7719:22;7698:53;:::i;:::-;7688:63;;7643:118;7800:2;7826:53;7871:7;7862:6;7851:9;7847:22;7826:53;:::i;:::-;7816:63;;7771:118;7277:619;;;;;:::o;7902:77::-;7939:7;7968:5;7957:16;;7902:77;;;:::o;7985:122::-;8058:24;8076:5;8058:24;:::i;:::-;8051:5;8048:35;8038:63;;8097:1;8094;8087:12;8038:63;7985:122;:::o;8113:139::-;8159:5;8197:6;8184:20;8175:29;;8213:33;8240:5;8213:33;:::i;:::-;8113:139;;;;:::o;8258:329::-;8317:6;8366:2;8354:9;8345:7;8341:23;8337:32;8334:119;;;8372:79;;:::i;:::-;8334:119;8492:1;8517:53;8562:7;8553:6;8542:9;8538:22;8517:53;:::i;:::-;8507:63;;8463:117;8258:329;;;;:::o;8593:118::-;8680:24;8698:5;8680:24;:::i;:::-;8675:3;8668:37;8593:118;;:::o;8717:222::-;8810:4;8848:2;8837:9;8833:18;8825:26;;8861:71;8929:1;8918:9;8914:17;8905:6;8861:71;:::i;:::-;8717:222;;;;:::o;8945:474::-;9013:6;9021;9070:2;9058:9;9049:7;9045:23;9041:32;9038:119;;;9076:79;;:::i;:::-;9038:119;9196:1;9221:53;9266:7;9257:6;9246:9;9242:22;9221:53;:::i;:::-;9211:63;;9167:117;9323:2;9349:53;9394:7;9385:6;9374:9;9370:22;9349:53;:::i;:::-;9339:63;;9294:118;8945:474;;;;;:::o;9425:118::-;9512:24;9530:5;9512:24;:::i;:::-;9507:3;9500:37;9425:118;;:::o;9549:332::-;9670:4;9708:2;9697:9;9693:18;9685:26;;9721:71;9789:1;9778:9;9774:17;9765:6;9721:71;:::i;:::-;9802:72;9870:2;9859:9;9855:18;9846:6;9802:72;:::i;:::-;9549:332;;;;;:::o;9887:180::-;9935:77;9932:1;9925:88;10032:4;10029:1;10022:15;10056:4;10053:1;10046:15;10073:281;10156:27;10178:4;10156:27;:::i;:::-;10148:6;10144:40;10286:6;10274:10;10271:22;10250:18;10238:10;10235:34;10232:62;10229:88;;;10297:18;;:::i;:::-;10229:88;10337:10;10333:2;10326:22;10116:238;10073:281;;:::o;10360:129::-;10394:6;10421:20;;:::i;:::-;10411:30;;10450:33;10478:4;10470:6;10450:33;:::i;:::-;10360:129;;;:::o;10495:311::-;10572:4;10662:18;10654:6;10651:30;10648:56;;;10684:18;;:::i;:::-;10648:56;10734:4;10726:6;10722:17;10714:25;;10794:4;10788;10784:15;10776:23;;10495:311;;;:::o;10829:710::-;10925:5;10950:81;10966:64;11023:6;10966:64;:::i;:::-;10950:81;:::i;:::-;10941:90;;11051:5;11080:6;11073:5;11066:21;11114:4;11107:5;11103:16;11096:23;;11167:4;11159:6;11155:17;11147:6;11143:30;11196:3;11188:6;11185:15;11182:122;;;11215:79;;:::i;:::-;11182:122;11330:6;11313:220;11347:6;11342:3;11339:15;11313:220;;;11422:3;11451:37;11484:3;11472:10;11451:37;:::i;:::-;11446:3;11439:50;11518:4;11513:3;11509:14;11502:21;;11389:144;11373:4;11368:3;11364:14;11357:21;;11313:220;;;11317:21;10931:608;;10829:710;;;;;:::o;11562:370::-;11633:5;11682:3;11675:4;11667:6;11663:17;11659:27;11649:122;;11690:79;;:::i;:::-;11649:122;11807:6;11794:20;11832:94;11922:3;11914:6;11907:4;11899:6;11895:17;11832:94;:::i;:::-;11823:103;;11639:293;11562:370;;;;:::o;11938:117::-;12047:1;12044;12037:12;12061:307;12122:4;12212:18;12204:6;12201:30;12198:56;;;12234:18;;:::i;:::-;12198:56;12272:29;12294:6;12272:29;:::i;:::-;12264:37;;12356:4;12350;12346:15;12338:23;;12061:307;;;:::o;12374:154::-;12458:6;12453:3;12448;12435:30;12520:1;12511:6;12506:3;12502:16;12495:27;12374:154;;;:::o;12534:410::-;12611:5;12636:65;12652:48;12693:6;12652:48;:::i;:::-;12636:65;:::i;:::-;12627:74;;12724:6;12717:5;12710:21;12762:4;12755:5;12751:16;12800:3;12791:6;12786:3;12782:16;12779:25;12776:112;;;12807:79;;:::i;:::-;12776:112;12897:41;12931:6;12926:3;12921;12897:41;:::i;:::-;12617:327;12534:410;;;;;:::o;12963:338::-;13018:5;13067:3;13060:4;13052:6;13048:17;13044:27;13034:122;;13075:79;;:::i;:::-;13034:122;13192:6;13179:20;13217:78;13291:3;13283:6;13276:4;13268:6;13264:17;13217:78;:::i;:::-;13208:87;;13024:277;12963:338;;;;:::o;13307:1509::-;13461:6;13469;13477;13485;13493;13542:3;13530:9;13521:7;13517:23;13513:33;13510:120;;;13549:79;;:::i;:::-;13510:120;13669:1;13694:53;13739:7;13730:6;13719:9;13715:22;13694:53;:::i;:::-;13684:63;;13640:117;13796:2;13822:53;13867:7;13858:6;13847:9;13843:22;13822:53;:::i;:::-;13812:63;;13767:118;13952:2;13941:9;13937:18;13924:32;13983:18;13975:6;13972:30;13969:117;;;14005:79;;:::i;:::-;13969:117;14110:78;14180:7;14171:6;14160:9;14156:22;14110:78;:::i;:::-;14100:88;;13895:303;14265:2;14254:9;14250:18;14237:32;14296:18;14288:6;14285:30;14282:117;;;14318:79;;:::i;:::-;14282:117;14423:78;14493:7;14484:6;14473:9;14469:22;14423:78;:::i;:::-;14413:88;;14208:303;14578:3;14567:9;14563:19;14550:33;14610:18;14602:6;14599:30;14596:117;;;14632:79;;:::i;:::-;14596:117;14737:62;14791:7;14782:6;14771:9;14767:22;14737:62;:::i;:::-;14727:72;;14521:288;13307:1509;;;;;;;;:::o;14822:474::-;14890:6;14898;14947:2;14935:9;14926:7;14922:23;14918:32;14915:119;;;14953:79;;:::i;:::-;14915:119;15073:1;15098:53;15143:7;15134:6;15123:9;15119:22;15098:53;:::i;:::-;15088:63;;15044:117;15200:2;15226:53;15271:7;15262:6;15251:9;15247:22;15226:53;:::i;:::-;15216:63;;15171:118;14822:474;;;;;:::o;15302:311::-;15379:4;15469:18;15461:6;15458:30;15455:56;;;15491:18;;:::i;:::-;15455:56;15541:4;15533:6;15529:17;15521:25;;15601:4;15595;15591:15;15583:23;;15302:311;;;:::o;15636:710::-;15732:5;15757:81;15773:64;15830:6;15773:64;:::i;:::-;15757:81;:::i;:::-;15748:90;;15858:5;15887:6;15880:5;15873:21;15921:4;15914:5;15910:16;15903:23;;15974:4;15966:6;15962:17;15954:6;15950:30;16003:3;15995:6;15992:15;15989:122;;;16022:79;;:::i;:::-;15989:122;16137:6;16120:220;16154:6;16149:3;16146:15;16120:220;;;16229:3;16258:37;16291:3;16279:10;16258:37;:::i;:::-;16253:3;16246:50;16325:4;16320:3;16316:14;16309:21;;16196:144;16180:4;16175:3;16171:14;16164:21;;16120:220;;;16124:21;15738:608;;15636:710;;;;;:::o;16369:370::-;16440:5;16489:3;16482:4;16474:6;16470:17;16466:27;16456:122;;16497:79;;:::i;:::-;16456:122;16614:6;16601:20;16639:94;16729:3;16721:6;16714:4;16706:6;16702:17;16639:94;:::i;:::-;16630:103;;16446:293;16369:370;;;;:::o;16745:894::-;16863:6;16871;16920:2;16908:9;16899:7;16895:23;16891:32;16888:119;;;16926:79;;:::i;:::-;16888:119;17074:1;17063:9;17059:17;17046:31;17104:18;17096:6;17093:30;17090:117;;;17126:79;;:::i;:::-;17090:117;17231:78;17301:7;17292:6;17281:9;17277:22;17231:78;:::i;:::-;17221:88;;17017:302;17386:2;17375:9;17371:18;17358:32;17417:18;17409:6;17406:30;17403:117;;;17439:79;;:::i;:::-;17403:117;17544:78;17614:7;17605:6;17594:9;17590:22;17544:78;:::i;:::-;17534:88;;17329:303;16745:894;;;;;:::o;17645:114::-;17712:6;17746:5;17740:12;17730:22;;17645:114;;;:::o;17765:184::-;17864:11;17898:6;17893:3;17886:19;17938:4;17933:3;17929:14;17914:29;;17765:184;;;;:::o;17955:132::-;18022:4;18045:3;18037:11;;18075:4;18070:3;18066:14;18058:22;;17955:132;;;:::o;18093:108::-;18170:24;18188:5;18170:24;:::i;:::-;18165:3;18158:37;18093:108;;:::o;18207:179::-;18276:10;18297:46;18339:3;18331:6;18297:46;:::i;:::-;18375:4;18370:3;18366:14;18352:28;;18207:179;;;;:::o;18392:113::-;18462:4;18494;18489:3;18485:14;18477:22;;18392:113;;;:::o;18541:732::-;18660:3;18689:54;18737:5;18689:54;:::i;:::-;18759:86;18838:6;18833:3;18759:86;:::i;:::-;18752:93;;18869:56;18919:5;18869:56;:::i;:::-;18948:7;18979:1;18964:284;18989:6;18986:1;18983:13;18964:284;;;19065:6;19059:13;19092:63;19151:3;19136:13;19092:63;:::i;:::-;19085:70;;19178:60;19231:6;19178:60;:::i;:::-;19168:70;;19024:224;19011:1;19008;19004:9;18999:14;;18964:284;;;18968:14;19264:3;19257:10;;18665:608;;;18541:732;;;;:::o;19279:373::-;19422:4;19460:2;19449:9;19445:18;19437:26;;19509:9;19503:4;19499:20;19495:1;19484:9;19480:17;19473:47;19537:108;19640:4;19631:6;19537:108;:::i;:::-;19529:116;;19279:373;;;;:::o;19658:617::-;19734:6;19742;19750;19799:2;19787:9;19778:7;19774:23;19770:32;19767:119;;;19805:79;;:::i;:::-;19767:119;19925:1;19950:53;19995:7;19986:6;19975:9;19971:22;19950:53;:::i;:::-;19940:63;;19896:117;20052:2;20078:53;20123:7;20114:6;20103:9;20099:22;20078:53;:::i;:::-;20068:63;;20023:118;20180:2;20206:52;20250:7;20241:6;20230:9;20226:22;20206:52;:::i;:::-;20196:62;;20151:117;19658:617;;;;;:::o;20281:1039::-;20408:6;20416;20424;20473:2;20461:9;20452:7;20448:23;20444:32;20441:119;;;20479:79;;:::i;:::-;20441:119;20599:1;20624:53;20669:7;20660:6;20649:9;20645:22;20624:53;:::i;:::-;20614:63;;20570:117;20754:2;20743:9;20739:18;20726:32;20785:18;20777:6;20774:30;20771:117;;;20807:79;;:::i;:::-;20771:117;20912:78;20982:7;20973:6;20962:9;20958:22;20912:78;:::i;:::-;20902:88;;20697:303;21067:2;21056:9;21052:18;21039:32;21098:18;21090:6;21087:30;21084:117;;;21120:79;;:::i;:::-;21084:117;21225:78;21295:7;21286:6;21275:9;21271:22;21225:78;:::i;:::-;21215:88;;21010:303;20281:1039;;;;;:::o;21343:568::-;21416:8;21426:6;21476:3;21469:4;21461:6;21457:17;21453:27;21443:122;;21484:79;;:::i;:::-;21443:122;21597:6;21584:20;21574:30;;21627:18;21619:6;21616:30;21613:117;;;21649:79;;:::i;:::-;21613:117;21763:4;21755:6;21751:17;21739:29;;21817:3;21809:4;21801:6;21797:17;21787:8;21783:32;21780:41;21777:128;;;21824:79;;:::i;:::-;21777:128;21343:568;;;;;:::o;21934:::-;22007:8;22017:6;22067:3;22060:4;22052:6;22048:17;22044:27;22034:122;;22075:79;;:::i;:::-;22034:122;22188:6;22175:20;22165:30;;22218:18;22210:6;22207:30;22204:117;;;22240:79;;:::i;:::-;22204:117;22354:4;22346:6;22342:17;22330:29;;22408:3;22400:4;22392:6;22388:17;22378:8;22374:32;22371:41;22368:128;;;22415:79;;:::i;:::-;22368:128;21934:568;;;;;:::o;22508:1225::-;22648:6;22656;22664;22672;22680;22688;22737:3;22725:9;22716:7;22712:23;22708:33;22705:120;;;22744:79;;:::i;:::-;22705:120;22892:1;22881:9;22877:17;22864:31;22922:18;22914:6;22911:30;22908:117;;;22944:79;;:::i;:::-;22908:117;23057:80;23129:7;23120:6;23109:9;23105:22;23057:80;:::i;:::-;23039:98;;;;22835:312;23214:2;23203:9;23199:18;23186:32;23245:18;23237:6;23234:30;23231:117;;;23267:79;;:::i;:::-;23231:117;23380:80;23452:7;23443:6;23432:9;23428:22;23380:80;:::i;:::-;23362:98;;;;23157:313;23509:2;23535:53;23580:7;23571:6;23560:9;23556:22;23535:53;:::i;:::-;23525:63;;23480:118;23637:2;23663:53;23708:7;23699:6;23688:9;23684:22;23663:53;:::i;:::-;23653:63;;23608:118;22508:1225;;;;;;;;:::o;23739:116::-;23809:21;23824:5;23809:21;:::i;:::-;23802:5;23799:32;23789:60;;23845:1;23842;23835:12;23789:60;23739:116;:::o;23861:133::-;23904:5;23942:6;23929:20;23920:29;;23958:30;23982:5;23958:30;:::i;:::-;23861:133;;;;:::o;24000:468::-;24065:6;24073;24122:2;24110:9;24101:7;24097:23;24093:32;24090:119;;;24128:79;;:::i;:::-;24090:119;24248:1;24273:53;24318:7;24309:6;24298:9;24294:22;24273:53;:::i;:::-;24263:63;;24219:117;24375:2;24401:50;24443:7;24434:6;24423:9;24419:22;24401:50;:::i;:::-;24391:60;;24346:115;24000:468;;;;;:::o;24474:1079::-;24605:6;24613;24621;24629;24637;24686:2;24674:9;24665:7;24661:23;24657:32;24654:119;;;24692:79;;:::i;:::-;24654:119;24812:1;24837:53;24882:7;24873:6;24862:9;24858:22;24837:53;:::i;:::-;24827:63;;24783:117;24967:2;24956:9;24952:18;24939:32;24998:18;24990:6;24987:30;24984:117;;;25020:79;;:::i;:::-;24984:117;25133:80;25205:7;25196:6;25185:9;25181:22;25133:80;:::i;:::-;25115:98;;;;24910:313;25290:2;25279:9;25275:18;25262:32;25321:18;25313:6;25310:30;25307:117;;;25343:79;;:::i;:::-;25307:117;25456:80;25528:7;25519:6;25508:9;25504:22;25456:80;:::i;:::-;25438:98;;;;25233:313;24474:1079;;;;;;;;:::o;25559:474::-;25627:6;25635;25684:2;25672:9;25663:7;25659:23;25655:32;25652:119;;;25690:79;;:::i;:::-;25652:119;25810:1;25835:53;25880:7;25871:6;25860:9;25856:22;25835:53;:::i;:::-;25825:63;;25781:117;25937:2;25963:53;26008:7;25999:6;25988:9;25984:22;25963:53;:::i;:::-;25953:63;;25908:118;25559:474;;;;;:::o;26039:1089::-;26143:6;26151;26159;26167;26175;26224:3;26212:9;26203:7;26199:23;26195:33;26192:120;;;26231:79;;:::i;:::-;26192:120;26351:1;26376:53;26421:7;26412:6;26401:9;26397:22;26376:53;:::i;:::-;26366:63;;26322:117;26478:2;26504:53;26549:7;26540:6;26529:9;26525:22;26504:53;:::i;:::-;26494:63;;26449:118;26606:2;26632:53;26677:7;26668:6;26657:9;26653:22;26632:53;:::i;:::-;26622:63;;26577:118;26734:2;26760:53;26805:7;26796:6;26785:9;26781:22;26760:53;:::i;:::-;26750:63;;26705:118;26890:3;26879:9;26875:19;26862:33;26922:18;26914:6;26911:30;26908:117;;;26944:79;;:::i;:::-;26908:117;27049:62;27103:7;27094:6;27083:9;27079:22;27049:62;:::i;:::-;27039:72;;26833:288;26039:1089;;;;;;;;:::o;27134:230::-;27274:34;27270:1;27262:6;27258:14;27251:58;27343:13;27338:2;27330:6;27326:15;27319:38;27134:230;:::o;27370:366::-;27512:3;27533:67;27597:2;27592:3;27533:67;:::i;:::-;27526:74;;27609:93;27698:3;27609:93;:::i;:::-;27727:2;27722:3;27718:12;27711:19;;27370:366;;;:::o;27742:419::-;27908:4;27946:2;27935:9;27931:18;27923:26;;27995:9;27989:4;27985:20;27981:1;27970:9;27966:17;27959:47;28023:131;28149:4;28023:131;:::i;:::-;28015:139;;27742:419;;;:::o;28167:180::-;28215:77;28212:1;28205:88;28312:4;28309:1;28302:15;28336:4;28333:1;28326:15;28353:320;28397:6;28434:1;28428:4;28424:12;28414:22;;28481:1;28475:4;28471:12;28502:18;28492:81;;28558:4;28550:6;28546:17;28536:27;;28492:81;28620:2;28612:6;28609:14;28589:18;28586:38;28583:84;;;28639:18;;:::i;:::-;28583:84;28404:269;28353:320;;;:::o;28679:180::-;28727:77;28724:1;28717:88;28824:4;28821:1;28814:15;28848:4;28845:1;28838:15;28865:348;28905:7;28928:20;28946:1;28928:20;:::i;:::-;28923:25;;28962:20;28980:1;28962:20;:::i;:::-;28957:25;;29150:1;29082:66;29078:74;29075:1;29072:81;29067:1;29060:9;29053:17;29049:105;29046:131;;;29157:18;;:::i;:::-;29046:131;29205:1;29202;29198:9;29187:20;;28865:348;;;;:::o;29219:180::-;29267:77;29264:1;29257:88;29364:4;29361:1;29354:15;29388:4;29385:1;29378:15;29405:185;29445:1;29462:20;29480:1;29462:20;:::i;:::-;29457:25;;29496:20;29514:1;29496:20;:::i;:::-;29491:25;;29535:1;29525:35;;29540:18;;:::i;:::-;29525:35;29582:1;29579;29575:9;29570:14;;29405:185;;;;:::o;29596:237::-;29736:34;29732:1;29724:6;29720:14;29713:58;29805:20;29800:2;29792:6;29788:15;29781:45;29596:237;:::o;29839:366::-;29981:3;30002:67;30066:2;30061:3;30002:67;:::i;:::-;29995:74;;30078:93;30167:3;30078:93;:::i;:::-;30196:2;30191:3;30187:12;30180:19;;29839:366;;;:::o;30211:419::-;30377:4;30415:2;30404:9;30400:18;30392:26;;30464:9;30458:4;30454:20;30450:1;30439:9;30435:17;30428:47;30492:131;30618:4;30492:131;:::i;:::-;30484:139;;30211:419;;;:::o;30636:234::-;30776:34;30772:1;30764:6;30760:14;30753:58;30845:17;30840:2;30832:6;30828:15;30821:42;30636:234;:::o;30876:366::-;31018:3;31039:67;31103:2;31098:3;31039:67;:::i;:::-;31032:74;;31115:93;31204:3;31115:93;:::i;:::-;31233:2;31228:3;31224:12;31217:19;;30876:366;;;:::o;31248:419::-;31414:4;31452:2;31441:9;31437:18;31429:26;;31501:9;31495:4;31491:20;31487:1;31476:9;31472:17;31465:47;31529:131;31655:4;31529:131;:::i;:::-;31521:139;;31248:419;;;:::o;31673:228::-;31813:34;31809:1;31801:6;31797:14;31790:58;31882:11;31877:2;31869:6;31865:15;31858:36;31673:228;:::o;31907:366::-;32049:3;32070:67;32134:2;32129:3;32070:67;:::i;:::-;32063:74;;32146:93;32235:3;32146:93;:::i;:::-;32264:2;32259:3;32255:12;32248:19;;31907:366;;;:::o;32279:419::-;32445:4;32483:2;32472:9;32468:18;32460:26;;32532:9;32526:4;32522:20;32518:1;32507:9;32503:17;32496:47;32560:131;32686:4;32560:131;:::i;:::-;32552:139;;32279:419;;;:::o;32704:180::-;32752:77;32749:1;32742:88;32849:4;32846:1;32839:15;32873:4;32870:1;32863:15;32890:233;32929:3;32952:24;32970:5;32952:24;:::i;:::-;32943:33;;32998:66;32991:5;32988:77;32985:103;;;33068:18;;:::i;:::-;32985:103;33115:1;33108:5;33104:13;33097:20;;32890:233;;;:::o;33129:228::-;33269:34;33265:1;33257:6;33253:14;33246:58;33338:11;33333:2;33325:6;33321:15;33314:36;33129:228;:::o;33363:366::-;33505:3;33526:67;33590:2;33585:3;33526:67;:::i;:::-;33519:74;;33602:93;33691:3;33602:93;:::i;:::-;33720:2;33715:3;33711:12;33704:19;;33363:366;;;:::o;33735:419::-;33901:4;33939:2;33928:9;33924:18;33916:26;;33988:9;33982:4;33978:20;33974:1;33963:9;33959:17;33952:47;34016:131;34142:4;34016:131;:::i;:::-;34008:139;;33735:419;;;:::o;34160:233::-;34300:34;34296:1;34288:6;34284:14;34277:58;34369:16;34364:2;34356:6;34352:15;34345:41;34160:233;:::o;34399:366::-;34541:3;34562:67;34626:2;34621:3;34562:67;:::i;:::-;34555:74;;34638:93;34727:3;34638:93;:::i;:::-;34756:2;34751:3;34747:12;34740:19;;34399:366;;;:::o;34771:419::-;34937:4;34975:2;34964:9;34960:18;34952:26;;35024:9;35018:4;35014:20;35010:1;34999:9;34995:17;34988:47;35052:131;35178:4;35052:131;:::i;:::-;35044:139;;34771:419;;;:::o;35196:329::-;35255:6;35304:2;35292:9;35283:7;35279:23;35275:32;35272:119;;;35310:79;;:::i;:::-;35272:119;35430:1;35455:53;35500:7;35491:6;35480:9;35476:22;35455:53;:::i;:::-;35445:63;;35401:117;35196:329;;;;:::o;35531:305::-;35571:3;35590:20;35608:1;35590:20;:::i;:::-;35585:25;;35624:20;35642:1;35624:20;:::i;:::-;35619:25;;35778:1;35710:66;35706:74;35703:1;35700:81;35697:107;;;35784:18;;:::i;:::-;35697:107;35828:1;35825;35821:9;35814:16;;35531:305;;;;:::o;35842:148::-;35944:11;35981:3;35966:18;;35842:148;;;;:::o;35996:173::-;36136:25;36132:1;36124:6;36120:14;36113:49;35996:173;:::o;36175:402::-;36335:3;36356:85;36438:2;36433:3;36356:85;:::i;:::-;36349:92;;36450:93;36539:3;36450:93;:::i;:::-;36568:2;36563:3;36559:12;36552:19;;36175:402;;;:::o;36583:377::-;36689:3;36717:39;36750:5;36717:39;:::i;:::-;36772:89;36854:6;36849:3;36772:89;:::i;:::-;36765:96;;36870:52;36915:6;36910:3;36903:4;36896:5;36892:16;36870:52;:::i;:::-;36947:6;36942:3;36938:16;36931:23;;36693:267;36583:377;;;;:::o;36966:167::-;37106:19;37102:1;37094:6;37090:14;37083:43;36966:167;:::o;37139:402::-;37299:3;37320:85;37402:2;37397:3;37320:85;:::i;:::-;37313:92;;37414:93;37503:3;37414:93;:::i;:::-;37532:2;37527:3;37523:12;37516:19;;37139:402;;;:::o;37547:967::-;37929:3;37951:148;38095:3;37951:148;:::i;:::-;37944:155;;38116:95;38207:3;38198:6;38116:95;:::i;:::-;38109:102;;38228:148;38372:3;38228:148;:::i;:::-;38221:155;;38393:95;38484:3;38475:6;38393:95;:::i;:::-;38386:102;;38505:3;38498:10;;37547:967;;;;;:::o;38520:236::-;38660:34;38656:1;38648:6;38644:14;38637:58;38729:19;38724:2;38716:6;38712:15;38705:44;38520:236;:::o;38762:366::-;38904:3;38925:67;38989:2;38984:3;38925:67;:::i;:::-;38918:74;;39001:93;39090:3;39001:93;:::i;:::-;39119:2;39114:3;39110:12;39103:19;;38762:366;;;:::o;39134:419::-;39300:4;39338:2;39327:9;39323:18;39315:26;;39387:9;39381:4;39377:20;39373:1;39362:9;39358:17;39351:47;39415:131;39541:4;39415:131;:::i;:::-;39407:139;;39134:419;;;:::o;39559:175::-;39699:27;39695:1;39687:6;39683:14;39676:51;39559:175;:::o;39740:366::-;39882:3;39903:67;39967:2;39962:3;39903:67;:::i;:::-;39896:74;;39979:93;40068:3;39979:93;:::i;:::-;40097:2;40092:3;40088:12;40081:19;;39740:366;;;:::o;40112:419::-;40278:4;40316:2;40305:9;40301:18;40293:26;;40365:9;40359:4;40355:20;40351:1;40340:9;40336:17;40329:47;40393:131;40519:4;40393:131;:::i;:::-;40385:139;;40112:419;;;:::o;40537:220::-;40677:34;40673:1;40665:6;40661:14;40654:58;40746:3;40741:2;40733:6;40729:15;40722:28;40537:220;:::o;40763:366::-;40905:3;40926:67;40990:2;40985:3;40926:67;:::i;:::-;40919:74;;41002:93;41091:3;41002:93;:::i;:::-;41120:2;41115:3;41111:12;41104:19;;40763:366;;;:::o;41135:419::-;41301:4;41339:2;41328:9;41324:18;41316:26;;41388:9;41382:4;41378:20;41374:1;41363:9;41359:17;41352:47;41416:131;41542:4;41416:131;:::i;:::-;41408:139;;41135:419;;;:::o;41560:332::-;41681:4;41719:2;41708:9;41704:18;41696:26;;41732:71;41800:1;41789:9;41785:17;41776:6;41732:71;:::i;:::-;41813:72;41881:2;41870:9;41866:18;41857:6;41813:72;:::i;:::-;41560:332;;;;;:::o;41898:227::-;42038:34;42034:1;42026:6;42022:14;42015:58;42107:10;42102:2;42094:6;42090:15;42083:35;41898:227;:::o;42131:366::-;42273:3;42294:67;42358:2;42353:3;42294:67;:::i;:::-;42287:74;;42370:93;42459:3;42370:93;:::i;:::-;42488:2;42483:3;42479:12;42472:19;;42131:366;;;:::o;42503:419::-;42669:4;42707:2;42696:9;42692:18;42684:26;;42756:9;42750:4;42746:20;42742:1;42731:9;42727:17;42720:47;42784:131;42910:4;42784:131;:::i;:::-;42776:139;;42503:419;;;:::o;42928:224::-;43068:34;43064:1;43056:6;43052:14;43045:58;43137:7;43132:2;43124:6;43120:15;43113:32;42928:224;:::o;43158:366::-;43300:3;43321:67;43385:2;43380:3;43321:67;:::i;:::-;43314:74;;43397:93;43486:3;43397:93;:::i;:::-;43515:2;43510:3;43506:12;43499:19;;43158:366;;;:::o;43530:419::-;43696:4;43734:2;43723:9;43719:18;43711:26;;43783:9;43777:4;43773:20;43769:1;43758:9;43754:17;43747:47;43811:131;43937:4;43811:131;:::i;:::-;43803:139;;43530:419;;;:::o;43955:229::-;44095:34;44091:1;44083:6;44079:14;44072:58;44164:12;44159:2;44151:6;44147:15;44140:37;43955:229;:::o;44190:366::-;44332:3;44353:67;44417:2;44412:3;44353:67;:::i;:::-;44346:74;;44429:93;44518:3;44429:93;:::i;:::-;44547:2;44542:3;44538:12;44531:19;;44190:366;;;:::o;44562:419::-;44728:4;44766:2;44755:9;44751:18;44743:26;;44815:9;44809:4;44805:20;44801:1;44790:9;44786:17;44779:47;44843:131;44969:4;44843:131;:::i;:::-;44835:139;;44562:419;;;:::o;44987:634::-;45208:4;45246:2;45235:9;45231:18;45223:26;;45295:9;45289:4;45285:20;45281:1;45270:9;45266:17;45259:47;45323:108;45426:4;45417:6;45323:108;:::i;:::-;45315:116;;45478:9;45472:4;45468:20;45463:2;45452:9;45448:18;45441:48;45506:108;45609:4;45600:6;45506:108;:::i;:::-;45498:116;;44987:634;;;;;:::o;45627:170::-;45767:22;45763:1;45755:6;45751:14;45744:46;45627:170;:::o;45803:366::-;45945:3;45966:67;46030:2;46025:3;45966:67;:::i;:::-;45959:74;;46042:93;46131:3;46042:93;:::i;:::-;46160:2;46155:3;46151:12;46144:19;;45803:366;;;:::o;46175:419::-;46341:4;46379:2;46368:9;46364:18;46356:26;;46428:9;46422:4;46418:20;46414:1;46403:9;46399:17;46392:47;46456:131;46582:4;46456:131;:::i;:::-;46448:139;;46175:419;;;:::o;46600:222::-;46693:4;46731:2;46720:9;46716:18;46708:26;;46744:71;46812:1;46801:9;46797:17;46788:6;46744:71;:::i;:::-;46600:222;;;;:::o;46828:177::-;46968:29;46964:1;46956:6;46952:14;46945:53;46828:177;:::o;47011:366::-;47153:3;47174:67;47238:2;47233:3;47174:67;:::i;:::-;47167:74;;47250:93;47339:3;47250:93;:::i;:::-;47368:2;47363:3;47359:12;47352:19;;47011:366;;;:::o;47383:419::-;47549:4;47587:2;47576:9;47572:18;47564:26;;47636:9;47630:4;47626:20;47622:1;47611:9;47607:17;47600:47;47664:131;47790:4;47664:131;:::i;:::-;47656:139;;47383:419;;;:::o;47808:222::-;47948:34;47944:1;47936:6;47932:14;47925:58;48017:5;48012:2;48004:6;48000:15;47993:30;47808:222;:::o;48036:366::-;48178:3;48199:67;48263:2;48258:3;48199:67;:::i;:::-;48192:74;;48275:93;48364:3;48275:93;:::i;:::-;48393:2;48388:3;48384:12;48377:19;;48036:366;;;:::o;48408:419::-;48574:4;48612:2;48601:9;48597:18;48589:26;;48661:9;48655:4;48651:20;48647:1;48636:9;48632:17;48625:47;48689:131;48815:4;48689:131;:::i;:::-;48681:139;;48408:419;;;:::o;48833:223::-;48973:34;48969:1;48961:6;48957:14;48950:58;49042:6;49037:2;49029:6;49025:15;49018:31;48833:223;:::o;49062:366::-;49204:3;49225:67;49289:2;49284:3;49225:67;:::i;:::-;49218:74;;49301:93;49390:3;49301:93;:::i;:::-;49419:2;49414:3;49410:12;49403:19;;49062:366;;;:::o;49434:419::-;49600:4;49638:2;49627:9;49623:18;49615:26;;49687:9;49681:4;49677:20;49673:1;49662:9;49658:17;49651:47;49715:131;49841:4;49715:131;:::i;:::-;49707:139;;49434:419;;;:::o;49859:166::-;49999:18;49995:1;49987:6;49983:14;49976:42;49859:166;:::o;50031:366::-;50173:3;50194:67;50258:2;50253:3;50194:67;:::i;:::-;50187:74;;50270:93;50359:3;50270:93;:::i;:::-;50388:2;50383:3;50379:12;50372:19;;50031:366;;;:::o;50403:419::-;50569:4;50607:2;50596:9;50592:18;50584:26;;50656:9;50650:4;50646:20;50642:1;50631:9;50627:17;50620:47;50684:131;50810:4;50684:131;:::i;:::-;50676:139;;50403:419;;;:::o;50828:228::-;50968:34;50964:1;50956:6;50952:14;50945:58;51037:11;51032:2;51024:6;51020:15;51013:36;50828:228;:::o;51062:366::-;51204:3;51225:67;51289:2;51284:3;51225:67;:::i;:::-;51218:74;;51301:93;51390:3;51301:93;:::i;:::-;51419:2;51414:3;51410:12;51403:19;;51062:366;;;:::o;51434:419::-;51600:4;51638:2;51627:9;51623:18;51615:26;;51687:9;51681:4;51677:20;51673:1;51662:9;51658:17;51651:47;51715:131;51841:4;51715:131;:::i;:::-;51707:139;;51434:419;;;:::o;51859:171::-;51898:3;51921:24;51939:5;51921:24;:::i;:::-;51912:33;;51967:4;51960:5;51957:15;51954:41;;;51975:18;;:::i;:::-;51954:41;52022:1;52015:5;52011:13;52004:20;;51859:171;;;:::o;52036:182::-;52176:34;52172:1;52164:6;52160:14;52153:58;52036:182;:::o;52224:366::-;52366:3;52387:67;52451:2;52446:3;52387:67;:::i;:::-;52380:74;;52463:93;52552:3;52463:93;:::i;:::-;52581:2;52576:3;52572:12;52565:19;;52224:366;;;:::o;52596:419::-;52762:4;52800:2;52789:9;52785:18;52777:26;;52849:9;52843:4;52839:20;52835:1;52824:9;52820:17;52813:47;52877:131;53003:4;52877:131;:::i;:::-;52869:139;;52596:419;;;:::o;53021:98::-;53072:6;53106:5;53100:12;53090:22;;53021:98;;;:::o;53125:168::-;53208:11;53242:6;53237:3;53230:19;53282:4;53277:3;53273:14;53258:29;;53125:168;;;;:::o;53299:360::-;53385:3;53413:38;53445:5;53413:38;:::i;:::-;53467:70;53530:6;53525:3;53467:70;:::i;:::-;53460:77;;53546:52;53591:6;53586:3;53579:4;53572:5;53568:16;53546:52;:::i;:::-;53623:29;53645:6;53623:29;:::i;:::-;53618:3;53614:39;53607:46;;53389:270;53299:360;;;;:::o;53665:751::-;53888:4;53926:3;53915:9;53911:19;53903:27;;53940:71;54008:1;53997:9;53993:17;53984:6;53940:71;:::i;:::-;54021:72;54089:2;54078:9;54074:18;54065:6;54021:72;:::i;:::-;54103;54171:2;54160:9;54156:18;54147:6;54103:72;:::i;:::-;54185;54253:2;54242:9;54238:18;54229:6;54185:72;:::i;:::-;54305:9;54299:4;54295:20;54289:3;54278:9;54274:19;54267:49;54333:76;54404:4;54395:6;54333:76;:::i;:::-;54325:84;;53665:751;;;;;;;;:::o;54422:141::-;54478:5;54509:6;54503:13;54494:22;;54525:32;54551:5;54525:32;:::i;:::-;54422:141;;;;:::o;54569:349::-;54638:6;54687:2;54675:9;54666:7;54662:23;54658:32;54655:119;;;54693:79;;:::i;:::-;54655:119;54813:1;54838:63;54893:7;54884:6;54873:9;54869:22;54838:63;:::i;:::-;54828:73;;54784:127;54569:349;;;;:::o;54924:106::-;54968:8;55017:5;55012:3;55008:15;54987:36;;54924:106;;;:::o;55036:183::-;55071:3;55109:1;55091:16;55088:23;55085:128;;;55147:1;55144;55141;55126:23;55169:34;55200:1;55194:8;55169:34;:::i;:::-;55162:41;;55085:128;55036:183;:::o;55225:711::-;55264:3;55302:4;55284:16;55281:26;55278:39;;;55310:5;;55278:39;55339:20;;:::i;:::-;55414:1;55396:16;55392:24;55389:1;55383:4;55368:49;55447:4;55441:11;55546:16;55539:4;55531:6;55527:17;55524:39;55491:18;55483:6;55480:30;55464:113;55461:146;;;55592:5;;;;55461:146;55638:6;55632:4;55628:17;55674:3;55668:10;55701:18;55693:6;55690:30;55687:43;;;55723:5;;;;;;55687:43;55771:6;55764:4;55759:3;55755:14;55751:27;55830:1;55812:16;55808:24;55802:4;55798:35;55793:3;55790:44;55787:57;;;55837:5;;;;;;;55787:57;55854;55902:6;55896:4;55892:17;55884:6;55880:30;55874:4;55854:57;:::i;:::-;55927:3;55920:10;;55268:668;;;;;55225:711;;:::o;55942:239::-;56082:34;56078:1;56070:6;56066:14;56059:58;56151:22;56146:2;56138:6;56134:15;56127:47;55942:239;:::o;56187:366::-;56329:3;56350:67;56414:2;56409:3;56350:67;:::i;:::-;56343:74;;56426:93;56515:3;56426:93;:::i;:::-;56544:2;56539:3;56535:12;56528:19;;56187:366;;;:::o;56559:419::-;56725:4;56763:2;56752:9;56748:18;56740:26;;56812:9;56806:4;56802:20;56798:1;56787:9;56783:17;56776:47;56840:131;56966:4;56840:131;:::i;:::-;56832:139;;56559:419;;;:::o;56984:227::-;57124:34;57120:1;57112:6;57108:14;57101:58;57193:10;57188:2;57180:6;57176:15;57169:35;56984:227;:::o;57217:366::-;57359:3;57380:67;57444:2;57439:3;57380:67;:::i;:::-;57373:74;;57456:93;57545:3;57456:93;:::i;:::-;57574:2;57569:3;57565:12;57558:19;;57217:366;;;:::o;57589:419::-;57755:4;57793:2;57782:9;57778:18;57770:26;;57842:9;57836:4;57832:20;57828:1;57817:9;57813:17;57806:47;57870:131;57996:4;57870:131;:::i;:::-;57862:139;;57589:419;;;:::o;58014:1053::-;58337:4;58375:3;58364:9;58360:19;58352:27;;58389:71;58457:1;58446:9;58442:17;58433:6;58389:71;:::i;:::-;58470:72;58538:2;58527:9;58523:18;58514:6;58470:72;:::i;:::-;58589:9;58583:4;58579:20;58574:2;58563:9;58559:18;58552:48;58617:108;58720:4;58711:6;58617:108;:::i;:::-;58609:116;;58772:9;58766:4;58762:20;58757:2;58746:9;58742:18;58735:48;58800:108;58903:4;58894:6;58800:108;:::i;:::-;58792:116;;58956:9;58950:4;58946:20;58940:3;58929:9;58925:19;58918:49;58984:76;59055:4;59046:6;58984:76;:::i;:::-;58976:84;;58014:1053;;;;;;;;:::o;59073:191::-;59113:4;59133:20;59151:1;59133:20;:::i;:::-;59128:25;;59167:20;59185:1;59167:20;:::i;:::-;59162:25;;59206:1;59203;59200:8;59197:34;;;59211:18;;:::i;:::-;59197:34;59256:1;59253;59249:9;59241:17;;59073:191;;;;:::o
Swarm Source
ipfs://eba87f7728ea1dad47ee67e54e77522466127b38aa57cf8db22255c0310a6bc2
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.