Token NFT CFC
Overview CRC721
Total Supply:
224 CFC
Holders:
55 addresses
Contract:
Balance
1 CFC
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NftCFC
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-07-29 */ // File: contracts/ERC721A/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: contracts/ERC721A/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/ERC721A/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: contracts/ERC721A/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.14; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `toskenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: Cronos/CFC/NftCFC.sol // Made By DR#2010 For CronosFC pragma solidity ^0.8.14; interface INftCFC{ struct infoNft{ uint indexNft; uint indexType; uint typeNft; uint level; uint prestige; uint boost; } function getNftInfo(uint _index) external view returns(infoNft memory); function mintOnceTo(address to, uint _typeNft) external returns(bool); function levelUpExtern(address _account, uint _indexNft, uint nbLevel) external returns(bool); } interface INftJeton{ function mintJeton(address to, uint _quantity) external; function burnJeton(address _account, uint _quantity) external returns(bool); } contract NftCFC is ERC721AQueryable, INftCFC { address owner; string name_; string symbol_; uint public priceMint = 2; address public adrJeton; address public adrUpgrader; address public adrMinter; address public adrBurner; string baseUri = "https://metadatas.cronosfc.club/"; mapping(uint => infoNft) listNft; uint maxLevel = 10; uint maxPrestige = 10; uint public maxSupply = 5555; uint public maxSupply_Player = 5000; uint public currentSupply_Player = 0; uint public maxSupply_Goal = 500; uint public currentSupply_Goal = 0; uint public maxSupply_GoalCpt = 55; uint public currentSupply_GoalCpt = 0; event MintEvent(); constructor(address _adrJeton)ERC721A("NFT CFC", "CFC"){ owner = msg.sender; name_ = "NFT CFC"; symbol_ = "CFC"; mintAdmin(0xF43D2E70faE713B12f4F47d77B135BfA24B8AAAf, 30, 1); mintAdmin(0xF43D2E70faE713B12f4F47d77B135BfA24B8AAAf, 25, 2); mintAdmin(0xF43D2E70faE713B12f4F47d77B135BfA24B8AAAf, 5, 3); adrJeton = _adrJeton; } //Change address function changeOwner(address _owner) public onlyOwner { owner = _owner; } function changeJeton(address _adrJeton) public onlyOwner { adrJeton = _adrJeton; } function changeMinter(address _adrMinter) public onlyOwner { adrMinter = _adrMinter; } function changeUpgrader(address _adrUpgrader) public onlyOwner { adrUpgrader = _adrUpgrader; } // //Setter function setPriceMint(uint _priceMint) public onlyOwner { priceMint = _priceMint; } function setLevelMax(uint _levelMax) public onlyOwner { maxLevel = _levelMax; } function setPrestigeMax(uint _PrestigeMax) public onlyOwner { maxPrestige = _PrestigeMax; } function setBaseUri(string memory _baseUri) public onlyOwner { baseUri = _baseUri; } // //Getter //Override ERC721A function _startTokenId() internal view override returns (uint256) { return 1; } function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); infoNft memory _infoNft = getInfoNft(tokenId); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(_infoNft.typeNft), "/", _toString(_infoNft.indexType), "/", _toString(_infoNft.level), "/", _toString(_infoNft.prestige) )) : ''; } function _baseURI() internal view override returns (string memory) { return baseUri; } // function getNbTypeNFT(address _account) public view returns(uint nbPlayer, uint nbGoal, uint nbGoalCPT) { uint[] memory listIndexNft = ERC721AQueryable(address(this)).tokensOfOwner(_account); uint _typeNft; for(uint i = 0; i < listIndexNft.length; i++) { _typeNft = listNft[listIndexNft[i]].typeNft; if(_typeNft == 1) { nbPlayer++; } else if(_typeNft == 2) { nbGoal++; } else if(_typeNft == 3) { nbGoalCPT++; } } } function getNftInfo(uint _index) external view returns(infoNft memory) { return getInfoNft(_index); } function getInfoNft(uint _index) public view returns(infoNft memory) { require(_exists(_index), "[ERROR] : Index Not found"); return listNft[_index]; } // //Check function checkSupplyTypeNft(uint _typeNft) internal returns(bool) { if(_typeNft == 1) { require(currentSupply_Player < maxSupply_Player, "[ERROR] : Supply Player already Reach!"); return true; } else if(_typeNft == 2) { require(currentSupply_Goal < maxSupply_Goal, "[ERROR] : Supply Goal already Reach!"); return true; } else if(_typeNft == 3) { require(currentSupply_GoalCpt < maxSupply_GoalCpt, "[ERROR] : Supply Goal Captain already Reach!"); return true; } else{ return false; } } // //Function function levelUpExtern(address _account, uint _indexNft, uint nbLevel) external onlyUpgrader returns(bool) { levelUp(_account, _indexNft, nbLevel); return true; } function levelUp(address _account, uint _indexNft, uint nbLevel) public onlyUpgrader returns(bool) { require(ownerOf(_indexNft) == _account, "[ERROR] : You are not the owner of this NFT CFC!"); require(listNft[_indexNft].prestige != maxPrestige, "[ERROR] : You are already Prestige Max!"); if(listNft[_indexNft].prestige+1 == maxPrestige) { require(listNft[_indexNft].level + nbLevel <= maxLevel+1, "[ERROR] : You are need more level than you can!"); } uint level = listNft[_indexNft].level; uint prestige = listNft[_indexNft].prestige; uint boost = listNft[_indexNft].boost; for(uint i = 0; i < nbLevel; i++) { if(level < maxLevel) { level += 1; } else { level = 1; prestige += 1; boost += 2; } } listNft[_indexNft].level = level; listNft[_indexNft].prestige = prestige; listNft[_indexNft].boost = boost; return true; } function burnNft(address _account, uint _indexNft) external onlyBurner returns(bool) { require(ERC721AQueryable(address(this)).ownerOf(_indexNft) == _account, "[ERROR] : This is account dont have this NFT!"); _burn(_indexNft); if(_indexNft == 1) { currentSupply_Player-=1; maxSupply_Player-=1; } else if(_indexNft == 2) { currentSupply_Goal-=1; maxSupply_Goal-=1; } else if(_indexNft == 3) { currentSupply_GoalCpt-=1; maxSupply_GoalCpt-=1; } } function burnMassAdmin(address _account, uint[] memory _listIndex) external onlyBurner returns(bool) { require(ERC721AQueryable(address(this)).balanceOf(_account) >= _listIndex.length, "[ERROR] : You dont have enough Ball!"); for(uint i = 0; i < _listIndex.length; i++) { require(ERC721AQueryable(address(this)).ownerOf(_listIndex[i]) == _account, "[ERROR] : This is account dont have One index NFT! (burn)"); } for(uint i = 0; i < _listIndex.length; i++) { if(_listIndex[i] == 1) { currentSupply_Player-=1; maxSupply_Player-=1; } else if(_listIndex[i] == 2) { currentSupply_Goal-=1; maxSupply_Goal-=1; } else if(_listIndex[i] == 3) { currentSupply_GoalCpt-=1; maxSupply_GoalCpt-=1; } _burn(_listIndex[i]); } return true; } function mintAdmin(address to, uint _amount, uint _typeNft) public onlyOwner returns(bool) { uint index = _nextTokenId(); require(checkSupplyTypeNft(_typeNft), "[ERROR] : Your type of nft desired is sold out!"); _mint(to, _amount); for(uint i = 0; i < _amount; i++) { if(_typeNft == 1) { currentSupply_Player++; listNft[index].indexType = currentSupply_Player; } else if(_typeNft == 2) { currentSupply_Goal++; listNft[index].indexType = currentSupply_Goal; } else { currentSupply_GoalCpt++; listNft[index].indexType = currentSupply_GoalCpt; } listNft[index+i].indexNft = index; listNft[index+i].typeNft = _typeNft; listNft[index+i].level = 0; listNft[index+i].prestige = 0; listNft[index+i].boost = 1; } return true; } function mintOnceTo(address to, uint _typeNft) external onlyMinter returns(bool) { require(ERC721AQueryable(adrJeton).balanceOf(to) >= priceMint, "[ERROR] : You dont have enough Jeton!"); uint index = _nextTokenId(); require(INftJeton(adrJeton).burnJeton(to, priceMint), "[ERROR] : Burn Jeton Fail!"); require(checkSupplyTypeNft(_typeNft), "[ERROR] : Your type of nft desired is sold out!"); _mint(to, 1); if(_typeNft == 1) { currentSupply_Player++; listNft[index].indexType = currentSupply_Player; } else if(_typeNft == 2) { currentSupply_Goal++; listNft[index].indexType = currentSupply_Goal; } else { currentSupply_GoalCpt++; listNft[index].indexType = currentSupply_GoalCpt; } listNft[index].indexNft = index; listNft[index].typeNft = _typeNft; listNft[index].level = 1; listNft[index].prestige = 0; listNft[index].boost = 1; emit MintEvent(); return true; } // //Modifier modifier onlyOwner { require(msg.sender == owner); _; } modifier onlyBurner { require(msg.sender == adrBurner, "[ERROR] (NFT CFC) : Address not approve for Burn"); _; } modifier onlyMinter { require(msg.sender == adrMinter, "[ERROR] (NFT CFC) : Address not approve for Mint"); _; } modifier onlyUpgrader { require(msg.sender == adrUpgrader, "[ERROR] (NFT CFC) : Address not approve for Upgrade"); _; } // }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_adrJeton","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[],"name":"MintEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"adrBurner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adrJeton","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adrMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adrUpgrader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256[]","name":"_listIndex","type":"uint256[]"}],"name":"burnMassAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_indexNft","type":"uint256"}],"name":"burnNft","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrJeton","type":"address"}],"name":"changeJeton","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrMinter","type":"address"}],"name":"changeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrUpgrader","type":"address"}],"name":"changeUpgrader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSupply_Goal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply_GoalCpt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply_Player","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getInfoNft","outputs":[{"components":[{"internalType":"uint256","name":"indexNft","type":"uint256"},{"internalType":"uint256","name":"indexType","type":"uint256"},{"internalType":"uint256","name":"typeNft","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"prestige","type":"uint256"},{"internalType":"uint256","name":"boost","type":"uint256"}],"internalType":"struct INftCFC.infoNft","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getNbTypeNFT","outputs":[{"internalType":"uint256","name":"nbPlayer","type":"uint256"},{"internalType":"uint256","name":"nbGoal","type":"uint256"},{"internalType":"uint256","name":"nbGoalCPT","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getNftInfo","outputs":[{"components":[{"internalType":"uint256","name":"indexNft","type":"uint256"},{"internalType":"uint256","name":"indexType","type":"uint256"},{"internalType":"uint256","name":"typeNft","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"prestige","type":"uint256"},{"internalType":"uint256","name":"boost","type":"uint256"}],"internalType":"struct INftCFC.infoNft","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_indexNft","type":"uint256"},{"internalType":"uint256","name":"nbLevel","type":"uint256"}],"name":"levelUp","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_indexNft","type":"uint256"},{"internalType":"uint256","name":"nbLevel","type":"uint256"}],"name":"levelUpExtern","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply_Goal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply_GoalCpt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply_Player","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_typeNft","type":"uint256"}],"name":"mintAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_typeNft","type":"uint256"}],"name":"mintOnceTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_levelMax","type":"uint256"}],"name":"setLevelMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PrestigeMax","type":"uint256"}],"name":"setPrestigeMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceMint","type":"uint256"}],"name":"setPriceMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002600b556040518060400160405280602081526020017f68747470733a2f2f6d65746164617461732e63726f6e6f7366632e636c75622f815250601090805190602001906200005692919062000957565b50600a601255600a6013556115b360145561138860155560006016556101f4601755600060185560376019556000601a553480156200009457600080fd5b5060405162006484380380620064848339818101604052810190620000ba919062000a71565b6040518060400160405280600781526020017f4e465420434643000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f434643000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200013e92919062000957565b5080600390805190602001906200015792919062000957565b50620001686200031360201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600781526020017f4e4654204346430000000000000000000000000000000000000000000000000081525060099080519060200190620001fe92919062000957565b506040518060400160405280600381526020017f4346430000000000000000000000000000000000000000000000000000000000815250600a90805190602001906200024c92919062000957565b506200027673f43d2e70fae713b12f4f47d77b135bfa24b8aaaf601e60016200031c60201b60201c565b50620002a073f43d2e70fae713b12f4f47d77b135bfa24b8aaaf601960026200031c60201b60201c565b50620002ca73f43d2e70fae713b12f4f47d77b135bfa24b8aaaf600560036200031c60201b60201c565b5080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000e5b565b60006001905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200037957600080fd5b60006200038b620005b160201b60201c565b90506200039e83620005ba60201b60201c565b620003e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d79062000b2a565b60405180910390fd5b620003f28585620006da60201b60201c565b60005b84811015620005a457600184036200044457601660008154809291906200041c9062000b85565b91905055506016546011600084815260200190815260200160002060010181905550620004c3565b600284036200048a5760186000815480929190620004629062000b85565b91905055506018546011600084815260200190815260200160002060010181905550620004c2565b601a60008154809291906200049f9062000b85565b9190505550601a5460116000848152602001908152602001600020600101819055505b5b81601160008385620004d6919062000bd2565b81526020019081526020016000206000018190555083601160008385620004fe919062000bd2565b815260200190815260200160002060020181905550600060116000838562000527919062000bd2565b815260200190815260200160002060030181905550600060116000838562000550919062000bd2565b815260200190815260200160002060040181905550600160116000838562000579919062000bd2565b81526020019081526020016000206005018190555080806200059b9062000b85565b915050620003f5565b5060019150509392505050565b60008054905090565b6000600182036200061857601554601654106200060e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006059062000ca5565b60405180910390fd5b60019050620006d5565b600282036200067457601754601854106200066a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006619062000d3d565b60405180910390fd5b60019050620006d5565b60038203620006d057601954601a5410620006c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006bd9062000dd5565b60405180910390fd5b60019050620006d5565b600090505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000747576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820362000782576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007976000848385620008d760201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200082683620008086000866000620008dd60201b60201c565b62000819856200090d60201b60201c565b176200091d60201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200084a57806000819055505050620008d260008483856200094860201b60201c565b505050565b50505050565b60008060e883901c905060e8620008fc8686846200094e60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b828054620009659062000e26565b90600052602060002090601f016020900481019282620009895760008555620009d5565b82601f10620009a457805160ff1916838001178555620009d5565b82800160010185558215620009d5579182015b82811115620009d4578251825591602001919060010190620009b7565b5b509050620009e49190620009e8565b5090565b5b8082111562000a03576000816000905550600101620009e9565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a398262000a0c565b9050919050565b62000a4b8162000a2c565b811462000a5757600080fd5b50565b60008151905062000a6b8162000a40565b92915050565b60006020828403121562000a8a5762000a8962000a07565b5b600062000a9a8482850162000a5a565b91505092915050565b600082825260208201905092915050565b7f5b4552524f525d203a20596f75722074797065206f66206e667420646573697260008201527f656420697320736f6c64206f7574210000000000000000000000000000000000602082015250565b600062000b12602f8362000aa3565b915062000b1f8262000ab4565b604082019050919050565b6000602082019050818103600083015262000b458162000b03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000b928262000b7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000bc75762000bc662000b4c565b5b600182019050919050565b600062000bdf8262000b7b565b915062000bec8362000b7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c245762000c2362000b4c565b5b828201905092915050565b7f5b4552524f525d203a20537570706c7920506c6179657220616c72656164792060008201527f5265616368210000000000000000000000000000000000000000000000000000602082015250565b600062000c8d60268362000aa3565b915062000c9a8262000c2f565b604082019050919050565b6000602082019050818103600083015262000cc08162000c7e565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c20616c726561647920526560008201527f6163682100000000000000000000000000000000000000000000000000000000602082015250565b600062000d2560248362000aa3565b915062000d328262000cc7565b604082019050919050565b6000602082019050818103600083015262000d588162000d16565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c204361707461696e20616c60008201527f7265616479205265616368210000000000000000000000000000000000000000602082015250565b600062000dbd602c8362000aa3565b915062000dca8262000d5f565b604082019050919050565b6000602082019050818103600083015262000df08162000dae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000e3f57607f821691505b60208210810362000e555762000e5462000df7565b5b50919050565b6156198062000e6b6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80638462151c11610167578063bb1609a6116100ce578063d5abeb0111610087578063d5abeb0114610870578063d5ec2d831461088e578063e6f1c752146108be578063e985e9c5146108dc578063ec1dada81461090c578063f8bc4f3a1461093c57610295565b8063bb1609a614610778578063c23dc68f146107a8578063c77b6dfd146107d8578063c87b56dd14610808578063ce9f11a414610838578063d53635df1461085457610295565b8063a5b5904311610120578063a5b59043146106a6578063a6bdd4e7146106c4578063a6f9dae1146106f4578063ab3f220914610710578063b88d4fde14610740578063ba875b3c1461075c57610295565b80638462151c146105be578063918cdd7d146105ee57806395d89b411461062057806399a2557a1461063e578063a0bcfc7f1461066e578063a22cb4651461068a57610295565b80632c4d4d181161020b5780635bbb2177116101c45780635bbb2177146104c45780635eb25a94146104f45780636352211e1461051057806364f22a4f14610540578063680600b31461055e57806370a082311461058e57610295565b80632c4d4d18146104025780632eaeb0ac1461041e57806335a42fa71461043c5780633bba35e11461046c57806342842e0e1461048a5780635a2cdfce146104a657610295565b806313a9831a1161025d57806313a9831a1461035057806318160ddd1461036e5780631a6ef66b1461038c5780631bda11d4146103aa57806323b872dd146103c857806323c86759146103e457610295565b806301ffc9a71461029a57806306fdde03146102ca578063081812fc146102e8578063095ea7b3146103185780630dee18e414610334575b600080fd5b6102b460048036038101906102af9190613c36565b61095a565b6040516102c19190613c7e565b60405180910390f35b6102d26109ec565b6040516102df9190613d32565b60405180910390f35b61030260048036038101906102fd9190613d8a565b610a7e565b60405161030f9190613df8565b60405180910390f35b610332600480360381019061032d9190613e3f565b610afa565b005b61034e60048036038101906103499190613d8a565b610c3b565b005b610358610c9f565b6040516103659190613df8565b60405180910390f35b610376610cc5565b6040516103839190613e8e565b60405180910390f35b610394610cdc565b6040516103a19190613e8e565b60405180910390f35b6103b2610ce2565b6040516103bf9190613e8e565b60405180910390f35b6103e260048036038101906103dd9190613ea9565b610ce8565b005b6103ec61100a565b6040516103f99190613e8e565b60405180910390f35b61041c60048036038101906104179190613efc565b611010565b005b6104266110ae565b6040516104339190613e8e565b60405180910390f35b61045660048036038101906104519190613f29565b6110b4565b6040516104639190613c7e565b60405180910390f35b6104746113c4565b6040516104819190613df8565b60405180910390f35b6104a4600480360381019061049f9190613ea9565b6113ea565b005b6104ae61140a565b6040516104bb9190613e8e565b60405180910390f35b6104de60048036038101906104d991906140c4565b611410565b6040516104eb9190614270565b60405180910390f35b61050e60048036038101906105099190613efc565b6114d1565b005b61052a60048036038101906105259190613d8a565b61156f565b6040516105379190613df8565b60405180910390f35b610548611581565b6040516105559190613e8e565b60405180910390f35b61057860048036038101906105739190614292565b611587565b6040516105859190613c7e565b60405180910390f35b6105a860048036038101906105a39190613efc565b611953565b6040516105b59190613e8e565b60405180910390f35b6105d860048036038101906105d39190613efc565b611a0b565b6040516105e591906143ac565b60405180910390f35b61060860048036038101906106039190613efc565b611b4e565b604051610617939291906143ce565b60405180910390f35b610628611c85565b6040516106359190613d32565b60405180910390f35b61065860048036038101906106539190613f29565b611d17565b60405161066591906143ac565b60405180910390f35b610688600480360381019061068391906144ba565b611f23565b005b6106a4600480360381019061069f919061452f565b611f97565b005b6106ae61210e565b6040516106bb9190613e8e565b60405180910390f35b6106de60048036038101906106d99190613d8a565b612114565b6040516106eb91906145ea565b60405180910390f35b61070e60048036038101906107099190613efc565b6121c5565b005b61072a60048036038101906107259190613f29565b612263565b6040516107379190613c7e565b60405180910390f35b61075a600480360381019061075591906146a6565b6124c4565b005b61077660048036038101906107719190613d8a565b612537565b005b610792600480360381019061078d9190613f29565b61259b565b60405161079f9190613c7e565b60405180910390f35b6107c260048036038101906107bd9190613d8a565b612644565b6040516107cf919061477e565b60405180910390f35b6107f260048036038101906107ed9190613e3f565b6126ae565b6040516107ff9190613c7e565b60405180910390f35b610822600480360381019061081d9190613d8a565b6128f7565b60405161082f9190613d32565b60405180910390f35b610852600480360381019061084d9190613d8a565b6129d1565b005b61086e60048036038101906108699190613efc565b612a35565b005b610878612ad3565b6040516108859190613e8e565b60405180910390f35b6108a860048036038101906108a39190613d8a565b612ad9565b6040516108b591906145ea565b60405180910390f35b6108c6612af1565b6040516108d39190613df8565b60405180910390f35b6108f660048036038101906108f19190614799565b612b17565b6040516109039190613c7e565b60405180910390f35b61092660048036038101906109219190613e3f565b612bab565b6040516109339190613c7e565b60405180910390f35b610944612fd9565b6040516109519190613df8565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109fb90614808565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790614808565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050905090565b6000610a8982612fff565b610abf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b058261156f565b90508073ffffffffffffffffffffffffffffffffffffffff16610b2661305e565b73ffffffffffffffffffffffffffffffffffffffff1614610b8957610b5281610b4d61305e565b612b17565b610b88576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9557600080fd5b80600b8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ccf613066565b6001546000540303905090565b60195481565b60165481565b6000610cf38261306f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d668461313b565b91509150610d7c8187610d7761305e565b61315d565b610dc857610d9186610d8c61305e565b612b17565b610dc7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3b86868660016131a1565b8015610e4657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1485610ef08888876131a7565b7c0200000000000000000000000000000000000000000000000000000000176131cf565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f9a5760006001850190506000600460008381526020019081526020016000205403610f98576000548114610f97578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100286868660016131fa565b505050505050565b60175481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106a57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60185481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d906148ab565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166111668461156f565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b39061493d565b60405180910390fd5b601354601160008581526020019081526020016000206004015403611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906149cf565b60405180910390fd5b6013546001601160008681526020019081526020016000206004015461123c9190614a1e565b036112b45760016012546112509190614a1e565b8260116000868152602001908152602001600020600301546112729190614a1e565b11156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90614ae6565b60405180910390fd5b5b60006011600085815260200190815260200160002060030154905060006011600086815260200190815260200160002060040154905060006011600087815260200190815260200160002060050154905060005b858110156113645760125484101561132e576001846113279190614a1e565b9350611351565b6001935060018361133f9190614a1e565b925060028261134e9190614a1e565b91505b808061135c90614b06565b915050611308565b50826011600088815260200190815260200160002060030181905550816011600088815260200190815260200160002060040181905550806011600088815260200190815260200160002060050181905550600193505050509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611405838383604051806020016040528060008152506124c4565b505050565b601a5481565b606060008251905060008167ffffffffffffffff81111561143457611433613f81565b5b60405190808252806020026020018201604052801561146d57816020015b61145a613aa2565b8152602001906001900390816114525790505b50905060005b8281146114c65761149d8582815181106114905761148f614b4e565b5b6020026020010151612644565b8282815181106114b0576114af614b4e565b5b6020026020010181905250806001019050611473565b508092505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461152b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061157a8261306f565b9050919050565b60155481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090614bef565b60405180910390fd5b81513073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016116549190613df8565b602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116959190614c24565b10156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614cc3565b60405180910390fd5b60005b82518110156117f6578373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061172857611727614b4e565b5b60200260200101516040518263ffffffff1660e01b815260040161174c9190613e8e565b602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190614cf8565b73ffffffffffffffffffffffffffffffffffffffff16146117e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117da90614d97565b60405180910390fd5b80806117ee90614b06565b9150506116d9565b5060005b825181101561194857600183828151811061181857611817614b4e565b5b60200260200101510361185e576001601660008282546118389190614db7565b925050819055506001601560008282546118529190614db7565b92505081905550611912565b600283828151811061187357611872614b4e565b5b6020026020010151036118b9576001601860008282546118939190614db7565b925050819055506001601760008282546118ad9190614db7565b92505081905550611911565b60038382815181106118ce576118cd614b4e565b5b602002602001015103611910576001601a60008282546118ee9190614db7565b925050819055506001601960008282546119089190614db7565b925050819055505b5b5b61193583828151811061192857611927614b4e565b5b6020026020010151613200565b808061194090614b06565b9150506117fa565b506001905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b60606000806000611a1b85611953565b905060008167ffffffffffffffff811115611a3957611a38613f81565b5b604051908082528060200260200182016040528015611a675781602001602082028036833780820191505090505b509050611a72613aa2565b6000611a7c613066565b90505b838614611b4057611a8f8161320e565b91508160400151611b3557600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ada57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b345780838780600101985081518110611b2757611b26614b4e565b5b6020026020010181815250505b5b806001019050611a7f565b508195505050505050919050565b6000806000803073ffffffffffffffffffffffffffffffffffffffff16638462151c866040518263ffffffff1660e01b8152600401611b8d9190613df8565b600060405180830381865afa158015611baa573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bd39190614e82565b9050600080600090505b8251811015611c7b5760116000848381518110611bfd57611bfc614b4e565b5b6020026020010151815260200190815260200160002060020154915060018203611c34578580611c2c90614b06565b965050611c68565b60028203611c4f578480611c4790614b06565b955050611c67565b60038203611c66578380611c6290614b06565b9450505b5b5b8080611c7390614b06565b915050611bdd565b5050509193909250565b606060038054611c9490614808565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc090614808565b8015611d0d5780601f10611ce257610100808354040283529160200191611d0d565b820191906000526020600020905b815481529060010190602001808311611cf057829003601f168201915b5050505050905090565b6060818310611d52576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d5d613239565b9050611d67613066565b851015611d7957611d76613066565b94505b80841115611d85578093505b6000611d9087611953565b905084861015611db3576000868603905081811015611dad578091505b50611db8565b600090505b60008167ffffffffffffffff811115611dd457611dd3613f81565b5b604051908082528060200260200182016040528015611e025781602001602082028036833780820191505090505b50905060008203611e195780945050505050611f1c565b6000611e2488612644565b905060008160400151611e3957816000015190505b60008990505b888114158015611e4f5750848714155b15611f0e57611e5d8161320e565b92508260400151611f0357600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611ea857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f025780848880600101995081518110611ef557611ef4614b4e565b5b6020026020010181815250505b5b806001019050611e3f565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f7d57600080fd5b8060109080519060200190611f93929190613af1565b5050565b611f9f61305e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612003576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061201061305e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120bd61305e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121029190613c7e565b60405180910390a35050565b600b5481565b61211c613b77565b61212582612fff565b612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90614f17565b60405180910390fd5b601160008381526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461221f57600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122bf57600080fd5b60006122c9613239565b90506122d483613242565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a90614fa9565b60405180910390fd5b61231d8585613353565b60005b848110156124b7576001840361236a576016600081548092919061234390614b06565b919050555060165460116000848152602001908152602001600020600101819055506123e3565b600284036123ac576018600081548092919061238590614b06565b919050555060185460116000848152602001908152602001600020600101819055506123e2565b601a60008154809291906123bf90614b06565b9190505550601a5460116000848152602001908152602001600020600101819055505b5b816011600083856123f49190614a1e565b8152602001908152602001600020600001819055508360116000838561241a9190614a1e565b81526020019081526020016000206002018190555060006011600083856124419190614a1e565b81526020019081526020016000206003018190555060006011600083856124689190614a1e565b815260200190815260200160002060040181905550600160116000838561248f9190614a1e565b81526020019081526020016000206005018190555080806124af90614b06565b915050612320565b5060019150509392505050565b6124cf848484610ce8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612531576124fa84848484613525565b612530576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461259157600080fd5b8060128190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612624906148ab565b60405180910390fd5b6126388484846110b4565b50600190509392505050565b61264c613aa2565b612654613aa2565b61265c613066565b831080612670575061266c613239565b8310155b1561267e57809150506126a9565b6126878361320e565b905080604001511561269c57809150506126a9565b6126a583613675565b9150505b919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614bef565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016127909190613e8e565b602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190614cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061503b565b60405180910390fd5b61283082613200565b600182036128715760016016600082825461284b9190614db7565b925050819055506001601560008282546128659190614db7565b925050819055506128f1565b600282036128b25760016018600082825461288c9190614db7565b925050819055506001601760008282546128a69190614db7565b925050819055506128f0565b600382036128ef576001601a60008282546128cd9190614db7565b925050819055506001601960008282546128e79190614db7565b925050819055505b5b5b92915050565b606061290282612fff565b612938576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612942613695565b9050600061294f84612114565b9050600082510361296f57604051806020016040528060008152506129c8565b8161297d8260400151613727565b61298a8360200151613727565b6129978460600151613727565b6129a48560800151613727565b6040516020016129b89594939291906150e3565b6040516020818303038152906040525b92505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2b57600080fd5b8060138190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a8f57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b612ae1613b77565b612aea82612114565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c34906151c1565b60405180910390fd5b600b54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612c9b9190613df8565b602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc9190614c24565b1015612d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1490615253565b60405180910390fd5b6000612d27613239565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a19851b185600b546040518363ffffffff1660e01b8152600401612d88929190615273565b6020604051808303816000875af1158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb91906152b1565b612e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e019061532a565b60405180910390fd5b612e1383613242565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4990614fa9565b60405180910390fd5b612e5d846001613353565b60018303612e9f5760166000815480929190612e7890614b06565b91905055506016546011600083815260200190815260200160002060010181905550612f18565b60028303612ee15760186000815480929190612eba90614b06565b91905055506018546011600083815260200190815260200160002060010181905550612f17565b601a6000815480929190612ef490614b06565b9190505550601a5460116000838152602001908152602001600020600101819055505b5b8060116000838152602001908152602001600020600001819055508260116000838152602001908152602001600020600201819055506001601160008381526020019081526020016000206003018190555060006011600083815260200190815260200160002060040181905550600160116000838152602001908152602001600020600501819055507faf1de8227674b1c9b787cfb161bcec1d494ff36a879c62d1774c79f4de9413f960405160405180910390a1600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008161300a613066565b11158015613019575060005482105b8015613057575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061307e613066565b11613104576000548110156131035760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613101575b600081036130f75760046000836001900393508381526020019081526020016000205490506130cd565b8092505050613136565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131be868684613781565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61320b81600061378a565b50565b613216613aa2565b61323260046000848152602001908152602001600020546139dc565b9050919050565b60008054905090565b60006001820361329b5760155460165410613292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613289906153bc565b60405180910390fd5b6001905061334e565b600282036132f257601754601854106132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e09061544e565b60405180910390fd5b6001905061334e565b6003820361334957601954601a5410613340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613337906154e0565b60405180910390fd5b6001905061334e565b600090505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036133f9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61340660008483856131a1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061347d8361346e60008660006131a7565b61347785613a92565b176131cf565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106134a15780600081905550505061352060008483856131fa565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261354b61305e565b8786866040518563ffffffff1660e01b815260040161356d9493929190615555565b6020604051808303816000875af19250505080156135a957506040513d601f19601f820116820180604052508101906135a691906155b6565b60015b613622573d80600081146135d9576040519150601f19603f3d011682016040523d82523d6000602084013e6135de565b606091505b50600081510361361a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61367d613aa2565b61368e6136898361306f565b6139dc565b9050919050565b6060601080546136a490614808565b80601f01602080910402602001604051908101604052809291908181526020018280546136d090614808565b801561371d5780601f106136f25761010080835404028352916020019161371d565b820191906000526020600020905b81548152906001019060200180831161370057829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561376d57600183039250600a81066030018353600a8104905061374d565b508181036020830392508083525050919050565b60009392505050565b60006137958361306f565b905060008190506000806137a88661313b565b915091508415613811576137c481846137bf61305e565b61315d565b613810576137d9836137d461305e565b612b17565b61380f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61381f8360008860016131a1565b801561382a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506138d28361388f856000886131a7565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176131cf565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036139585760006001870190506000600460008381526020019081526020016000205403613956576000548114613955578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139c28360008860016131fa565b600160008154809291906001019190505550505050505050565b6139e4613aa2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054613afd90614808565b90600052602060002090601f016020900481019282613b1f5760008555613b66565b82601f10613b3857805160ff1916838001178555613b66565b82800160010185558215613b66579182015b82811115613b65578251825591602001919060010190613b4a565b5b509050613b739190613bad565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613bc6576000816000905550600101613bae565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c1381613bde565b8114613c1e57600080fd5b50565b600081359050613c3081613c0a565b92915050565b600060208284031215613c4c57613c4b613bd4565b5b6000613c5a84828501613c21565b91505092915050565b60008115159050919050565b613c7881613c63565b82525050565b6000602082019050613c936000830184613c6f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cd3578082015181840152602081019050613cb8565b83811115613ce2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d0482613c99565b613d0e8185613ca4565b9350613d1e818560208601613cb5565b613d2781613ce8565b840191505092915050565b60006020820190508181036000830152613d4c8184613cf9565b905092915050565b6000819050919050565b613d6781613d54565b8114613d7257600080fd5b50565b600081359050613d8481613d5e565b92915050565b600060208284031215613da057613d9f613bd4565b5b6000613dae84828501613d75565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613de282613db7565b9050919050565b613df281613dd7565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b613e1c81613dd7565b8114613e2757600080fd5b50565b600081359050613e3981613e13565b92915050565b60008060408385031215613e5657613e55613bd4565b5b6000613e6485828601613e2a565b9250506020613e7585828601613d75565b9150509250929050565b613e8881613d54565b82525050565b6000602082019050613ea36000830184613e7f565b92915050565b600080600060608486031215613ec257613ec1613bd4565b5b6000613ed086828701613e2a565b9350506020613ee186828701613e2a565b9250506040613ef286828701613d75565b9150509250925092565b600060208284031215613f1257613f11613bd4565b5b6000613f2084828501613e2a565b91505092915050565b600080600060608486031215613f4257613f41613bd4565b5b6000613f5086828701613e2a565b9350506020613f6186828701613d75565b9250506040613f7286828701613d75565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fb982613ce8565b810181811067ffffffffffffffff82111715613fd857613fd7613f81565b5b80604052505050565b6000613feb613bca565b9050613ff78282613fb0565b919050565b600067ffffffffffffffff82111561401757614016613f81565b5b602082029050602081019050919050565b600080fd5b600061404061403b84613ffc565b613fe1565b9050808382526020820190506020840283018581111561406357614062614028565b5b835b8181101561408c57806140788882613d75565b845260208401935050602081019050614065565b5050509392505050565b600082601f8301126140ab576140aa613f7c565b5b81356140bb84826020860161402d565b91505092915050565b6000602082840312156140da576140d9613bd4565b5b600082013567ffffffffffffffff8111156140f8576140f7613bd9565b5b61410484828501614096565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61414281613dd7565b82525050565b600067ffffffffffffffff82169050919050565b61416581614148565b82525050565b61417481613c63565b82525050565b600062ffffff82169050919050565b6141928161417a565b82525050565b6080820160008201516141ae6000850182614139565b5060208201516141c1602085018261415c565b5060408201516141d4604085018261416b565b5060608201516141e76060850182614189565b50505050565b60006141f98383614198565b60808301905092915050565b6000602082019050919050565b600061421d8261410d565b6142278185614118565b935061423283614129565b8060005b8381101561426357815161424a88826141ed565b975061425583614205565b925050600181019050614236565b5085935050505092915050565b6000602082019050818103600083015261428a8184614212565b905092915050565b600080604083850312156142a9576142a8613bd4565b5b60006142b785828601613e2a565b925050602083013567ffffffffffffffff8111156142d8576142d7613bd9565b5b6142e485828601614096565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61432381613d54565b82525050565b6000614335838361431a565b60208301905092915050565b6000602082019050919050565b6000614359826142ee565b61436381856142f9565b935061436e8361430a565b8060005b8381101561439f5781516143868882614329565b975061439183614341565b925050600181019050614372565b5085935050505092915050565b600060208201905081810360008301526143c6818461434e565b905092915050565b60006060820190506143e36000830186613e7f565b6143f06020830185613e7f565b6143fd6040830184613e7f565b949350505050565b600080fd5b600067ffffffffffffffff82111561442557614424613f81565b5b61442e82613ce8565b9050602081019050919050565b82818337600083830152505050565b600061445d6144588461440a565b613fe1565b90508281526020810184848401111561447957614478614405565b5b61448484828561443b565b509392505050565b600082601f8301126144a1576144a0613f7c565b5b81356144b184826020860161444a565b91505092915050565b6000602082840312156144d0576144cf613bd4565b5b600082013567ffffffffffffffff8111156144ee576144ed613bd9565b5b6144fa8482850161448c565b91505092915050565b61450c81613c63565b811461451757600080fd5b50565b60008135905061452981614503565b92915050565b6000806040838503121561454657614545613bd4565b5b600061455485828601613e2a565b92505060206145658582860161451a565b9150509250929050565b60c082016000820151614585600085018261431a565b506020820151614598602085018261431a565b5060408201516145ab604085018261431a565b5060608201516145be606085018261431a565b5060808201516145d1608085018261431a565b5060a08201516145e460a085018261431a565b50505050565b600060c0820190506145ff600083018461456f565b92915050565b600067ffffffffffffffff8211156146205761461f613f81565b5b61462982613ce8565b9050602081019050919050565b600061464961464484614605565b613fe1565b90508281526020810184848401111561466557614664614405565b5b61467084828561443b565b509392505050565b600082601f83011261468d5761468c613f7c565b5b813561469d848260208601614636565b91505092915050565b600080600080608085870312156146c0576146bf613bd4565b5b60006146ce87828801613e2a565b94505060206146df87828801613e2a565b93505060406146f087828801613d75565b925050606085013567ffffffffffffffff81111561471157614710613bd9565b5b61471d87828801614678565b91505092959194509250565b60808201600082015161473f6000850182614139565b506020820151614752602085018261415c565b506040820151614765604085018261416b565b5060608201516147786060850182614189565b50505050565b60006080820190506147936000830184614729565b92915050565b600080604083850312156147b0576147af613bd4565b5b60006147be85828601613e2a565b92505060206147cf85828601613e2a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061482057607f821691505b602082108103614833576148326147d9565b5b50919050565b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72205570677261646500000000000000000000000000602082015250565b6000614895603383613ca4565b91506148a082614839565b604082019050919050565b600060208201905081810360008301526148c481614888565b9050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865206f776e65722060008201527f6f662074686973204e4654204346432100000000000000000000000000000000602082015250565b6000614927603083613ca4565b9150614932826148cb565b604082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b7f5b4552524f525d203a20596f752061726520616c72656164792050726573746960008201527f6765204d61782100000000000000000000000000000000000000000000000000602082015250565b60006149b9602783613ca4565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a2982613d54565b9150614a3483613d54565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6957614a686149ef565b5b828201905092915050565b7f5b4552524f525d203a20596f7520617265206e656564206d6f7265206c65766560008201527f6c207468616e20796f752063616e210000000000000000000000000000000000602082015250565b6000614ad0602f83613ca4565b9150614adb82614a74565b604082019050919050565b60006020820190508181036000830152614aff81614ac3565b9050919050565b6000614b1182613d54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b4357614b426149ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72204275726e00000000000000000000000000000000602082015250565b6000614bd9603083613ca4565b9150614be482614b7d565b604082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b600081519050614c1e81613d5e565b92915050565b600060208284031215614c3a57614c39613bd4565b5b6000614c4884828501614c0f565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204260008201527f616c6c2100000000000000000000000000000000000000000000000000000000602082015250565b6000614cad602483613ca4565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b600081519050614cf281613e13565b92915050565b600060208284031215614d0e57614d0d613bd4565b5b6000614d1c84828501614ce3565b91505092915050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f617665204f6e6520696e646578204e46542120286275726e2900000000000000602082015250565b6000614d81603983613ca4565b9150614d8c82614d25565b604082019050919050565b60006020820190508181036000830152614db081614d74565b9050919050565b6000614dc282613d54565b9150614dcd83613d54565b925082821015614de057614ddf6149ef565b5b828203905092915050565b6000614dfe614df984613ffc565b613fe1565b90508083825260208201905060208402830185811115614e2157614e20614028565b5b835b81811015614e4a5780614e368882614c0f565b845260208401935050602081019050614e23565b5050509392505050565b600082601f830112614e6957614e68613f7c565b5b8151614e79848260208601614deb565b91505092915050565b600060208284031215614e9857614e97613bd4565b5b600082015167ffffffffffffffff811115614eb657614eb5613bd9565b5b614ec284828501614e54565b91505092915050565b7f5b4552524f525d203a20496e646578204e6f7420666f756e6400000000000000600082015250565b6000614f01601983613ca4565b9150614f0c82614ecb565b602082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f5b4552524f525d203a20596f75722074797065206f66206e667420646573697260008201527f656420697320736f6c64206f7574210000000000000000000000000000000000602082015250565b6000614f93602f83613ca4565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f6176652074686973204e46542100000000000000000000000000000000000000602082015250565b6000615025602d83613ca4565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b600081905092915050565b600061507182613c99565b61507b818561505b565b935061508b818560208601613cb5565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006150cd60018361505b565b91506150d882615097565b600182019050919050565b60006150ef8288615066565b91506150fb8287615066565b9150615106826150c0565b91506151128286615066565b915061511d826150c0565b91506151298285615066565b9150615134826150c0565b91506151408284615066565b91508190509695505050505050565b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72204d696e7400000000000000000000000000000000602082015250565b60006151ab603083613ca4565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204a60008201527f65746f6e21000000000000000000000000000000000000000000000000000000602082015250565b600061523d602583613ca4565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b60006040820190506152886000830185613de9565b6152956020830184613e7f565b9392505050565b6000815190506152ab81614503565b92915050565b6000602082840312156152c7576152c6613bd4565b5b60006152d58482850161529c565b91505092915050565b7f5b4552524f525d203a204275726e204a65746f6e204661696c21000000000000600082015250565b6000615314601a83613ca4565b915061531f826152de565b602082019050919050565b6000602082019050818103600083015261534381615307565b9050919050565b7f5b4552524f525d203a20537570706c7920506c6179657220616c72656164792060008201527f5265616368210000000000000000000000000000000000000000000000000000602082015250565b60006153a6602683613ca4565b91506153b18261534a565b604082019050919050565b600060208201905081810360008301526153d581615399565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c20616c726561647920526560008201527f6163682100000000000000000000000000000000000000000000000000000000602082015250565b6000615438602483613ca4565b9150615443826153dc565b604082019050919050565b600060208201905081810360008301526154678161542b565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c204361707461696e20616c60008201527f7265616479205265616368210000000000000000000000000000000000000000602082015250565b60006154ca602c83613ca4565b91506154d58261546e565b604082019050919050565b600060208201905081810360008301526154f9816154bd565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061552782615500565b615531818561550b565b9350615541818560208601613cb5565b61554a81613ce8565b840191505092915050565b600060808201905061556a6000830187613de9565b6155776020830186613de9565b6155846040830185613e7f565b8181036060830152615596818461551c565b905095945050505050565b6000815190506155b081613c0a565b92915050565b6000602082840312156155cc576155cb613bd4565b5b60006155da848285016155a1565b9150509291505056fea2646970667358221220cb6623592a29e36a92b3b83ba538d4c3cd7181f44c5915afe42cad3d47d90c8964736f6c634300080e00330000000000000000000000003909da30e2b12a9fac09c0a4db963d7f707c98ff
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102955760003560e01c80638462151c11610167578063bb1609a6116100ce578063d5abeb0111610087578063d5abeb0114610870578063d5ec2d831461088e578063e6f1c752146108be578063e985e9c5146108dc578063ec1dada81461090c578063f8bc4f3a1461093c57610295565b8063bb1609a614610778578063c23dc68f146107a8578063c77b6dfd146107d8578063c87b56dd14610808578063ce9f11a414610838578063d53635df1461085457610295565b8063a5b5904311610120578063a5b59043146106a6578063a6bdd4e7146106c4578063a6f9dae1146106f4578063ab3f220914610710578063b88d4fde14610740578063ba875b3c1461075c57610295565b80638462151c146105be578063918cdd7d146105ee57806395d89b411461062057806399a2557a1461063e578063a0bcfc7f1461066e578063a22cb4651461068a57610295565b80632c4d4d181161020b5780635bbb2177116101c45780635bbb2177146104c45780635eb25a94146104f45780636352211e1461051057806364f22a4f14610540578063680600b31461055e57806370a082311461058e57610295565b80632c4d4d18146104025780632eaeb0ac1461041e57806335a42fa71461043c5780633bba35e11461046c57806342842e0e1461048a5780635a2cdfce146104a657610295565b806313a9831a1161025d57806313a9831a1461035057806318160ddd1461036e5780631a6ef66b1461038c5780631bda11d4146103aa57806323b872dd146103c857806323c86759146103e457610295565b806301ffc9a71461029a57806306fdde03146102ca578063081812fc146102e8578063095ea7b3146103185780630dee18e414610334575b600080fd5b6102b460048036038101906102af9190613c36565b61095a565b6040516102c19190613c7e565b60405180910390f35b6102d26109ec565b6040516102df9190613d32565b60405180910390f35b61030260048036038101906102fd9190613d8a565b610a7e565b60405161030f9190613df8565b60405180910390f35b610332600480360381019061032d9190613e3f565b610afa565b005b61034e60048036038101906103499190613d8a565b610c3b565b005b610358610c9f565b6040516103659190613df8565b60405180910390f35b610376610cc5565b6040516103839190613e8e565b60405180910390f35b610394610cdc565b6040516103a19190613e8e565b60405180910390f35b6103b2610ce2565b6040516103bf9190613e8e565b60405180910390f35b6103e260048036038101906103dd9190613ea9565b610ce8565b005b6103ec61100a565b6040516103f99190613e8e565b60405180910390f35b61041c60048036038101906104179190613efc565b611010565b005b6104266110ae565b6040516104339190613e8e565b60405180910390f35b61045660048036038101906104519190613f29565b6110b4565b6040516104639190613c7e565b60405180910390f35b6104746113c4565b6040516104819190613df8565b60405180910390f35b6104a4600480360381019061049f9190613ea9565b6113ea565b005b6104ae61140a565b6040516104bb9190613e8e565b60405180910390f35b6104de60048036038101906104d991906140c4565b611410565b6040516104eb9190614270565b60405180910390f35b61050e60048036038101906105099190613efc565b6114d1565b005b61052a60048036038101906105259190613d8a565b61156f565b6040516105379190613df8565b60405180910390f35b610548611581565b6040516105559190613e8e565b60405180910390f35b61057860048036038101906105739190614292565b611587565b6040516105859190613c7e565b60405180910390f35b6105a860048036038101906105a39190613efc565b611953565b6040516105b59190613e8e565b60405180910390f35b6105d860048036038101906105d39190613efc565b611a0b565b6040516105e591906143ac565b60405180910390f35b61060860048036038101906106039190613efc565b611b4e565b604051610617939291906143ce565b60405180910390f35b610628611c85565b6040516106359190613d32565b60405180910390f35b61065860048036038101906106539190613f29565b611d17565b60405161066591906143ac565b60405180910390f35b610688600480360381019061068391906144ba565b611f23565b005b6106a4600480360381019061069f919061452f565b611f97565b005b6106ae61210e565b6040516106bb9190613e8e565b60405180910390f35b6106de60048036038101906106d99190613d8a565b612114565b6040516106eb91906145ea565b60405180910390f35b61070e60048036038101906107099190613efc565b6121c5565b005b61072a60048036038101906107259190613f29565b612263565b6040516107379190613c7e565b60405180910390f35b61075a600480360381019061075591906146a6565b6124c4565b005b61077660048036038101906107719190613d8a565b612537565b005b610792600480360381019061078d9190613f29565b61259b565b60405161079f9190613c7e565b60405180910390f35b6107c260048036038101906107bd9190613d8a565b612644565b6040516107cf919061477e565b60405180910390f35b6107f260048036038101906107ed9190613e3f565b6126ae565b6040516107ff9190613c7e565b60405180910390f35b610822600480360381019061081d9190613d8a565b6128f7565b60405161082f9190613d32565b60405180910390f35b610852600480360381019061084d9190613d8a565b6129d1565b005b61086e60048036038101906108699190613efc565b612a35565b005b610878612ad3565b6040516108859190613e8e565b60405180910390f35b6108a860048036038101906108a39190613d8a565b612ad9565b6040516108b591906145ea565b60405180910390f35b6108c6612af1565b6040516108d39190613df8565b60405180910390f35b6108f660048036038101906108f19190614799565b612b17565b6040516109039190613c7e565b60405180910390f35b61092660048036038101906109219190613e3f565b612bab565b6040516109339190613c7e565b60405180910390f35b610944612fd9565b6040516109519190613df8565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109fb90614808565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2790614808565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050905090565b6000610a8982612fff565b610abf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b058261156f565b90508073ffffffffffffffffffffffffffffffffffffffff16610b2661305e565b73ffffffffffffffffffffffffffffffffffffffff1614610b8957610b5281610b4d61305e565b612b17565b610b88576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9557600080fd5b80600b8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ccf613066565b6001546000540303905090565b60195481565b60165481565b6000610cf38261306f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d668461313b565b91509150610d7c8187610d7761305e565b61315d565b610dc857610d9186610d8c61305e565b612b17565b610dc7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3b86868660016131a1565b8015610e4657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f1485610ef08888876131a7565b7c0200000000000000000000000000000000000000000000000000000000176131cf565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f9a5760006001850190506000600460008381526020019081526020016000205403610f98576000548114610f97578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461100286868660016131fa565b505050505050565b60175481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106a57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60185481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d906148ab565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166111668461156f565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b39061493d565b60405180910390fd5b601354601160008581526020019081526020016000206004015403611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906149cf565b60405180910390fd5b6013546001601160008681526020019081526020016000206004015461123c9190614a1e565b036112b45760016012546112509190614a1e565b8260116000868152602001908152602001600020600301546112729190614a1e565b11156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90614ae6565b60405180910390fd5b5b60006011600085815260200190815260200160002060030154905060006011600086815260200190815260200160002060040154905060006011600087815260200190815260200160002060050154905060005b858110156113645760125484101561132e576001846113279190614a1e565b9350611351565b6001935060018361133f9190614a1e565b925060028261134e9190614a1e565b91505b808061135c90614b06565b915050611308565b50826011600088815260200190815260200160002060030181905550816011600088815260200190815260200160002060040181905550806011600088815260200190815260200160002060050181905550600193505050509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611405838383604051806020016040528060008152506124c4565b505050565b601a5481565b606060008251905060008167ffffffffffffffff81111561143457611433613f81565b5b60405190808252806020026020018201604052801561146d57816020015b61145a613aa2565b8152602001906001900390816114525790505b50905060005b8281146114c65761149d8582815181106114905761148f614b4e565b5b6020026020010151612644565b8282815181106114b0576114af614b4e565b5b6020026020010181905250806001019050611473565b508092505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461152b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061157a8261306f565b9050919050565b60155481565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090614bef565b60405180910390fd5b81513073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016116549190613df8565b602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116959190614c24565b10156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614cc3565b60405180910390fd5b60005b82518110156117f6578373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061172857611727614b4e565b5b60200260200101516040518263ffffffff1660e01b815260040161174c9190613e8e565b602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190614cf8565b73ffffffffffffffffffffffffffffffffffffffff16146117e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117da90614d97565b60405180910390fd5b80806117ee90614b06565b9150506116d9565b5060005b825181101561194857600183828151811061181857611817614b4e565b5b60200260200101510361185e576001601660008282546118389190614db7565b925050819055506001601560008282546118529190614db7565b92505081905550611912565b600283828151811061187357611872614b4e565b5b6020026020010151036118b9576001601860008282546118939190614db7565b925050819055506001601760008282546118ad9190614db7565b92505081905550611911565b60038382815181106118ce576118cd614b4e565b5b602002602001015103611910576001601a60008282546118ee9190614db7565b925050819055506001601960008282546119089190614db7565b925050819055505b5b5b61193583828151811061192857611927614b4e565b5b6020026020010151613200565b808061194090614b06565b9150506117fa565b506001905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ba576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b60606000806000611a1b85611953565b905060008167ffffffffffffffff811115611a3957611a38613f81565b5b604051908082528060200260200182016040528015611a675781602001602082028036833780820191505090505b509050611a72613aa2565b6000611a7c613066565b90505b838614611b4057611a8f8161320e565b91508160400151611b3557600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ada57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b345780838780600101985081518110611b2757611b26614b4e565b5b6020026020010181815250505b5b806001019050611a7f565b508195505050505050919050565b6000806000803073ffffffffffffffffffffffffffffffffffffffff16638462151c866040518263ffffffff1660e01b8152600401611b8d9190613df8565b600060405180830381865afa158015611baa573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bd39190614e82565b9050600080600090505b8251811015611c7b5760116000848381518110611bfd57611bfc614b4e565b5b6020026020010151815260200190815260200160002060020154915060018203611c34578580611c2c90614b06565b965050611c68565b60028203611c4f578480611c4790614b06565b955050611c67565b60038203611c66578380611c6290614b06565b9450505b5b5b8080611c7390614b06565b915050611bdd565b5050509193909250565b606060038054611c9490614808565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc090614808565b8015611d0d5780601f10611ce257610100808354040283529160200191611d0d565b820191906000526020600020905b815481529060010190602001808311611cf057829003601f168201915b5050505050905090565b6060818310611d52576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d5d613239565b9050611d67613066565b851015611d7957611d76613066565b94505b80841115611d85578093505b6000611d9087611953565b905084861015611db3576000868603905081811015611dad578091505b50611db8565b600090505b60008167ffffffffffffffff811115611dd457611dd3613f81565b5b604051908082528060200260200182016040528015611e025781602001602082028036833780820191505090505b50905060008203611e195780945050505050611f1c565b6000611e2488612644565b905060008160400151611e3957816000015190505b60008990505b888114158015611e4f5750848714155b15611f0e57611e5d8161320e565b92508260400151611f0357600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611ea857826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f025780848880600101995081518110611ef557611ef4614b4e565b5b6020026020010181815250505b5b806001019050611e3f565b508583528296505050505050505b9392505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f7d57600080fd5b8060109080519060200190611f93929190613af1565b5050565b611f9f61305e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612003576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061201061305e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120bd61305e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121029190613c7e565b60405180910390a35050565b600b5481565b61211c613b77565b61212582612fff565b612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90614f17565b60405180910390fd5b601160008381526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461221f57600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122bf57600080fd5b60006122c9613239565b90506122d483613242565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a90614fa9565b60405180910390fd5b61231d8585613353565b60005b848110156124b7576001840361236a576016600081548092919061234390614b06565b919050555060165460116000848152602001908152602001600020600101819055506123e3565b600284036123ac576018600081548092919061238590614b06565b919050555060185460116000848152602001908152602001600020600101819055506123e2565b601a60008154809291906123bf90614b06565b9190505550601a5460116000848152602001908152602001600020600101819055505b5b816011600083856123f49190614a1e565b8152602001908152602001600020600001819055508360116000838561241a9190614a1e565b81526020019081526020016000206002018190555060006011600083856124419190614a1e565b81526020019081526020016000206003018190555060006011600083856124689190614a1e565b815260200190815260200160002060040181905550600160116000838561248f9190614a1e565b81526020019081526020016000206005018190555080806124af90614b06565b915050612320565b5060019150509392505050565b6124cf848484610ce8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612531576124fa84848484613525565b612530576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461259157600080fd5b8060128190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612624906148ab565b60405180910390fd5b6126388484846110b4565b50600190509392505050565b61264c613aa2565b612654613aa2565b61265c613066565b831080612670575061266c613239565b8310155b1561267e57809150506126a9565b6126878361320e565b905080604001511561269c57809150506126a9565b6126a583613675565b9150505b919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614bef565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016127909190613e8e565b602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190614cf8565b73ffffffffffffffffffffffffffffffffffffffff1614612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061503b565b60405180910390fd5b61283082613200565b600182036128715760016016600082825461284b9190614db7565b925050819055506001601560008282546128659190614db7565b925050819055506128f1565b600282036128b25760016018600082825461288c9190614db7565b925050819055506001601760008282546128a69190614db7565b925050819055506128f0565b600382036128ef576001601a60008282546128cd9190614db7565b925050819055506001601960008282546128e79190614db7565b925050819055505b5b5b92915050565b606061290282612fff565b612938576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612942613695565b9050600061294f84612114565b9050600082510361296f57604051806020016040528060008152506129c8565b8161297d8260400151613727565b61298a8360200151613727565b6129978460600151613727565b6129a48560800151613727565b6040516020016129b89594939291906150e3565b6040516020818303038152906040525b92505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2b57600080fd5b8060138190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a8f57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b612ae1613b77565b612aea82612114565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c34906151c1565b60405180910390fd5b600b54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612c9b9190613df8565b602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc9190614c24565b1015612d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1490615253565b60405180910390fd5b6000612d27613239565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a19851b185600b546040518363ffffffff1660e01b8152600401612d88929190615273565b6020604051808303816000875af1158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb91906152b1565b612e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e019061532a565b60405180910390fd5b612e1383613242565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4990614fa9565b60405180910390fd5b612e5d846001613353565b60018303612e9f5760166000815480929190612e7890614b06565b91905055506016546011600083815260200190815260200160002060010181905550612f18565b60028303612ee15760186000815480929190612eba90614b06565b91905055506018546011600083815260200190815260200160002060010181905550612f17565b601a6000815480929190612ef490614b06565b9190505550601a5460116000838152602001908152602001600020600101819055505b5b8060116000838152602001908152602001600020600001819055508260116000838152602001908152602001600020600201819055506001601160008381526020019081526020016000206003018190555060006011600083815260200190815260200160002060040181905550600160116000838152602001908152602001600020600501819055507faf1de8227674b1c9b787cfb161bcec1d494ff36a879c62d1774c79f4de9413f960405160405180910390a1600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008161300a613066565b11158015613019575060005482105b8015613057575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061307e613066565b11613104576000548110156131035760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613101575b600081036130f75760046000836001900393508381526020019081526020016000205490506130cd565b8092505050613136565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86131be868684613781565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61320b81600061378a565b50565b613216613aa2565b61323260046000848152602001908152602001600020546139dc565b9050919050565b60008054905090565b60006001820361329b5760155460165410613292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613289906153bc565b60405180910390fd5b6001905061334e565b600282036132f257601754601854106132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e09061544e565b60405180910390fd5b6001905061334e565b6003820361334957601954601a5410613340576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613337906154e0565b60405180910390fd5b6001905061334e565b600090505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133bf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036133f9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61340660008483856131a1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061347d8361346e60008660006131a7565b61347785613a92565b176131cf565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106134a15780600081905550505061352060008483856131fa565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261354b61305e565b8786866040518563ffffffff1660e01b815260040161356d9493929190615555565b6020604051808303816000875af19250505080156135a957506040513d601f19601f820116820180604052508101906135a691906155b6565b60015b613622573d80600081146135d9576040519150601f19603f3d011682016040523d82523d6000602084013e6135de565b606091505b50600081510361361a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61367d613aa2565b61368e6136898361306f565b6139dc565b9050919050565b6060601080546136a490614808565b80601f01602080910402602001604051908101604052809291908181526020018280546136d090614808565b801561371d5780601f106136f25761010080835404028352916020019161371d565b820191906000526020600020905b81548152906001019060200180831161370057829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561376d57600183039250600a81066030018353600a8104905061374d565b508181036020830392508083525050919050565b60009392505050565b60006137958361306f565b905060008190506000806137a88661313b565b915091508415613811576137c481846137bf61305e565b61315d565b613810576137d9836137d461305e565b612b17565b61380f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61381f8360008860016131a1565b801561382a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506138d28361388f856000886131a7565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176131cf565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036139585760006001870190506000600460008381526020019081526020016000205403613956576000548114613955578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139c28360008860016131fa565b600160008154809291906001019190505550505050505050565b6139e4613aa2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054613afd90614808565b90600052602060002090601f016020900481019282613b1f5760008555613b66565b82601f10613b3857805160ff1916838001178555613b66565b82800160010185558215613b66579182015b82811115613b65578251825591602001919060010190613b4a565b5b509050613b739190613bad565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115613bc6576000816000905550600101613bae565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c1381613bde565b8114613c1e57600080fd5b50565b600081359050613c3081613c0a565b92915050565b600060208284031215613c4c57613c4b613bd4565b5b6000613c5a84828501613c21565b91505092915050565b60008115159050919050565b613c7881613c63565b82525050565b6000602082019050613c936000830184613c6f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cd3578082015181840152602081019050613cb8565b83811115613ce2576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d0482613c99565b613d0e8185613ca4565b9350613d1e818560208601613cb5565b613d2781613ce8565b840191505092915050565b60006020820190508181036000830152613d4c8184613cf9565b905092915050565b6000819050919050565b613d6781613d54565b8114613d7257600080fd5b50565b600081359050613d8481613d5e565b92915050565b600060208284031215613da057613d9f613bd4565b5b6000613dae84828501613d75565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613de282613db7565b9050919050565b613df281613dd7565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b613e1c81613dd7565b8114613e2757600080fd5b50565b600081359050613e3981613e13565b92915050565b60008060408385031215613e5657613e55613bd4565b5b6000613e6485828601613e2a565b9250506020613e7585828601613d75565b9150509250929050565b613e8881613d54565b82525050565b6000602082019050613ea36000830184613e7f565b92915050565b600080600060608486031215613ec257613ec1613bd4565b5b6000613ed086828701613e2a565b9350506020613ee186828701613e2a565b9250506040613ef286828701613d75565b9150509250925092565b600060208284031215613f1257613f11613bd4565b5b6000613f2084828501613e2a565b91505092915050565b600080600060608486031215613f4257613f41613bd4565b5b6000613f5086828701613e2a565b9350506020613f6186828701613d75565b9250506040613f7286828701613d75565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fb982613ce8565b810181811067ffffffffffffffff82111715613fd857613fd7613f81565b5b80604052505050565b6000613feb613bca565b9050613ff78282613fb0565b919050565b600067ffffffffffffffff82111561401757614016613f81565b5b602082029050602081019050919050565b600080fd5b600061404061403b84613ffc565b613fe1565b9050808382526020820190506020840283018581111561406357614062614028565b5b835b8181101561408c57806140788882613d75565b845260208401935050602081019050614065565b5050509392505050565b600082601f8301126140ab576140aa613f7c565b5b81356140bb84826020860161402d565b91505092915050565b6000602082840312156140da576140d9613bd4565b5b600082013567ffffffffffffffff8111156140f8576140f7613bd9565b5b61410484828501614096565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61414281613dd7565b82525050565b600067ffffffffffffffff82169050919050565b61416581614148565b82525050565b61417481613c63565b82525050565b600062ffffff82169050919050565b6141928161417a565b82525050565b6080820160008201516141ae6000850182614139565b5060208201516141c1602085018261415c565b5060408201516141d4604085018261416b565b5060608201516141e76060850182614189565b50505050565b60006141f98383614198565b60808301905092915050565b6000602082019050919050565b600061421d8261410d565b6142278185614118565b935061423283614129565b8060005b8381101561426357815161424a88826141ed565b975061425583614205565b925050600181019050614236565b5085935050505092915050565b6000602082019050818103600083015261428a8184614212565b905092915050565b600080604083850312156142a9576142a8613bd4565b5b60006142b785828601613e2a565b925050602083013567ffffffffffffffff8111156142d8576142d7613bd9565b5b6142e485828601614096565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61432381613d54565b82525050565b6000614335838361431a565b60208301905092915050565b6000602082019050919050565b6000614359826142ee565b61436381856142f9565b935061436e8361430a565b8060005b8381101561439f5781516143868882614329565b975061439183614341565b925050600181019050614372565b5085935050505092915050565b600060208201905081810360008301526143c6818461434e565b905092915050565b60006060820190506143e36000830186613e7f565b6143f06020830185613e7f565b6143fd6040830184613e7f565b949350505050565b600080fd5b600067ffffffffffffffff82111561442557614424613f81565b5b61442e82613ce8565b9050602081019050919050565b82818337600083830152505050565b600061445d6144588461440a565b613fe1565b90508281526020810184848401111561447957614478614405565b5b61448484828561443b565b509392505050565b600082601f8301126144a1576144a0613f7c565b5b81356144b184826020860161444a565b91505092915050565b6000602082840312156144d0576144cf613bd4565b5b600082013567ffffffffffffffff8111156144ee576144ed613bd9565b5b6144fa8482850161448c565b91505092915050565b61450c81613c63565b811461451757600080fd5b50565b60008135905061452981614503565b92915050565b6000806040838503121561454657614545613bd4565b5b600061455485828601613e2a565b92505060206145658582860161451a565b9150509250929050565b60c082016000820151614585600085018261431a565b506020820151614598602085018261431a565b5060408201516145ab604085018261431a565b5060608201516145be606085018261431a565b5060808201516145d1608085018261431a565b5060a08201516145e460a085018261431a565b50505050565b600060c0820190506145ff600083018461456f565b92915050565b600067ffffffffffffffff8211156146205761461f613f81565b5b61462982613ce8565b9050602081019050919050565b600061464961464484614605565b613fe1565b90508281526020810184848401111561466557614664614405565b5b61467084828561443b565b509392505050565b600082601f83011261468d5761468c613f7c565b5b813561469d848260208601614636565b91505092915050565b600080600080608085870312156146c0576146bf613bd4565b5b60006146ce87828801613e2a565b94505060206146df87828801613e2a565b93505060406146f087828801613d75565b925050606085013567ffffffffffffffff81111561471157614710613bd9565b5b61471d87828801614678565b91505092959194509250565b60808201600082015161473f6000850182614139565b506020820151614752602085018261415c565b506040820151614765604085018261416b565b5060608201516147786060850182614189565b50505050565b60006080820190506147936000830184614729565b92915050565b600080604083850312156147b0576147af613bd4565b5b60006147be85828601613e2a565b92505060206147cf85828601613e2a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061482057607f821691505b602082108103614833576148326147d9565b5b50919050565b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72205570677261646500000000000000000000000000602082015250565b6000614895603383613ca4565b91506148a082614839565b604082019050919050565b600060208201905081810360008301526148c481614888565b9050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865206f776e65722060008201527f6f662074686973204e4654204346432100000000000000000000000000000000602082015250565b6000614927603083613ca4565b9150614932826148cb565b604082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b7f5b4552524f525d203a20596f752061726520616c72656164792050726573746960008201527f6765204d61782100000000000000000000000000000000000000000000000000602082015250565b60006149b9602783613ca4565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a2982613d54565b9150614a3483613d54565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a6957614a686149ef565b5b828201905092915050565b7f5b4552524f525d203a20596f7520617265206e656564206d6f7265206c65766560008201527f6c207468616e20796f752063616e210000000000000000000000000000000000602082015250565b6000614ad0602f83613ca4565b9150614adb82614a74565b604082019050919050565b60006020820190508181036000830152614aff81614ac3565b9050919050565b6000614b1182613d54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b4357614b426149ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72204275726e00000000000000000000000000000000602082015250565b6000614bd9603083613ca4565b9150614be482614b7d565b604082019050919050565b60006020820190508181036000830152614c0881614bcc565b9050919050565b600081519050614c1e81613d5e565b92915050565b600060208284031215614c3a57614c39613bd4565b5b6000614c4884828501614c0f565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204260008201527f616c6c2100000000000000000000000000000000000000000000000000000000602082015250565b6000614cad602483613ca4565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b600081519050614cf281613e13565b92915050565b600060208284031215614d0e57614d0d613bd4565b5b6000614d1c84828501614ce3565b91505092915050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f617665204f6e6520696e646578204e46542120286275726e2900000000000000602082015250565b6000614d81603983613ca4565b9150614d8c82614d25565b604082019050919050565b60006020820190508181036000830152614db081614d74565b9050919050565b6000614dc282613d54565b9150614dcd83613d54565b925082821015614de057614ddf6149ef565b5b828203905092915050565b6000614dfe614df984613ffc565b613fe1565b90508083825260208201905060208402830185811115614e2157614e20614028565b5b835b81811015614e4a5780614e368882614c0f565b845260208401935050602081019050614e23565b5050509392505050565b600082601f830112614e6957614e68613f7c565b5b8151614e79848260208601614deb565b91505092915050565b600060208284031215614e9857614e97613bd4565b5b600082015167ffffffffffffffff811115614eb657614eb5613bd9565b5b614ec284828501614e54565b91505092915050565b7f5b4552524f525d203a20496e646578204e6f7420666f756e6400000000000000600082015250565b6000614f01601983613ca4565b9150614f0c82614ecb565b602082019050919050565b60006020820190508181036000830152614f3081614ef4565b9050919050565b7f5b4552524f525d203a20596f75722074797065206f66206e667420646573697260008201527f656420697320736f6c64206f7574210000000000000000000000000000000000602082015250565b6000614f93602f83613ca4565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f5b4552524f525d203a2054686973206973206163636f756e7420646f6e74206860008201527f6176652074686973204e46542100000000000000000000000000000000000000602082015250565b6000615025602d83613ca4565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b600081905092915050565b600061507182613c99565b61507b818561505b565b935061508b818560208601613cb5565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006150cd60018361505b565b91506150d882615097565b600182019050919050565b60006150ef8288615066565b91506150fb8287615066565b9150615106826150c0565b91506151128286615066565b915061511d826150c0565b91506151298285615066565b9150615134826150c0565b91506151408284615066565b91508190509695505050505050565b7f5b4552524f525d20284e46542043464329203a2041646472657373206e6f742060008201527f617070726f766520666f72204d696e7400000000000000000000000000000000602082015250565b60006151ab603083613ca4565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204a60008201527f65746f6e21000000000000000000000000000000000000000000000000000000602082015250565b600061523d602583613ca4565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b60006040820190506152886000830185613de9565b6152956020830184613e7f565b9392505050565b6000815190506152ab81614503565b92915050565b6000602082840312156152c7576152c6613bd4565b5b60006152d58482850161529c565b91505092915050565b7f5b4552524f525d203a204275726e204a65746f6e204661696c21000000000000600082015250565b6000615314601a83613ca4565b915061531f826152de565b602082019050919050565b6000602082019050818103600083015261534381615307565b9050919050565b7f5b4552524f525d203a20537570706c7920506c6179657220616c72656164792060008201527f5265616368210000000000000000000000000000000000000000000000000000602082015250565b60006153a6602683613ca4565b91506153b18261534a565b604082019050919050565b600060208201905081810360008301526153d581615399565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c20616c726561647920526560008201527f6163682100000000000000000000000000000000000000000000000000000000602082015250565b6000615438602483613ca4565b9150615443826153dc565b604082019050919050565b600060208201905081810360008301526154678161542b565b9050919050565b7f5b4552524f525d203a20537570706c7920476f616c204361707461696e20616c60008201527f7265616479205265616368210000000000000000000000000000000000000000602082015250565b60006154ca602c83613ca4565b91506154d58261546e565b604082019050919050565b600060208201905081810360008301526154f9816154bd565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061552782615500565b615531818561550b565b9350615541818560208601613cb5565b61554a81613ce8565b840191505092915050565b600060808201905061556a6000830187613de9565b6155776020830186613de9565b6155846040830185613e7f565b8181036060830152615596818461551c565b905095945050505050565b6000815190506155b081613c0a565b92915050565b6000602082840312156155cc576155cb613bd4565b5b60006155da848285016155a1565b9150509291505056fea2646970667358221220cb6623592a29e36a92b3b83ba538d4c3cd7181f44c5915afe42cad3d47d90c8964736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003909da30e2b12a9fac09c0a4db963d7f707c98ff
-----Decoded View---------------
Arg [0] : _adrJeton (address): 0x3909da30e2b12a9fac09c0a4db963d7f707c98ff
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003909da30e2b12a9fac09c0a4db963d7f707c98ff
Deployed ByteCode Sourcemap
54254:10728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14590:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20237:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22183:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21731:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55891:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54437:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13644:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54890:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54767:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31448:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54810:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55641:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54849:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59351:1141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54470:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23073:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54931:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48814:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55756:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20026:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54725:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61124:1034;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15269:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52626:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57456:668;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20406:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49672:2505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56226:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22459:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54371:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58260:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55432:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62166:1089;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23329:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56001:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59151:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48235:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60504:612;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56476:856;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56108:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55532:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54690:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58132:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54405:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22838:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63263:1192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54501:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14590:615;14675:4;14990:10;14975:25;;:11;:25;;;;:102;;;;15067:10;15052:25;;:11;:25;;;;14975:102;:179;;;;15144:10;15129:25;;:11;:25;;;;14975:179;14955:199;;14590:615;;;:::o;20237:100::-;20291:13;20324:5;20317:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20237:100;:::o;22183:204::-;22251:7;22276:16;22284:7;22276;:16::i;:::-;22271:64;;22301:34;;;;;;;;;;;;;;22271:64;22355:15;:24;22371:7;22355:24;;;;;;;;;;;;;;;;;;;;;22348:31;;22183:204;;;:::o;21731:386::-;21804:13;21820:16;21828:7;21820;:16::i;:::-;21804:32;;21876:5;21853:28;;:19;:17;:19::i;:::-;:28;;;21849:175;;21901:44;21918:5;21925:19;:17;:19::i;:::-;21901:16;:44::i;:::-;21896:128;;21973:35;;;;;;;;;;;;;;21896:128;21849:175;22063:2;22036:15;:24;22052:7;22036:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22101:7;22097:2;22081:28;;22090:5;22081:28;;;;;;;;;;;;21793:324;21731:386;;:::o;55891:102::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;55975:10:::1;55963:9;:22;;;;55891:102:::0;:::o;54437:26::-;;;;;;;;;;;;;:::o;13644:315::-;13697:7;13925:15;:13;:15::i;:::-;13910:12;;13894:13;;:28;:46;13887:53;;13644:315;:::o;54890:34::-;;;;:::o;54767:36::-;;;;:::o;31448:2800::-;31582:27;31612;31631:7;31612:18;:27::i;:::-;31582:57;;31697:4;31656:45;;31672:19;31656:45;;;31652:86;;31710:28;;;;;;;;;;;;;;31652:86;31752:27;31781:23;31808:28;31828:7;31808:19;:28::i;:::-;31751:85;;;;31936:62;31955:15;31972:4;31978:19;:17;:19::i;:::-;31936:18;:62::i;:::-;31931:174;;32018:43;32035:4;32041:19;:17;:19::i;:::-;32018:16;:43::i;:::-;32013:92;;32070:35;;;;;;;;;;;;;;32013:92;31931:174;32136:1;32122:16;;:2;:16;;;32118:52;;32147:23;;;;;;;;;;;;;;32118:52;32183:43;32205:4;32211:2;32215:7;32224:1;32183:21;:43::i;:::-;32319:15;32316:160;;;32459:1;32438:19;32431:30;32316:160;32854:18;:24;32873:4;32854:24;;;;;;;;;;;;;;;;32852:26;;;;;;;;;;;;32923:18;:22;32942:2;32923:22;;;;;;;;;;;;;;;;32921:24;;;;;;;;;;;33245:145;33282:2;33330:45;33345:4;33351:2;33355:19;33330:14;:45::i;:::-;10872:8;33303:72;33245:18;:145::i;:::-;33216:17;:26;33234:7;33216:26;;;;;;;;;;;:174;;;;33560:1;10872:8;33510:19;:46;:51;33506:626;;33582:19;33614:1;33604:7;:11;33582:33;;33771:1;33737:17;:30;33755:11;33737:30;;;;;;;;;;;;:35;33733:384;;33875:13;;33860:11;:28;33856:242;;34055:19;34022:17;:30;34040:11;34022:30;;;;;;;;;;;:52;;;;33856:242;33733:384;33563:569;33506:626;34179:7;34175:2;34160:27;;34169:4;34160:27;;;;;;;;;;;;34198:42;34219:4;34225:2;34229:7;34238:1;34198:20;:42::i;:::-;31571:2677;;;31448:2800;;;:::o;54810:32::-;;;;:::o;55641:105::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;55728:10:::1;55716:9;;:22;;;;;;;;;;;;;;;;;;55641:105:::0;:::o;54849:34::-;;;;:::o;59351:1141::-;59444:4;64890:11;;;;;;;;;;;64876:25;;:10;:25;;;64868:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;59496:8:::1;59474:30;;:18;59482:9;59474:7;:18::i;:::-;:30;;;59466:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;59607:11;;59576:7;:18;59584:9;59576:18;;;;;;;;;;;:27;;;:42:::0;59568:94:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;59711:11;;59706:1;59678:7;:18;59686:9;59678:18;;;;;;;;;;;:27;;;:29;;;;:::i;:::-;:44:::0;59675:193:::1;;59803:1;59794:8;;:10;;;;:::i;:::-;59783:7;59756;:18;59764:9;59756:18;;;;;;;;;;;:24;;;:34;;;;:::i;:::-;:48;;59748:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;59675:193;59880:10;59893:7;:18;59901:9;59893:18;;;;;;;;;;;:24;;;59880:37;;59928:13;59944:7;:18;59952:9;59944:18;;;;;;;;;;;:27;;;59928:43;;59982:10;59995:7;:18;60003:9;59995:18;;;;;;;;;;;:24;;;59982:37;;60036:6;60032:285;60052:7;60048:1;:11;60032:285;;;60101:8;;60093:5;:16;60090:216;;;60152:1;60143:10;;;;;:::i;:::-;;;60090:216;;;60228:1;60220:9;;60260:1;60248:13;;;;;:::i;:::-;;;60289:1;60280:10;;;;;:::i;:::-;;;60090:216;60061:3;;;;;:::i;:::-;;;;60032:285;;;;60356:5;60329:7;:18;60337:9;60329:18;;;;;;;;;;;:24;;:32;;;;60402:8;60372:7;:18;60380:9;60372:18;;;;;;;;;;;:27;;:38;;;;60448:5;60421:7;:18;60429:9;60421:18;;;;;;;;;;;:24;;:32;;;;60480:4;60473:11;;;;;59351:1141:::0;;;;;:::o;54470:24::-;;;;;;;;;;;;;:::o;23073:185::-;23211:39;23228:4;23234:2;23238:7;23211:39;;;;;;;;;;;;:16;:39::i;:::-;23073:185;;;:::o;54931:37::-;;;;:::o;48814:468::-;48903:23;48964:22;48989:8;:15;48964:40;;49019:34;49077:14;49056:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49019:73;;49112:9;49107:125;49128:14;49123:1;:19;49107:125;;49184:32;49204:8;49213:1;49204:11;;;;;;;;:::i;:::-;;;;;;;;49184:19;:32::i;:::-;49168:10;49179:1;49168:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;49144:3;;;;;49107:125;;;;49253:10;49246:17;;;;48814:468;;;:::o;55756:113::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;55849:12:::1;55835:11;;:26;;;;;;;;;;;;;;;;;;55756:113:::0;:::o;20026:144::-;20090:7;20133:27;20152:7;20133:18;:27::i;:::-;20110:52;;20026:144;;;:::o;54725:35::-;;;;:::o;61124:1034::-;61219:4;64610:9;;;;;;;;;;;64596:23;;:10;:23;;;64588:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;61304:10:::1;:17;61274:4;61249:41;;;61291:8;61249:51;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;61241:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;61379:6;61375:228;61395:10;:17;61391:1;:21;61375:228;;;61509:8;61451:66;;61476:4;61451:39;;;61491:10;61502:1;61491:13;;;;;;;;:::i;:::-;;;;;;;;61451:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;61443:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;61414:3;;;;;:::i;:::-;;;;61375:228;;;;61619:6;61615:512;61635:10;:17;61631:1;:21;61615:512;;;61703:1;61686:10;61697:1;61686:13;;;;;;;;:::i;:::-;;;;;;;;:18:::0;61683:398:::1;;61749:1;61727:20;;:23;;;;;;;:::i;:::-;;;;;;;;61787:1;61769:16;;:19;;;;;;;:::i;:::-;;;;;;;;61683:398;;;61843:1;61826:10;61837:1;61826:13;;;;;;;;:::i;:::-;;;;;;;;:18:::0;61823:258:::1;;61886:1;61866:18;;:21;;;;;;;:::i;:::-;;;;;;;;61922:1;61906:14;;:17;;;;;;;:::i;:::-;;;;;;;;61823:258;;;61978:1;61961:10;61972:1;61961:13;;;;;;;;:::i;:::-;;;;;;;;:18:::0;61958:123:::1;;62025:1;62002:21;;:24;;;;;;;:::i;:::-;;;;;;;;62064:1;62045:17;;:20;;;;;;;:::i;:::-;;;;;;;;61958:123;61823:258;61683:398;62095:20;62101:10;62112:1;62101:13;;;;;;;;:::i;:::-;;;;;;;;62095:5;:20::i;:::-;61654:3;;;;;:::i;:::-;;;;61615:512;;;;62146:4;62139:11;;61124:1034:::0;;;;:::o;15269:224::-;15333:7;15374:1;15357:19;;:5;:19;;;15353:60;;15385:28;;;;;;;;;;;;;;15353:60;9824:13;15431:18;:25;15450:5;15431:25;;;;;;;;;;;;;;;;:54;15424:61;;15269:224;;;:::o;52626:892::-;52696:16;52750:19;52784:25;52824:22;52849:16;52859:5;52849:9;:16::i;:::-;52824:41;;52880:25;52922:14;52908:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52880:57;;52952:31;;:::i;:::-;53003:9;53015:15;:13;:15::i;:::-;53003:27;;52998:472;53047:14;53032:11;:29;52998:472;;53099:15;53112:1;53099:12;:15::i;:::-;53087:27;;53137:9;:16;;;53178:8;53133:73;53254:1;53228:28;;:9;:14;;;:28;;;53224:111;;53301:9;:14;;;53281:34;;53224:111;53378:5;53357:26;;:17;:26;;;53353:102;;53434:1;53408:8;53417:13;;;;;;53408:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;53353:102;52998:472;53063:3;;;;;52998:472;;;;53491:8;53484:15;;;;;;;52626:892;;;:::o;57456:668::-;57516:13;57531:11;57544:14;57576:26;57630:4;57605:45;;;57651:8;57605:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57576:84;;57671:13;57701:6;57710:1;57701:10;;57697:420;57717:12;:19;57713:1;:23;57697:420;;;57778:7;:24;57786:12;57799:1;57786:15;;;;;;;;:::i;:::-;;;;;;;;57778:24;;;;;;;;;;;:32;;;57767:43;;57842:1;57830:8;:13;57827:265;;57877:10;;;;;:::i;:::-;;;;57827:265;;;57937:1;57925:8;:13;57922:170;;57972:8;;;;;:::i;:::-;;;;57922:170;;;58030:1;58018:8;:13;58015:77;;58065:11;;;;;:::i;:::-;;;;58015:77;57922:170;57827:265;57738:3;;;;;:::i;:::-;;;;57697:420;;;;57565:559;;57456:668;;;;;:::o;20406:104::-;20462:13;20495:7;20488:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20406:104;:::o;49672:2505::-;49807:16;49874:4;49865:5;:13;49861:45;;49887:19;;;;;;;;;;;;;;49861:45;49921:19;49955:17;49975:14;:12;:14::i;:::-;49955:34;;50075:15;:13;:15::i;:::-;50067:5;:23;50063:87;;;50119:15;:13;:15::i;:::-;50111:23;;50063:87;50226:9;50219:4;:16;50215:73;;;50263:9;50256:16;;50215:73;50302:25;50330:16;50340:5;50330:9;:16::i;:::-;50302:44;;50524:4;50516:5;:12;50512:278;;;50549:19;50578:5;50571:4;:12;50549:34;;50620:17;50606:11;:31;50602:111;;;50682:11;50662:31;;50602:111;50530:198;50512:278;;;50773:1;50753:21;;50512:278;50804:25;50846:17;50832:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50804:60;;50904:1;50883:17;:22;50879:78;;50933:8;50926:15;;;;;;;;50879:78;51101:31;51135:26;51155:5;51135:19;:26::i;:::-;51101:60;;51176:25;51421:9;:16;;;51416:92;;51478:9;:14;;;51458:34;;51416:92;51527:9;51539:5;51527:17;;51522:478;51551:4;51546:1;:9;;:45;;;;;51574:17;51559:11;:32;;51546:45;51522:478;;;51629:15;51642:1;51629:12;:15::i;:::-;51617:27;;51667:9;:16;;;51708:8;51663:73;51784:1;51758:28;;:9;:14;;;:28;;;51754:111;;51831:9;:14;;;51811:34;;51754:111;51908:5;51887:26;;:17;:26;;;51883:102;;51964:1;51938:8;51947:13;;;;;;51938:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;51883:102;51522:478;51593:3;;;;;51522:478;;;;52102:11;52092:8;52085:29;52150:8;52143:15;;;;;;;;49672:2505;;;;;;:::o;56226:103::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;56313:8:::1;56303:7;:18;;;;;;;;;;;;:::i;:::-;;56226:103:::0;:::o;22459:308::-;22570:19;:17;:19::i;:::-;22558:31;;:8;:31;;;22554:61;;22598:17;;;;;;;;;;;;;;22554:61;22680:8;22628:18;:39;22647:19;:17;:19::i;:::-;22628:39;;;;;;;;;;;;;;;:49;22668:8;22628:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22740:8;22704:55;;22719:19;:17;:19::i;:::-;22704:55;;;22750:8;22704:55;;;;;;:::i;:::-;;;;;;;;22459:308;;:::o;54371:25::-;;;;:::o;58260:179::-;58313:14;;:::i;:::-;58353:15;58361:6;58353:7;:15::i;:::-;58345:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58416:7;:15;58424:6;58416:15;;;;;;;;;;;58409:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58260:179;;;:::o;55432:92::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;55510:6:::1;55502:5;;:14;;;;;;;;;;;;;;;;;;55432:92:::0;:::o;62166:1089::-;62251:4;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;62283:10:::1;62296:14;:12;:14::i;:::-;62283:27;;62331:28;62350:8;62331:18;:28::i;:::-;62323:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;62424:18;62430:2;62434:7;62424:5;:18::i;:::-;62468:6;62464:743;62484:7;62480:1;:11;62464:743;;;62537:1;62525:8;:13:::0;62522:446:::1;;62561:20;;:22;;;;;;;;;:::i;:::-;;;;;;62629:20;;62602:7;:14;62610:5;62602:14;;;;;;;;;;;:24;;:47;;;;62522:446;;;62699:1;62687:8;:13:::0;62684:284:::1;;62722:18;;:20;;;;;;;;;:::i;:::-;;;;;;62788:18;;62761:7;:14;62769:5;62761:14;;;;;;;;;;;:24;;:45;;;;62684:284;;;62862:21;;:23;;;;;;;;;:::i;:::-;;;;;;62931:21;;62904:7;:14;62912:5;62904:14;;;;;;;;;;;:24;;:48;;;;62684:284;62522:446;63012:5;62984:7;:16;62998:1;62992:5;:7;;;;:::i;:::-;62984:16;;;;;;;;;;;:25;;:33;;;;63059:8;63032:7;:16;63046:1;63040:5;:7;;;;:::i;:::-;63032:16;;;;;;;;;;;:24;;:35;;;;63107:1;63082:7;:16;63096:1;63090:5;:7;;;;:::i;:::-;63082:16;;;;;;;;;;;:22;;:26;;;;63151:1;63123:7;:16;63137:1;63131:5;:7;;;;:::i;:::-;63123:16;;;;;;;;;;;:25;;:29;;;;63194:1;63169:7;:16;63183:1;63177:5;:7;;;;:::i;:::-;63169:16;;;;;;;;;;;:22;;:26;;;;62493:3;;;;;:::i;:::-;;;;62464:743;;;;63226:4;63219:11;;;62166:1089:::0;;;;;:::o;23329:399::-;23496:31;23509:4;23515:2;23519:7;23496:12;:31::i;:::-;23560:1;23542:2;:14;;;:19;23538:183;;23581:56;23612:4;23618:2;23622:7;23631:5;23581:30;:56::i;:::-;23576:145;;23665:40;;;;;;;;;;;;;;23576:145;23538:183;23329:399;;;;:::o;56001:98::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;56082:9:::1;56071:8;:20;;;;56001:98:::0;:::o;59151:190::-;59252:4;64890:11;;;;;;;;;;;64876:25;;:10;:25;;;64868:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;59274:37:::1;59282:8;59292:9;59303:7;59274;:37::i;:::-;;59329:4;59322:11;;59151:190:::0;;;;;:::o;48235:420::-;48311:21;;:::i;:::-;48345:31;;:::i;:::-;48401:15;:13;:15::i;:::-;48391:7;:25;:54;;;;48431:14;:12;:14::i;:::-;48420:7;:25;;48391:54;48387:103;;;48469:9;48462:16;;;;;48387:103;48512:21;48525:7;48512:12;:21::i;:::-;48500:33;;48548:9;:16;;;48544:65;;;48588:9;48581:16;;;;;48544:65;48626:21;48639:7;48626:12;:21::i;:::-;48619:28;;;48235:420;;;;:::o;60504:612::-;60583:4;64610:9;;;;;;;;;;;64596:23;;:10;:23;;;64588:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;60667:8:::1;60613:62;;60638:4;60613:39;;;60653:9;60613:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;60605:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;60738:16;60744:9;60738:5;:16::i;:::-;60783:1;60770:9;:14:::0;60767:342:::1;;60825:1;60803:20;;:23;;;;;;;:::i;:::-;;;;;;;;60859:1;60841:16;;:19;;;;;;;:::i;:::-;;;;;;;;60767:342;;;60903:1;60890:9;:14:::0;60887:222:::1;;60942:1;60922:18;;:21;;;;;;;:::i;:::-;;;;;;;;60974:1;60958:14;;:17;;;;;;;:::i;:::-;;;;;;;;60887:222;;;61018:1;61005:9;:14:::0;61002:107:::1;;61061:1;61038:21;;:24;;;;;;;:::i;:::-;;;;;;;;61096:1;61077:17;;:20;;;;;;;:::i;:::-;;;;;;;;61002:107;60887:222;60767:342;60504:612:::0;;;;:::o;56476:856::-;56568:13;56599:16;56607:7;56599;:16::i;:::-;56594:59;;56624:29;;;;;;;;;;;;;;56594:59;56666:21;56690:10;:8;:10::i;:::-;56666:34;;56713:23;56739:19;56750:7;56739:10;:19::i;:::-;56713:45;;56803:1;56784:7;56778:21;:26;:546;;;;;;;;;;;;;;;;;56831:7;56910:27;56920:8;:16;;;56910:9;:27::i;:::-;57013:29;57023:8;:18;;;57013:9;:29::i;:::-;57118:25;57128:8;:14;;;57118:9;:25::i;:::-;57219:28;57229:8;:17;;;57219:9;:28::i;:::-;56814:504;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56778:546;56771:553;;;;56476:856;;;:::o;56108:110::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;56198:12:::1;56184:11;:26;;;;56108:110:::0;:::o;55532:101::-;64527:5;;;;;;;;;;;64513:19;;:10;:19;;;64505:28;;;;;;55616:9:::1;55605:8;;:20;;;;;;;;;;;;;;;;;;55532:101:::0;:::o;54690:28::-;;;;:::o;58132:120::-;58187:14;;:::i;:::-;58226:18;58237:6;58226:10;:18::i;:::-;58219:25;;58132:120;;;:::o;54405:23::-;;;;;;;;;;;;;:::o;22838:164::-;22935:4;22959:18;:25;22978:5;22959:25;;;;;;;;;;;;;;;:35;22985:8;22959:35;;;;;;;;;;;;;;;;;;;;;;;;;22952:42;;22838:164;;;;:::o;63263:1192::-;63338:4;64749:9;;;;;;;;;;;64735:23;;:10;:23;;;64727:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;63412:9:::1;;63385:8;;;;;;;;;;;63368:36;;;63405:2;63368:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;63360:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;63488:10;63501:14;:12;:14::i;:::-;63488:27;;63561:8;;;;;;;;;;;63551:29;;;63581:2;63585:9;;63551:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63543:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;63647:28;63666:8;63647:18;:28::i;:::-;63639:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;63740:12;63746:2;63750:1;63740:5;:12::i;:::-;63780:1;63768:8;:13:::0;63765:411:::1;;63809:20;;:22;;;;;;;;;:::i;:::-;;;;;;63873:20;;63846:7;:14;63854:5;63846:14;;;;;;;;;;;:24;;:47;;;;63765:411;;;63935:1;63923:8;:13:::0;63920:256:::1;;63954:18;;:20;;;;;;;;;:::i;:::-;;;;;;64016:18;;63989:7;:14;63997:5;63989:14;;;;;;;;;;;:24;;:45;;;;63920:256;;;64078:21;;:23;;;;;;;;;:::i;:::-;;;;;;64143:21;;64116:7;:14;64124:5;64116:14;;;;;;;;;;;:24;;:48;;;;63920:256;63765:411;64214:5;64188:7;:14;64196:5;64188:14;;;;;;;;;;;:23;;:31;;;;64255:8;64230:7;:14;64238:5;64230:14;;;;;;;;;;;:22;;:33;;;;64297:1;64274:7;:14;64282:5;64274:14;;;;;;;;;;;:20;;:24;;;;64335:1;64309:7;:14;64317:5;64309:14;;;;;;;;;;;:23;;:27;;;;64372:1;64349:7;:14;64357:5;64349:14;;;;;;;;;;;:20;;:24;;;;64391:11;;;;;;;;;;64422:4;64415:11;;;63263:1192:::0;;;;:::o;54501:24::-;;;;;;;;;;;;;:::o;23983:273::-;24040:4;24096:7;24077:15;:13;:15::i;:::-;:26;;:66;;;;;24130:13;;24120:7;:23;24077:66;:152;;;;;24228:1;10594:8;24181:17;:26;24199:7;24181:26;;;;;;;;;;;;:43;:48;24077:152;24057:172;;23983:273;;;:::o;42544:105::-;42604:7;42631:10;42624:17;;42544:105;:::o;56375:93::-;56432:7;56459:1;56452:8;;56375:93;:::o;16943:1129::-;17010:7;17030:12;17045:7;17030:22;;17113:4;17094:15;:13;:15::i;:::-;:23;17090:915;;17147:13;;17140:4;:20;17136:869;;;17185:14;17202:17;:23;17220:4;17202:23;;;;;;;;;;;;17185:40;;17318:1;10594:8;17291:6;:23;:28;17287:699;;17810:113;17827:1;17817:6;:11;17810:113;;17870:17;:25;17888:6;;;;;;;17870:25;;;;;;;;;;;;17861:34;;17810:113;;;17956:6;17949:13;;;;;;17287:699;17162:843;17136:869;17090:915;18033:31;;;;;;;;;;;;;;16943:1129;;;;:::o;29784:652::-;29879:27;29908:23;29949:53;30005:15;29949:71;;30191:7;30185:4;30178:21;30226:22;30220:4;30213:36;30302:4;30296;30286:21;30263:44;;30398:19;30392:26;30373:45;;30129:300;29784:652;;;:::o;30549:645::-;30691:11;30853:15;30847:4;30843:26;30835:34;;31012:15;31001:9;30997:31;30984:44;;31159:15;31148:9;31145:30;31138:4;31127:9;31124:19;31121:55;31111:65;;30549:645;;;;;:::o;41377:159::-;;;;;:::o;39689:309::-;39824:7;39844:16;10995:3;39870:19;:40;;39844:67;;10995:3;39937:31;39948:4;39954:2;39958:9;39937:10;:31::i;:::-;39929:40;;:61;;39922:68;;;39689:309;;;;;:::o;19517:447::-;19597:14;19765:15;19758:5;19754:27;19745:36;;19939:5;19925:11;19901:22;19897:40;19894:51;19887:5;19884:62;19874:72;;19517:447;;;;:::o;42195:158::-;;;;;:::o;34326:89::-;34386:21;34392:7;34401:5;34386;:21::i;:::-;34326:89;:::o;18620:153::-;18680:21;;:::i;:::-;18721:44;18740:17;:24;18758:5;18740:24;;;;;;;;;;;;18721:18;:44::i;:::-;18714:51;;18620:153;;;:::o;13339:95::-;13386:7;13413:13;;13406:20;;13339:95;:::o;58459:670::-;58519:4;58556:1;58544:8;:13;58541:577;;58605:16;;58582:20;;:39;58574:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;58689:4;58682:11;;;;58541:577;58737:1;58725:8;:13;58722:396;;58784:14;;58763:18;;:35;58755:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;58862:4;58855:11;;;;58722:396;58910:1;58898:8;:13;58895:223;;58960:17;;58936:21;;:41;58928:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;59049:4;59042:11;;;;58895:223;59101:5;59094:12;;58459:670;;;;:::o;25814:1529::-;25879:20;25902:13;;25879:36;;25944:1;25930:16;;:2;:16;;;25926:48;;25955:19;;;;;;;;;;;;;;25926:48;26001:1;25989:8;:13;25985:44;;26011:18;;;;;;;;;;;;;;25985:44;26042:61;26072:1;26076:2;26080:12;26094:8;26042:21;:61::i;:::-;26585:1;9961:2;26556:1;:25;;26555:31;26543:8;:44;26517:18;:22;26536:2;26517:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26864:139;26901:2;26955:33;26978:1;26982:2;26986:1;26955:14;:33::i;:::-;26922:30;26943:8;26922:20;:30::i;:::-;:66;26864:18;:139::i;:::-;26830:17;:31;26848:12;26830:31;;;;;;;;;;;:173;;;;27020:15;27038:12;27020:30;;27065:11;27094:8;27079:12;:23;27065:37;;27117:101;27169:9;;;;;;27165:2;27144:35;;27161:1;27144:35;;;;;;;;;;;;27213:3;27203:7;:13;27117:101;;27250:3;27234:13;:19;;;;26291:974;;27275:60;27304:1;27308:2;27312:12;27326:8;27275:20;:60::i;:::-;25868:1475;25814:1529;;:::o;38199:716::-;38362:4;38408:2;38383:45;;;38429:19;:17;:19::i;:::-;38450:4;38456:7;38465:5;38383:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38379:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38683:1;38666:6;:13;:18;38662:235;;38712:40;;;;;;;;;;;;;;38662:235;38855:6;38849:13;38840:6;38836:2;38832:15;38825:38;38379:529;38552:54;;;38542:64;;;:6;:64;;;;38535:71;;;38199:716;;;;;;:::o;19276:158::-;19338:21;;:::i;:::-;19379:47;19398:27;19417:7;19398:18;:27::i;:::-;19379:18;:47::i;:::-;19372:54;;19276:158;;;:::o;57340:100::-;57392:13;57425:7;57418:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57340:100;:::o;42755:1960::-;42812:17;43231:3;43224:4;43218:11;43214:21;43207:28;;43322:3;43316:4;43309:17;43428:3;43884:5;44014:1;44009:3;44005:11;43998:18;;44151:2;44145:4;44141:13;44137:2;44133:22;44128:3;44120:36;44192:2;44186:4;44182:13;44174:21;;43776:697;44211:4;43776:697;;;44402:1;44397:3;44393:11;44386:18;;44453:2;44447:4;44443:13;44439:2;44435:22;44430:3;44422:36;44306:2;44300:4;44296:13;44288:21;;43776:697;;;43780:430;44512:3;44507;44503:13;44627:2;44622:3;44618:12;44611:19;;44690:6;44685:3;44678:19;42851:1857;;42755:1960;;;:::o;40574:147::-;40711:6;40574:147;;;;;:::o;34644:3063::-;34724:27;34754;34773:7;34754:18;:27::i;:::-;34724:57;;34794:12;34825:19;34794:52;;34860:27;34889:23;34916:28;34936:7;34916:19;:28::i;:::-;34859:85;;;;34961:13;34957:310;;;35082:62;35101:15;35118:4;35124:19;:17;:19::i;:::-;35082:18;:62::i;:::-;35077:178;;35168:43;35185:4;35191:19;:17;:19::i;:::-;35168:16;:43::i;:::-;35163:92;;35220:35;;;;;;;;;;;;;;35163:92;35077:178;34957:310;35279:51;35301:4;35315:1;35319:7;35328:1;35279:21;:51::i;:::-;35423:15;35420:160;;;35563:1;35542:19;35535:30;35420:160;36239:1;10087:3;36210:1;:25;;36209:31;36181:18;:24;36200:4;36181:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;36507:174;36544:4;36613:53;36628:4;36642:1;36646:19;36613:14;:53::i;:::-;10872:8;10594;36568:41;36567:99;36507:18;:174::i;:::-;36478:17;:26;36496:7;36478:26;;;;;;;;;;;:203;;;;36851:1;10872:8;36801:19;:46;:51;36797:626;;36873:19;36905:1;36895:7;:11;36873:33;;37062:1;37028:17;:30;37046:11;37028:30;;;;;;;;;;;;:35;37024:384;;37166:13;;37151:11;:28;37147:242;;37346:19;37313:17;:30;37331:11;37313:30;;;;;;;;;;;:52;;;;37147:242;37024:384;36854:569;36797:626;37478:7;37474:1;37451:35;;37460:4;37451:35;;;;;;;;;;;;37497:50;37518:4;37532:1;37536:7;37545:1;37497:20;:50::i;:::-;37674:12;;:14;;;;;;;;;;;;;34713:2994;;;;34644:3063;;:::o;18166:363::-;18232:31;;:::i;:::-;18309:6;18276:9;:14;;:41;;;;;;;;;;;10478:3;18362:6;:32;;18328:9;:24;;:67;;;;;;;;;;;18452:1;10594:8;18425:6;:23;:28;;18406:9;:16;;:47;;;;;;;;;;;10995:3;18493:6;:27;;18464:9;:19;;:57;;;;;;;;;;;18166:363;;;:::o;21347:322::-;21417:14;21648:1;21638:8;21635:15;21610:23;21606:45;21596:55;;21347:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:619::-;6327:6;6335;6343;6392:2;6380:9;6371:7;6367:23;6363:32;6360:119;;;6398:79;;:::i;:::-;6360:119;6518:1;6543:53;6588:7;6579:6;6568:9;6564:22;6543:53;:::i;:::-;6533:63;;6489:117;6645:2;6671:53;6716:7;6707:6;6696:9;6692:22;6671:53;:::i;:::-;6661:63;;6616:118;6773:2;6799:53;6844:7;6835:6;6824:9;6820:22;6799:53;:::i;:::-;6789:63;;6744:118;6250:619;;;;;:::o;6875:117::-;6984:1;6981;6974:12;6998:180;7046:77;7043:1;7036:88;7143:4;7140:1;7133:15;7167:4;7164:1;7157:15;7184:281;7267:27;7289:4;7267:27;:::i;:::-;7259:6;7255:40;7397:6;7385:10;7382:22;7361:18;7349:10;7346:34;7343:62;7340:88;;;7408:18;;:::i;:::-;7340:88;7448:10;7444:2;7437:22;7227:238;7184:281;;:::o;7471:129::-;7505:6;7532:20;;:::i;:::-;7522:30;;7561:33;7589:4;7581:6;7561:33;:::i;:::-;7471:129;;;:::o;7606:311::-;7683:4;7773:18;7765:6;7762:30;7759:56;;;7795:18;;:::i;:::-;7759:56;7845:4;7837:6;7833:17;7825:25;;7905:4;7899;7895:15;7887:23;;7606:311;;;:::o;7923:117::-;8032:1;8029;8022:12;8063:710;8159:5;8184:81;8200:64;8257:6;8200:64;:::i;:::-;8184:81;:::i;:::-;8175:90;;8285:5;8314:6;8307:5;8300:21;8348:4;8341:5;8337:16;8330:23;;8401:4;8393:6;8389:17;8381:6;8377:30;8430:3;8422:6;8419:15;8416:122;;;8449:79;;:::i;:::-;8416:122;8564:6;8547:220;8581:6;8576:3;8573:15;8547:220;;;8656:3;8685:37;8718:3;8706:10;8685:37;:::i;:::-;8680:3;8673:50;8752:4;8747:3;8743:14;8736:21;;8623:144;8607:4;8602:3;8598:14;8591:21;;8547:220;;;8551:21;8165:608;;8063:710;;;;;:::o;8796:370::-;8867:5;8916:3;8909:4;8901:6;8897:17;8893:27;8883:122;;8924:79;;:::i;:::-;8883:122;9041:6;9028:20;9066:94;9156:3;9148:6;9141:4;9133:6;9129:17;9066:94;:::i;:::-;9057:103;;8873:293;8796:370;;;;:::o;9172:539::-;9256:6;9305:2;9293:9;9284:7;9280:23;9276:32;9273:119;;;9311:79;;:::i;:::-;9273:119;9459:1;9448:9;9444:17;9431:31;9489:18;9481:6;9478:30;9475:117;;;9511:79;;:::i;:::-;9475:117;9616:78;9686:7;9677:6;9666:9;9662:22;9616:78;:::i;:::-;9606:88;;9402:302;9172:539;;;;:::o;9717:144::-;9814:6;9848:5;9842:12;9832:22;;9717:144;;;:::o;9867:214::-;9996:11;10030:6;10025:3;10018:19;10070:4;10065:3;10061:14;10046:29;;9867:214;;;;:::o;10087:162::-;10184:4;10207:3;10199:11;;10237:4;10232:3;10228:14;10220:22;;10087:162;;;:::o;10255:108::-;10332:24;10350:5;10332:24;:::i;:::-;10327:3;10320:37;10255:108;;:::o;10369:101::-;10405:7;10445:18;10438:5;10434:30;10423:41;;10369:101;;;:::o;10476:105::-;10551:23;10568:5;10551:23;:::i;:::-;10546:3;10539:36;10476:105;;:::o;10587:99::-;10658:21;10673:5;10658:21;:::i;:::-;10653:3;10646:34;10587:99;;:::o;10692:91::-;10728:7;10768:8;10761:5;10757:20;10746:31;;10692:91;;;:::o;10789:105::-;10864:23;10881:5;10864:23;:::i;:::-;10859:3;10852:36;10789:105;;:::o;10972:862::-;11119:4;11114:3;11110:14;11206:4;11199:5;11195:16;11189:23;11225:63;11282:4;11277:3;11273:14;11259:12;11225:63;:::i;:::-;11134:164;11390:4;11383:5;11379:16;11373:23;11409:61;11464:4;11459:3;11455:14;11441:12;11409:61;:::i;:::-;11308:172;11564:4;11557:5;11553:16;11547:23;11583:57;11634:4;11629:3;11625:14;11611:12;11583:57;:::i;:::-;11490:160;11737:4;11730:5;11726:16;11720:23;11756:61;11811:4;11806:3;11802:14;11788:12;11756:61;:::i;:::-;11660:167;11088:746;10972:862;;:::o;11840:299::-;11969:10;11990:106;12092:3;12084:6;11990:106;:::i;:::-;12128:4;12123:3;12119:14;12105:28;;11840:299;;;;:::o;12145:143::-;12245:4;12277;12272:3;12268:14;12260:22;;12145:143;;;:::o;12370:972::-;12549:3;12578:84;12656:5;12578:84;:::i;:::-;12678:116;12787:6;12782:3;12678:116;:::i;:::-;12671:123;;12818:86;12898:5;12818:86;:::i;:::-;12927:7;12958:1;12943:374;12968:6;12965:1;12962:13;12943:374;;;13044:6;13038:13;13071:123;13190:3;13175:13;13071:123;:::i;:::-;13064:130;;13217:90;13300:6;13217:90;:::i;:::-;13207:100;;13003:314;12990:1;12987;12983:9;12978:14;;12943:374;;;12947:14;13333:3;13326:10;;12554:788;;;12370:972;;;;:::o;13348:493::-;13551:4;13589:2;13578:9;13574:18;13566:26;;13638:9;13632:4;13628:20;13624:1;13613:9;13609:17;13602:47;13666:168;13829:4;13820:6;13666:168;:::i;:::-;13658:176;;13348:493;;;;:::o;13847:684::-;13940:6;13948;13997:2;13985:9;13976:7;13972:23;13968:32;13965:119;;;14003:79;;:::i;:::-;13965:119;14123:1;14148:53;14193:7;14184:6;14173:9;14169:22;14148:53;:::i;:::-;14138:63;;14094:117;14278:2;14267:9;14263:18;14250:32;14309:18;14301:6;14298:30;14295:117;;;14331:79;;:::i;:::-;14295:117;14436:78;14506:7;14497:6;14486:9;14482:22;14436:78;:::i;:::-;14426:88;;14221:303;13847:684;;;;;:::o;14537:114::-;14604:6;14638:5;14632:12;14622:22;;14537:114;;;:::o;14657:184::-;14756:11;14790:6;14785:3;14778:19;14830:4;14825:3;14821:14;14806:29;;14657:184;;;;:::o;14847:132::-;14914:4;14937:3;14929:11;;14967:4;14962:3;14958:14;14950:22;;14847:132;;;:::o;14985:108::-;15062:24;15080:5;15062:24;:::i;:::-;15057:3;15050:37;14985:108;;:::o;15099:179::-;15168:10;15189:46;15231:3;15223:6;15189:46;:::i;:::-;15267:4;15262:3;15258:14;15244:28;;15099:179;;;;:::o;15284:113::-;15354:4;15386;15381:3;15377:14;15369:22;;15284:113;;;:::o;15433:732::-;15552:3;15581:54;15629:5;15581:54;:::i;:::-;15651:86;15730:6;15725:3;15651:86;:::i;:::-;15644:93;;15761:56;15811:5;15761:56;:::i;:::-;15840:7;15871:1;15856:284;15881:6;15878:1;15875:13;15856:284;;;15957:6;15951:13;15984:63;16043:3;16028:13;15984:63;:::i;:::-;15977:70;;16070:60;16123:6;16070:60;:::i;:::-;16060:70;;15916:224;15903:1;15900;15896:9;15891:14;;15856:284;;;15860:14;16156:3;16149:10;;15557:608;;;15433:732;;;;:::o;16171:373::-;16314:4;16352:2;16341:9;16337:18;16329:26;;16401:9;16395:4;16391:20;16387:1;16376:9;16372:17;16365:47;16429:108;16532:4;16523:6;16429:108;:::i;:::-;16421:116;;16171:373;;;;:::o;16550:442::-;16699:4;16737:2;16726:9;16722:18;16714:26;;16750:71;16818:1;16807:9;16803:17;16794:6;16750:71;:::i;:::-;16831:72;16899:2;16888:9;16884:18;16875:6;16831:72;:::i;:::-;16913;16981:2;16970:9;16966:18;16957:6;16913:72;:::i;:::-;16550:442;;;;;;:::o;16998:117::-;17107:1;17104;17097:12;17121:308;17183:4;17273:18;17265:6;17262:30;17259:56;;;17295:18;;:::i;:::-;17259:56;17333:29;17355:6;17333:29;:::i;:::-;17325:37;;17417:4;17411;17407:15;17399:23;;17121:308;;;:::o;17435:154::-;17519:6;17514:3;17509;17496:30;17581:1;17572:6;17567:3;17563:16;17556:27;17435:154;;;:::o;17595:412::-;17673:5;17698:66;17714:49;17756:6;17714:49;:::i;:::-;17698:66;:::i;:::-;17689:75;;17787:6;17780:5;17773:21;17825:4;17818:5;17814:16;17863:3;17854:6;17849:3;17845:16;17842:25;17839:112;;;17870:79;;:::i;:::-;17839:112;17960:41;17994:6;17989:3;17984;17960:41;:::i;:::-;17679:328;17595:412;;;;;:::o;18027:340::-;18083:5;18132:3;18125:4;18117:6;18113:17;18109:27;18099:122;;18140:79;;:::i;:::-;18099:122;18257:6;18244:20;18282:79;18357:3;18349:6;18342:4;18334:6;18330:17;18282:79;:::i;:::-;18273:88;;18089:278;18027:340;;;;:::o;18373:509::-;18442:6;18491:2;18479:9;18470:7;18466:23;18462:32;18459:119;;;18497:79;;:::i;:::-;18459:119;18645:1;18634:9;18630:17;18617:31;18675:18;18667:6;18664:30;18661:117;;;18697:79;;:::i;:::-;18661:117;18802:63;18857:7;18848:6;18837:9;18833:22;18802:63;:::i;:::-;18792:73;;18588:287;18373:509;;;;:::o;18888:116::-;18958:21;18973:5;18958:21;:::i;:::-;18951:5;18948:32;18938:60;;18994:1;18991;18984:12;18938:60;18888:116;:::o;19010:133::-;19053:5;19091:6;19078:20;19069:29;;19107:30;19131:5;19107:30;:::i;:::-;19010:133;;;;:::o;19149:468::-;19214:6;19222;19271:2;19259:9;19250:7;19246:23;19242:32;19239:119;;;19277:79;;:::i;:::-;19239:119;19397:1;19422:53;19467:7;19458:6;19447:9;19443:22;19422:53;:::i;:::-;19412:63;;19368:117;19524:2;19550:50;19592:7;19583:6;19572:9;19568:22;19550:50;:::i;:::-;19540:60;;19495:115;19149:468;;;;;:::o;19679:1221::-;19826:4;19821:3;19817:14;19917:4;19910:5;19906:16;19900:23;19936:63;19993:4;19988:3;19984:14;19970:12;19936:63;:::i;:::-;19841:168;20096:4;20089:5;20085:16;20079:23;20115:63;20172:4;20167:3;20163:14;20149:12;20115:63;:::i;:::-;20019:169;20273:4;20266:5;20262:16;20256:23;20292:63;20349:4;20344:3;20340:14;20326:12;20292:63;:::i;:::-;20198:167;20448:4;20441:5;20437:16;20431:23;20467:63;20524:4;20519:3;20515:14;20501:12;20467:63;:::i;:::-;20375:165;20626:4;20619:5;20615:16;20609:23;20645:63;20702:4;20697:3;20693:14;20679:12;20645:63;:::i;:::-;20550:168;20801:4;20794:5;20790:16;20784:23;20820:63;20877:4;20872:3;20868:14;20854:12;20820:63;:::i;:::-;20728:165;19795:1105;19679:1221;;:::o;20906:323::-;21049:4;21087:3;21076:9;21072:19;21064:27;;21101:121;21219:1;21208:9;21204:17;21195:6;21101:121;:::i;:::-;20906:323;;;;:::o;21235:307::-;21296:4;21386:18;21378:6;21375:30;21372:56;;;21408:18;;:::i;:::-;21372:56;21446:29;21468:6;21446:29;:::i;:::-;21438:37;;21530:4;21524;21520:15;21512:23;;21235:307;;;:::o;21548:410::-;21625:5;21650:65;21666:48;21707:6;21666:48;:::i;:::-;21650:65;:::i;:::-;21641:74;;21738:6;21731:5;21724:21;21776:4;21769:5;21765:16;21814:3;21805:6;21800:3;21796:16;21793:25;21790:112;;;21821:79;;:::i;:::-;21790:112;21911:41;21945:6;21940:3;21935;21911:41;:::i;:::-;21631:327;21548:410;;;;;:::o;21977:338::-;22032:5;22081:3;22074:4;22066:6;22062:17;22058:27;22048:122;;22089:79;;:::i;:::-;22048:122;22206:6;22193:20;22231:78;22305:3;22297:6;22290:4;22282:6;22278:17;22231:78;:::i;:::-;22222:87;;22038:277;21977:338;;;;:::o;22321:943::-;22416:6;22424;22432;22440;22489:3;22477:9;22468:7;22464:23;22460:33;22457:120;;;22496:79;;:::i;:::-;22457:120;22616:1;22641:53;22686:7;22677:6;22666:9;22662:22;22641:53;:::i;:::-;22631:63;;22587:117;22743:2;22769:53;22814:7;22805:6;22794:9;22790:22;22769:53;:::i;:::-;22759:63;;22714:118;22871:2;22897:53;22942:7;22933:6;22922:9;22918:22;22897:53;:::i;:::-;22887:63;;22842:118;23027:2;23016:9;23012:18;22999:32;23058:18;23050:6;23047:30;23044:117;;;23080:79;;:::i;:::-;23044:117;23185:62;23239:7;23230:6;23219:9;23215:22;23185:62;:::i;:::-;23175:72;;22970:287;22321:943;;;;;;;:::o;23342:872::-;23499:4;23494:3;23490:14;23586:4;23579:5;23575:16;23569:23;23605:63;23662:4;23657:3;23653:14;23639:12;23605:63;:::i;:::-;23514:164;23770:4;23763:5;23759:16;23753:23;23789:61;23844:4;23839:3;23835:14;23821:12;23789:61;:::i;:::-;23688:172;23944:4;23937:5;23933:16;23927:23;23963:57;24014:4;24009:3;24005:14;23991:12;23963:57;:::i;:::-;23870:160;24117:4;24110:5;24106:16;24100:23;24136:61;24191:4;24186:3;24182:14;24168:12;24136:61;:::i;:::-;24040:167;23468:746;23342:872;;:::o;24220:343::-;24373:4;24411:3;24400:9;24396:19;24388:27;;24425:131;24553:1;24542:9;24538:17;24529:6;24425:131;:::i;:::-;24220:343;;;;:::o;24569:474::-;24637:6;24645;24694:2;24682:9;24673:7;24669:23;24665:32;24662:119;;;24700:79;;:::i;:::-;24662:119;24820:1;24845:53;24890:7;24881:6;24870:9;24866:22;24845:53;:::i;:::-;24835:63;;24791:117;24947:2;24973:53;25018:7;25009:6;24998:9;24994:22;24973:53;:::i;:::-;24963:63;;24918:118;24569:474;;;;;:::o;25049:180::-;25097:77;25094:1;25087:88;25194:4;25191:1;25184:15;25218:4;25215:1;25208:15;25235:320;25279:6;25316:1;25310:4;25306:12;25296:22;;25363:1;25357:4;25353:12;25384:18;25374:81;;25440:4;25432:6;25428:17;25418:27;;25374:81;25502:2;25494:6;25491:14;25471:18;25468:38;25465:84;;25521:18;;:::i;:::-;25465:84;25286:269;25235:320;;;:::o;25561:238::-;25701:34;25697:1;25689:6;25685:14;25678:58;25770:21;25765:2;25757:6;25753:15;25746:46;25561:238;:::o;25805:366::-;25947:3;25968:67;26032:2;26027:3;25968:67;:::i;:::-;25961:74;;26044:93;26133:3;26044:93;:::i;:::-;26162:2;26157:3;26153:12;26146:19;;25805:366;;;:::o;26177:419::-;26343:4;26381:2;26370:9;26366:18;26358:26;;26430:9;26424:4;26420:20;26416:1;26405:9;26401:17;26394:47;26458:131;26584:4;26458:131;:::i;:::-;26450:139;;26177:419;;;:::o;26602:235::-;26742:34;26738:1;26730:6;26726:14;26719:58;26811:18;26806:2;26798:6;26794:15;26787:43;26602:235;:::o;26843:366::-;26985:3;27006:67;27070:2;27065:3;27006:67;:::i;:::-;26999:74;;27082:93;27171:3;27082:93;:::i;:::-;27200:2;27195:3;27191:12;27184:19;;26843:366;;;:::o;27215:419::-;27381:4;27419:2;27408:9;27404:18;27396:26;;27468:9;27462:4;27458:20;27454:1;27443:9;27439:17;27432:47;27496:131;27622:4;27496:131;:::i;:::-;27488:139;;27215:419;;;:::o;27640:226::-;27780:34;27776:1;27768:6;27764:14;27757:58;27849:9;27844:2;27836:6;27832:15;27825:34;27640:226;:::o;27872:366::-;28014:3;28035:67;28099:2;28094:3;28035:67;:::i;:::-;28028:74;;28111:93;28200:3;28111:93;:::i;:::-;28229:2;28224:3;28220:12;28213:19;;27872:366;;;:::o;28244:419::-;28410:4;28448:2;28437:9;28433:18;28425:26;;28497:9;28491:4;28487:20;28483:1;28472:9;28468:17;28461:47;28525:131;28651:4;28525:131;:::i;:::-;28517:139;;28244:419;;;:::o;28669:180::-;28717:77;28714:1;28707:88;28814:4;28811:1;28804:15;28838:4;28835:1;28828:15;28855:305;28895:3;28914:20;28932:1;28914:20;:::i;:::-;28909:25;;28948:20;28966:1;28948:20;:::i;:::-;28943:25;;29102:1;29034:66;29030:74;29027:1;29024:81;29021:107;;;29108:18;;:::i;:::-;29021:107;29152:1;29149;29145:9;29138:16;;28855:305;;;;:::o;29166:234::-;29306:34;29302:1;29294:6;29290:14;29283:58;29375:17;29370:2;29362:6;29358:15;29351:42;29166:234;:::o;29406:366::-;29548:3;29569:67;29633:2;29628:3;29569:67;:::i;:::-;29562:74;;29645:93;29734:3;29645:93;:::i;:::-;29763:2;29758:3;29754:12;29747:19;;29406:366;;;:::o;29778:419::-;29944:4;29982:2;29971:9;29967:18;29959:26;;30031:9;30025:4;30021:20;30017:1;30006:9;30002:17;29995:47;30059:131;30185:4;30059:131;:::i;:::-;30051:139;;29778:419;;;:::o;30203:233::-;30242:3;30265:24;30283:5;30265:24;:::i;:::-;30256:33;;30311:66;30304:5;30301:77;30298:103;;30381:18;;:::i;:::-;30298:103;30428:1;30421:5;30417:13;30410:20;;30203:233;;;:::o;30442:180::-;30490:77;30487:1;30480:88;30587:4;30584:1;30577:15;30611:4;30608:1;30601:15;30628:235;30768:34;30764:1;30756:6;30752:14;30745:58;30837:18;30832:2;30824:6;30820:15;30813:43;30628:235;:::o;30869:366::-;31011:3;31032:67;31096:2;31091:3;31032:67;:::i;:::-;31025:74;;31108:93;31197:3;31108:93;:::i;:::-;31226:2;31221:3;31217:12;31210:19;;30869:366;;;:::o;31241:419::-;31407:4;31445:2;31434:9;31430:18;31422:26;;31494:9;31488:4;31484:20;31480:1;31469:9;31465:17;31458:47;31522:131;31648:4;31522:131;:::i;:::-;31514:139;;31241:419;;;:::o;31666:143::-;31723:5;31754:6;31748:13;31739:22;;31770:33;31797:5;31770:33;:::i;:::-;31666:143;;;;:::o;31815:351::-;31885:6;31934:2;31922:9;31913:7;31909:23;31905:32;31902:119;;;31940:79;;:::i;:::-;31902:119;32060:1;32085:64;32141:7;32132:6;32121:9;32117:22;32085:64;:::i;:::-;32075:74;;32031:128;31815:351;;;;:::o;32172:223::-;32312:34;32308:1;32300:6;32296:14;32289:58;32381:6;32376:2;32368:6;32364:15;32357:31;32172:223;:::o;32401:366::-;32543:3;32564:67;32628:2;32623:3;32564:67;:::i;:::-;32557:74;;32640:93;32729:3;32640:93;:::i;:::-;32758:2;32753:3;32749:12;32742:19;;32401:366;;;:::o;32773:419::-;32939:4;32977:2;32966:9;32962:18;32954:26;;33026:9;33020:4;33016:20;33012:1;33001:9;32997:17;32990:47;33054:131;33180:4;33054:131;:::i;:::-;33046:139;;32773:419;;;:::o;33198:143::-;33255:5;33286:6;33280:13;33271:22;;33302:33;33329:5;33302:33;:::i;:::-;33198:143;;;;:::o;33347:351::-;33417:6;33466:2;33454:9;33445:7;33441:23;33437:32;33434:119;;;33472:79;;:::i;:::-;33434:119;33592:1;33617:64;33673:7;33664:6;33653:9;33649:22;33617:64;:::i;:::-;33607:74;;33563:128;33347:351;;;;:::o;33704:244::-;33844:34;33840:1;33832:6;33828:14;33821:58;33913:27;33908:2;33900:6;33896:15;33889:52;33704:244;:::o;33954:366::-;34096:3;34117:67;34181:2;34176:3;34117:67;:::i;:::-;34110:74;;34193:93;34282:3;34193:93;:::i;:::-;34311:2;34306:3;34302:12;34295:19;;33954:366;;;:::o;34326:419::-;34492:4;34530:2;34519:9;34515:18;34507:26;;34579:9;34573:4;34569:20;34565:1;34554:9;34550:17;34543:47;34607:131;34733:4;34607:131;:::i;:::-;34599:139;;34326:419;;;:::o;34751:191::-;34791:4;34811:20;34829:1;34811:20;:::i;:::-;34806:25;;34845:20;34863:1;34845:20;:::i;:::-;34840:25;;34884:1;34881;34878:8;34875:34;;;34889:18;;:::i;:::-;34875:34;34934:1;34931;34927:9;34919:17;;34751:191;;;;:::o;34965:732::-;35072:5;35097:81;35113:64;35170:6;35113:64;:::i;:::-;35097:81;:::i;:::-;35088:90;;35198:5;35227:6;35220:5;35213:21;35261:4;35254:5;35250:16;35243:23;;35314:4;35306:6;35302:17;35294:6;35290:30;35343:3;35335:6;35332:15;35329:122;;;35362:79;;:::i;:::-;35329:122;35477:6;35460:231;35494:6;35489:3;35486:15;35460:231;;;35569:3;35598:48;35642:3;35630:10;35598:48;:::i;:::-;35593:3;35586:61;35676:4;35671:3;35667:14;35660:21;;35536:155;35520:4;35515:3;35511:14;35504:21;;35460:231;;;35464:21;35078:619;;34965:732;;;;;:::o;35720:385::-;35802:5;35851:3;35844:4;35836:6;35832:17;35828:27;35818:122;;35859:79;;:::i;:::-;35818:122;35969:6;35963:13;35994:105;36095:3;36087:6;36080:4;36072:6;36068:17;35994:105;:::i;:::-;35985:114;;35808:297;35720:385;;;;:::o;36111:554::-;36206:6;36255:2;36243:9;36234:7;36230:23;36226:32;36223:119;;;36261:79;;:::i;:::-;36223:119;36402:1;36391:9;36387:17;36381:24;36432:18;36424:6;36421:30;36418:117;;;36454:79;;:::i;:::-;36418:117;36559:89;36640:7;36631:6;36620:9;36616:22;36559:89;:::i;:::-;36549:99;;36352:306;36111:554;;;;:::o;36671:175::-;36811:27;36807:1;36799:6;36795:14;36788:51;36671:175;:::o;36852:366::-;36994:3;37015:67;37079:2;37074:3;37015:67;:::i;:::-;37008:74;;37091:93;37180:3;37091:93;:::i;:::-;37209:2;37204:3;37200:12;37193:19;;36852:366;;;:::o;37224:419::-;37390:4;37428:2;37417:9;37413:18;37405:26;;37477:9;37471:4;37467:20;37463:1;37452:9;37448:17;37441:47;37505:131;37631:4;37505:131;:::i;:::-;37497:139;;37224:419;;;:::o;37649:234::-;37789:34;37785:1;37777:6;37773:14;37766:58;37858:17;37853:2;37845:6;37841:15;37834:42;37649:234;:::o;37889:366::-;38031:3;38052:67;38116:2;38111:3;38052:67;:::i;:::-;38045:74;;38128:93;38217:3;38128:93;:::i;:::-;38246:2;38241:3;38237:12;38230:19;;37889:366;;;:::o;38261:419::-;38427:4;38465:2;38454:9;38450:18;38442:26;;38514:9;38508:4;38504:20;38500:1;38489:9;38485:17;38478:47;38542:131;38668:4;38542:131;:::i;:::-;38534:139;;38261:419;;;:::o;38686:232::-;38826:34;38822:1;38814:6;38810:14;38803:58;38895:15;38890:2;38882:6;38878:15;38871:40;38686:232;:::o;38924:366::-;39066:3;39087:67;39151:2;39146:3;39087:67;:::i;:::-;39080:74;;39163:93;39252:3;39163:93;:::i;:::-;39281:2;39276:3;39272:12;39265:19;;38924:366;;;:::o;39296:419::-;39462:4;39500:2;39489:9;39485:18;39477:26;;39549:9;39543:4;39539:20;39535:1;39524:9;39520:17;39513:47;39577:131;39703:4;39577:131;:::i;:::-;39569:139;;39296:419;;;:::o;39721:148::-;39823:11;39860:3;39845:18;;39721:148;;;;:::o;39875:377::-;39981:3;40009:39;40042:5;40009:39;:::i;:::-;40064:89;40146:6;40141:3;40064:89;:::i;:::-;40057:96;;40162:52;40207:6;40202:3;40195:4;40188:5;40184:16;40162:52;:::i;:::-;40239:6;40234:3;40230:16;40223:23;;39985:267;39875:377;;;;:::o;40258:151::-;40398:3;40394:1;40386:6;40382:14;40375:27;40258:151;:::o;40415:400::-;40575:3;40596:84;40678:1;40673:3;40596:84;:::i;:::-;40589:91;;40689:93;40778:3;40689:93;:::i;:::-;40807:1;40802:3;40798:11;40791:18;;40415:400;;;:::o;40821:1713::-;41448:3;41470:95;41561:3;41552:6;41470:95;:::i;:::-;41463:102;;41582:95;41673:3;41664:6;41582:95;:::i;:::-;41575:102;;41694:148;41838:3;41694:148;:::i;:::-;41687:155;;41859:95;41950:3;41941:6;41859:95;:::i;:::-;41852:102;;41971:148;42115:3;41971:148;:::i;:::-;41964:155;;42136:95;42227:3;42218:6;42136:95;:::i;:::-;42129:102;;42248:148;42392:3;42248:148;:::i;:::-;42241:155;;42413:95;42504:3;42495:6;42413:95;:::i;:::-;42406:102;;42525:3;42518:10;;40821:1713;;;;;;;;:::o;42540:235::-;42680:34;42676:1;42668:6;42664:14;42657:58;42749:18;42744:2;42736:6;42732:15;42725:43;42540:235;:::o;42781:366::-;42923:3;42944:67;43008:2;43003:3;42944:67;:::i;:::-;42937:74;;43020:93;43109:3;43020:93;:::i;:::-;43138:2;43133:3;43129:12;43122:19;;42781:366;;;:::o;43153:419::-;43319:4;43357:2;43346:9;43342:18;43334:26;;43406:9;43400:4;43396:20;43392:1;43381:9;43377:17;43370:47;43434:131;43560:4;43434:131;:::i;:::-;43426:139;;43153:419;;;:::o;43578:224::-;43718:34;43714:1;43706:6;43702:14;43695:58;43787:7;43782:2;43774:6;43770:15;43763:32;43578:224;:::o;43808:366::-;43950:3;43971:67;44035:2;44030:3;43971:67;:::i;:::-;43964:74;;44047:93;44136:3;44047:93;:::i;:::-;44165:2;44160:3;44156:12;44149:19;;43808:366;;;:::o;44180:419::-;44346:4;44384:2;44373:9;44369:18;44361:26;;44433:9;44427:4;44423:20;44419:1;44408:9;44404:17;44397:47;44461:131;44587:4;44461:131;:::i;:::-;44453:139;;44180:419;;;:::o;44605:332::-;44726:4;44764:2;44753:9;44749:18;44741:26;;44777:71;44845:1;44834:9;44830:17;44821:6;44777:71;:::i;:::-;44858:72;44926:2;44915:9;44911:18;44902:6;44858:72;:::i;:::-;44605:332;;;;;:::o;44943:137::-;44997:5;45028:6;45022:13;45013:22;;45044:30;45068:5;45044:30;:::i;:::-;44943:137;;;;:::o;45086:345::-;45153:6;45202:2;45190:9;45181:7;45177:23;45173:32;45170:119;;;45208:79;;:::i;:::-;45170:119;45328:1;45353:61;45406:7;45397:6;45386:9;45382:22;45353:61;:::i;:::-;45343:71;;45299:125;45086:345;;;;:::o;45437:176::-;45577:28;45573:1;45565:6;45561:14;45554:52;45437:176;:::o;45619:366::-;45761:3;45782:67;45846:2;45841:3;45782:67;:::i;:::-;45775:74;;45858:93;45947:3;45858:93;:::i;:::-;45976:2;45971:3;45967:12;45960:19;;45619:366;;;:::o;45991:419::-;46157:4;46195:2;46184:9;46180:18;46172:26;;46244:9;46238:4;46234:20;46230:1;46219:9;46215:17;46208:47;46272:131;46398:4;46272:131;:::i;:::-;46264:139;;45991:419;;;:::o;46416:225::-;46556:34;46552:1;46544:6;46540:14;46533:58;46625:8;46620:2;46612:6;46608:15;46601:33;46416:225;:::o;46647:366::-;46789:3;46810:67;46874:2;46869:3;46810:67;:::i;:::-;46803:74;;46886:93;46975:3;46886:93;:::i;:::-;47004:2;46999:3;46995:12;46988:19;;46647:366;;;:::o;47019:419::-;47185:4;47223:2;47212:9;47208:18;47200:26;;47272:9;47266:4;47262:20;47258:1;47247:9;47243:17;47236:47;47300:131;47426:4;47300:131;:::i;:::-;47292:139;;47019:419;;;:::o;47444:223::-;47584:34;47580:1;47572:6;47568:14;47561:58;47653:6;47648:2;47640:6;47636:15;47629:31;47444:223;:::o;47673:366::-;47815:3;47836:67;47900:2;47895:3;47836:67;:::i;:::-;47829:74;;47912:93;48001:3;47912:93;:::i;:::-;48030:2;48025:3;48021:12;48014:19;;47673:366;;;:::o;48045:419::-;48211:4;48249:2;48238:9;48234:18;48226:26;;48298:9;48292:4;48288:20;48284:1;48273:9;48269:17;48262:47;48326:131;48452:4;48326:131;:::i;:::-;48318:139;;48045:419;;;:::o;48470:231::-;48610:34;48606:1;48598:6;48594:14;48587:58;48679:14;48674:2;48666:6;48662:15;48655:39;48470:231;:::o;48707:366::-;48849:3;48870:67;48934:2;48929:3;48870:67;:::i;:::-;48863:74;;48946:93;49035:3;48946:93;:::i;:::-;49064:2;49059:3;49055:12;49048:19;;48707:366;;;:::o;49079:419::-;49245:4;49283:2;49272:9;49268:18;49260:26;;49332:9;49326:4;49322:20;49318:1;49307:9;49303:17;49296:47;49360:131;49486:4;49360:131;:::i;:::-;49352:139;;49079:419;;;:::o;49504:98::-;49555:6;49589:5;49583:12;49573:22;;49504:98;;;:::o;49608:168::-;49691:11;49725:6;49720:3;49713:19;49765:4;49760:3;49756:14;49741:29;;49608:168;;;;:::o;49782:360::-;49868:3;49896:38;49928:5;49896:38;:::i;:::-;49950:70;50013:6;50008:3;49950:70;:::i;:::-;49943:77;;50029:52;50074:6;50069:3;50062:4;50055:5;50051:16;50029:52;:::i;:::-;50106:29;50128:6;50106:29;:::i;:::-;50101:3;50097:39;50090:46;;49872:270;49782:360;;;;:::o;50148:640::-;50343:4;50381:3;50370:9;50366:19;50358:27;;50395:71;50463:1;50452:9;50448:17;50439:6;50395:71;:::i;:::-;50476:72;50544:2;50533:9;50529:18;50520:6;50476:72;:::i;:::-;50558;50626:2;50615:9;50611:18;50602:6;50558:72;:::i;:::-;50677:9;50671:4;50667:20;50662:2;50651:9;50647:18;50640:48;50705:76;50776:4;50767:6;50705:76;:::i;:::-;50697:84;;50148:640;;;;;;;:::o;50794:141::-;50850:5;50881:6;50875:13;50866:22;;50897:32;50923:5;50897:32;:::i;:::-;50794:141;;;;:::o;50941:349::-;51010:6;51059:2;51047:9;51038:7;51034:23;51030:32;51027:119;;;51065:79;;:::i;:::-;51027:119;51185:1;51210:63;51265:7;51256:6;51245:9;51241:22;51210:63;:::i;:::-;51200:73;;51156:127;50941:349;;;;:::o
Swarm Source
ipfs://cb6623592a29e36a92b3b83ba538d4c3cd7181f44c5915afe42cad3d47d90c89