ETH Price: $3,570.98 (-1.13%)

Contract

0xd861e75B1b26C57b0915C59Cc44c69df231bcC6E
 

Overview

ETH Balance

0.000000000000001564 ETH

Eth Value

Less Than $0.01 (@ $3,570.98/ETH)
Transaction Hash
Method
Block
From
To
Set Approval For...212101672024-11-17 21:38:3515 days ago1731879515IN
0xd861e75B...f231bcC6E
0 ETH0.000446549.09081303
Set Approval For...210286062024-10-23 13:32:1141 days ago1729690331IN
0xd861e75B...f231bcC6E
0 ETH0.000282510.41484583
Safe Transfer Fr...202617082024-07-08 12:11:59148 days ago1720440719IN
0xd861e75B...f231bcC6E
0 ETH0.000218744.05732039
Safe Transfer Fr...199097312024-05-20 7:44:59197 days ago1716191099IN
0xd861e75B...f231bcC6E
0 ETH0.000252093.32525717
Safe Transfer Fr...198757032024-05-15 13:32:47202 days ago1715779967IN
0xd861e75B...f231bcC6E
0 ETH0.0007164312.20225831
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501232024-05-11 23:38:47205 days ago1715470727IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501192024-05-11 23:37:59205 days ago1715470679IN
0xd861e75B...f231bcC6E
1 wei0.000187673.04494258
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193323.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501052024-05-11 23:35:11205 days ago1715470511IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
Admin Mint198501042024-05-11 23:34:59205 days ago1715470499IN
0xd861e75B...f231bcC6E
1 wei0.000193363.13728744
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
192578222024-02-18 23:05:11288 days ago1708297511
0xd861e75B...f231bcC6E
0.02793 ETH
192578222024-02-18 23:05:11288 days ago1708297511
0xd861e75B...f231bcC6E
0.01197 ETH
192147572024-02-12 21:54:47294 days ago1707774887
0xd861e75B...f231bcC6E
0.05586 ETH
192147572024-02-12 21:54:47294 days ago1707774887
0xd861e75B...f231bcC6E
0.02394 ETH
192019802024-02-11 2:53:35296 days ago1707620015
0xd861e75B...f231bcC6E
0.02793 ETH
192019802024-02-11 2:53:35296 days ago1707620015
0xd861e75B...f231bcC6E
0.01197 ETH
191726392024-02-07 0:04:59300 days ago1707264299
0xd861e75B...f231bcC6E
0.02793 ETH
191726392024-02-07 0:04:59300 days ago1707264299
0xd861e75B...f231bcC6E
0.01197 ETH
191717502024-02-06 21:04:35300 days ago1707253475
0xd861e75B...f231bcC6E
0.02793 ETH
191717502024-02-06 21:04:35300 days ago1707253475
0xd861e75B...f231bcC6E
0.01197 ETH
191710282024-02-06 18:38:59301 days ago1707244739
0xd861e75B...f231bcC6E
0.02793 ETH
191710282024-02-06 18:38:59301 days ago1707244739
0xd861e75B...f231bcC6E
0.01197 ETH
191497832024-02-03 19:03:35304 days ago1706987015
0xd861e75B...f231bcC6E
0.02793 ETH
191497832024-02-03 19:03:35304 days ago1706987015
0xd861e75B...f231bcC6E
0.01197 ETH
190919752024-01-26 16:29:47312 days ago1706286587
0xd861e75B...f231bcC6E
0.02793 ETH
190919752024-01-26 16:29:47312 days ago1706286587
0xd861e75B...f231bcC6E
0.01197 ETH
190870582024-01-25 23:58:23312 days ago1706227103
0xd861e75B...f231bcC6E
0.05586 ETH
190870582024-01-25 23:58:23312 days ago1706227103
0xd861e75B...f231bcC6E
0.02394 ETH
190839202024-01-25 13:26:59313 days ago1706189219
0xd861e75B...f231bcC6E
0.02793 ETH
190839202024-01-25 13:26:59313 days ago1706189219
0xd861e75B...f231bcC6E
0.01197 ETH
190368912024-01-18 23:00:59319 days ago1705618859
0xd861e75B...f231bcC6E
0.02793 ETH
190368912024-01-18 23:00:59319 days ago1705618859
0xd861e75B...f231bcC6E
0.01197 ETH
190339252024-01-18 13:03:59320 days ago1705583039
0xd861e75B...f231bcC6E
0.02793 ETH
190339252024-01-18 13:03:59320 days ago1705583039
0xd861e75B...f231bcC6E
0.01197 ETH
189959332024-01-13 5:37:47325 days ago1705124267
0xd861e75B...f231bcC6E
0.02793 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Mablab

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-24
*/

// SPDX-License-Identifier: CC-BY-4.0
/*

• ▌ ▄ ·.  ▄▄▄· ▄▄▄▄· ▄▄▌   ▄▄▄· ▄▄▄▄·
·██ ▐███▪▐█ ▀█ ▐█ ▀█▪██•  ▐█ ▀█ ▐█ ▀█▪
▐█ ▌▐▌▐█·▄█▀▀█ ▐█▀▀█▄██▪  ▄█▀▀█ ▐█▀▀█▄
██ ██▌▐█▌▐█ ▪▐▌██▄▪▐█▐█▌▐▌▐█ ▪▐▌██▄▪▐█
▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ .▀▀▀  ▀  ▀ ·▀▀▀▀

MABLAB. Piranesi. Fields of Chain.

v1.0 - December 2023

written by Ariel Sebastián Becker

NOTICE
======

This is a custom contract, tailored and pruned to fit Spurious Dragon's limit of 24,576 bytes.
Because of that, you will see some modifications made to third-party libraries such as OpenZeppelin's.

THIS SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

THE AUTHOR WILL NOT BE LIABLE, UNDER ANY CIRCUMSTANCE, FOR THE CONTENT STORED BY THE OWNERS.

*/

pragma solidity ^0.8.22;
string constant _strVersion = 'v1.0';
string constant _strTokenTicker = 'MABLAB';
string constant _strTokenName = string(abi.encodePacked('MABLAB. Piranesi. Fields of Chain. ', _strVersion));
string constant _strReverted = 'Unable to send value; recipient may have reverted!';
string constant _strLowCallFailed = 'Low-level call failed.';
string constant _strNonContract = 'Call to non-contract.';
string constant _strDelegateCallFailed = 'Low-level delegate call failed.';
string constant _strDelegateCallNonContract = 'Low-level delegate call to non-contract.';
string constant _strBalanceZeroAddy = 'Balance query for the zero address.';
string constant _strTransferZeroAddy = 'Cannot transfer to the zero address!';
string constant _strNotAuthorized = 'Not authorized!';
string constant _strInvalidMultiproof = 'Invalid multiproof.';
string constant _strTransferFailed = 'Transfer failed.';
string constant _strBlacklisted = "Blacklisted address.";
string constant _strNotBlacklisted = "Not a blacklisted address.";
string constant _strOutOfBounds = 'Out of bounds!';
string constant _strAlreadyMinted = 'Already minted!';
string constant _strPaused = 'Contract is paused.';
string constant _strNotEnoughBalance = 'Insufficient balance!';
string constant _strTransferToNon721 = 'Attempted transfer to non ERC721Receiver implementer!';
string constant _strInvalidParams = 'Invalid params!';

pragma solidity ^0.8.22;
interface IERC165 {
	function supportsInterface(bytes4 interfaceId) external view returns(bool);
}

pragma solidity ^0.8.22;
interface IERC721 is IERC165 {
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	function balanceOf(address owner) external view returns(uint256 balance);
	function ownerOf(uint256 tokenId) external view returns(address owner);
	function safeTransferFrom(address from, address to, uint256 tokenId) external;
	function transferFrom(address from, address to, uint256 tokenId) external;
	function approve(address to, uint256 tokenId) external;
	function getApproved(uint256 tokenId) external view returns(address operator);
	function setApprovalForAll(address operator, bool _approved) external;
	function isApprovedForAll(address owner, address operator) external view returns(bool);
	function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

pragma solidity ^0.8.22;
interface BlackListable {
	function blacklist(address addy) external;
	function unblacklist(address addy) external;
	function isBlacklisted(address addy) external view returns(string memory message);
}

pragma solidity ^0.8.22;
interface IERC721Receiver {
	function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns(bytes4);
}

pragma solidity ^0.8.22;
library Address {

	function isContract(address account) internal view returns(bool) {
		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	function sendValue(address payable recipient, uint256 amount) internal {
		require(address(this).balance >= amount, _strNotEnoughBalance);
		(bool success, ) = recipient.call{value: amount}('');
		require(success, _strReverted);
	}

	function functionCall(address target, bytes memory data) internal returns(bytes memory) {
		return functionCall(target, data, _strLowCallFailed);
	}

	function functionCall(address target, bytes memory data, string memory errorMessage) internal returns(bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns(bytes memory) {
		return functionCallWithValue(target, data, value, _strLowCallFailed);
	}

	function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns(bytes memory) {
		require(address(this).balance >= value, _strNotEnoughBalance);
		require(isContract(target), _strNonContract);
		(bool success, bytes memory returndata) = target.call{value: value}(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	function functionStaticCall(address target, bytes memory data) internal view returns(bytes memory) {
		return functionStaticCall(target, data, _strLowCallFailed);
	}

	function functionStaticCall( address target, bytes memory data, string memory errorMessage) internal view returns(bytes memory) {
		require(isContract(target), _strNonContract);
		(bool success, bytes memory returndata) = target.staticcall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	function functionDelegateCall(address target, bytes memory data) internal returns(bytes memory) {
		return functionDelegateCall(target, data, _strDelegateCallFailed);
	}

	function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns(bytes memory) {
		require(isContract(target), _strDelegateCallNonContract);
		(bool success, bytes memory returndata) = target.delegatecall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	function verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) internal pure returns(bytes memory) {
		if(success) {
			return returndata;
		}
		else {
			if(returndata.length > 0) {
				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			}
			else {
				revert(errorMessage);
			}
		}
	}
}

pragma solidity ^0.8.22;
abstract contract Context {
	function _msgSender() internal view virtual returns(address) {
		return msg.sender;
	}

	function _msgData() internal view virtual returns(bytes calldata) {
		return msg.data;
	}
}

pragma solidity ^0.8.22;
library Strings {
	bytes16 private constant _SYMBOLS = '0123456789abcdef';
	uint8 private constant _ADDRESS_LENGTH = 20;

	function toString(uint256 value) internal pure returns(string memory) {
		if(value == 0) {
			return '0';
		}
		uint256 temp = value;
		uint256 digits;
		while (temp != 0) {
			digits++;
			temp /= 10;
		}
		bytes memory buffer = new bytes(digits);
		while (value != 0) {
			digits -= 1;
			buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
			value /= 10;
		}
		return string(buffer);
	}

	function toHexString(uint256 value, uint256 length) internal pure returns(string memory) {
		bytes memory buffer = new bytes(2 * length + 2);
		buffer[0] = '0';
		buffer[1] = 'x';
		for(uint256 i = 2 * length + 1; i > 1; --i) {
			buffer[i] = _SYMBOLS[value & 0xf];
			value >>= 4;
		}

		return string(buffer);
	}

	function toHexString(address addr) internal pure returns(string memory) {
		return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
	}

	function stringLength(string memory s) internal pure returns(uint256) {
		return bytes(s).length;
	}
}

pragma solidity ^0.8.22;
abstract contract ERC165 is IERC165 {
	function supportsInterface(bytes4 interfaceId) public view virtual override returns(bool) {
		return interfaceId == type(IERC165).interfaceId;
	}
}

pragma solidity ^0.8.22;
contract ERC721 is Context, ERC165, IERC721, BlackListable {
	using Address for address;
	using Strings for uint256;

	mapping(uint256 => address) private _owners;
	mapping(address => uint256) private _balances;
	mapping(uint256 => address) private _tokenApprovals;
	mapping(address => mapping(address => bool)) private _operatorApprovals;
	mapping(address => bool) private _blackListedAddresses;

	modifier checkBlacklistOperator(address addy) {
		require(!_blackListedAddresses[addy], _strBlacklisted);
		_;
	}

	modifier checkBlacklistTransfer(address from, address to) {
		require(!_blackListedAddresses[from] && !_blackListedAddresses[to], _strBlacklisted);
		_;
	}

	/// @notice Blacklists an address, preventing it from transfer
	/// @param addy Address to blacklist.
	function blacklist(address addy) public {
		if(!_blackListedAddresses[addy]) {
			_blackListedAddresses[addy] = true;
		}
	}

	/// @notice Unblacklists an address, allowing it to transfer again.
	/// @param addy Address to unblacklist.
	function unblacklist(address addy) public {
		if(_blackListedAddresses[addy]) {
			_blackListedAddresses[addy] = false;
		}
	}

	/// @notice Returns whether or not an address is blacklisted.
	/// @param addy Address to check.
	function isBlacklisted(address addy) public view returns(string memory) {
		if(_blackListedAddresses[addy]) {
			return _strBlacklisted;
		}
		else {
			return _strNotBlacklisted;
		}
	}

	function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns(bool) {
		return
		interfaceId == type(IERC721).interfaceId ||
		super.supportsInterface(interfaceId);
	}

	function balanceOf(address owner) public view virtual override returns(uint256) {
		require(owner != address(0), _strBalanceZeroAddy);
		return _balances[owner];
	}

	function ownerOf(uint256 tokenId) public view virtual override returns(address) {
		address owner = _owners[tokenId];
		require(owner != address(0), _strOutOfBounds);
		return owner;
	}

	function approve(address to, uint256 tokenId) public checkBlacklistOperator(to) virtual override {
		address owner = ERC721.ownerOf(tokenId);
		require(to != owner, _strNotAuthorized);
		require(
			_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
				_strNotAuthorized
		);
		_approve(to, tokenId);
	}

	function getApproved(uint256 tokenId) public view virtual override returns(address) {
		require(_exists(tokenId), _strOutOfBounds);
		return _tokenApprovals[tokenId];
	}

	function setApprovalForAll(address operator, bool approved) public checkBlacklistOperator(operator) virtual override {
		require(operator != _msgSender(), _strNotAuthorized);
		_operatorApprovals[_msgSender()][operator] = approved;
		emit ApprovalForAll(_msgSender(), operator, approved);
	}

	function isApprovedForAll(address owner, address operator) public view virtual override returns(bool) {
		return _operatorApprovals[owner][operator];
	}

	function transferFrom(address from, address to, uint256 tokenId) public checkBlacklistTransfer(from, to) virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), _strNotAuthorized);
		_transfer(from, to, tokenId);
	}

	function safeTransferFrom(address from, address to, uint256 tokenId) public checkBlacklistTransfer(from, to) virtual override {
		safeTransferFrom(from, to, tokenId, '');
	}

	function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public checkBlacklistTransfer(from, to) virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), _strNotAuthorized);
		_safeTransfer(from, to, tokenId, _data);
	}

	function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal checkBlacklistTransfer(from, to) virtual {
		_transfer(from, to, tokenId);
		require(_checkOnERC721Received(from, to, tokenId, _data), _strTransferToNon721);
	}

	function _exists(uint256 tokenId) internal view virtual returns(bool) {
		return _owners[tokenId] != address(0);
	}

	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns(bool) {
		require(_exists(tokenId), _strOutOfBounds);
		address owner = ERC721.ownerOf(tokenId);
		return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
	}

	function _safeMint(address to, uint256 tokenId) internal virtual {
		_safeMint(to, tokenId, '');
	}

	function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
		_mint(to, tokenId);
		require(
			_checkOnERC721Received(address(0), to, tokenId, _data),
				_strTransferToNon721
		);
	}

	function _mint(address to, uint256 tokenId) internal virtual {
		require(!_exists(tokenId), _strOutOfBounds);
		_balances[to] += 1;
		_owners[tokenId] = to;
		emit Transfer(address(0), to, tokenId);
	}

	function _transfer(address from, address to, uint256 tokenId) internal checkBlacklistTransfer(from, to) virtual {
		require(ERC721.ownerOf(tokenId) == from, _strNotAuthorized);
		require(to != address(0), _strTransferZeroAddy);
		require(_exists(tokenId), _strOutOfBounds);
		_approve(address(0), tokenId);
		_balances[from] -= 1;
		_balances[to] += 1;
		_owners[tokenId] = to;
		emit Transfer(from, to, tokenId);
	}

	function _approve(address to, uint256 tokenId) internal checkBlacklistOperator(to) virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
	}

	function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns(bool) {
		if(to.isContract()) {
			try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns(bytes4 retval) {
				return retval == IERC721Receiver.onERC721Received.selector;
			} catch (bytes memory reason) {
				if(reason.length == 0) {
					revert(_strTransferToNon721);
				} else {
					assembly {
						revert(add(32, reason), mload(reason))
					}
				}
			}
		}
		else {
			return true;
		}
	}
}

pragma solidity ^0.8.22;
interface IERC4906 is IERC165, IERC721 {
	/// @notice This event emits when the metadata of a token is changed.
	/// So that the third-party platforms such as NFT market could
	/// timely update the images and related attributes of the NFT.
	event MetadataUpdate(uint256 _tokenId);

	/// @notice This event emits when the metadata of a range of tokens is changed.
	/// So that the third-party platforms such as NFT market could
	/// timely update the images and related attributes of the NFTs.
	event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

pragma solidity ^0.8.22;
contract Ownable {
	string public constant NOT_CURRENT_OWNER = '018001';
	string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = '018002';
	address public owner;
	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	constructor() {
		owner = msg.sender;
	}

	modifier onlyOwner() {
		require(msg.sender == owner, NOT_CURRENT_OWNER);
		_;
	}

	function transferOwnership(address _newOwner) public onlyOwner {
		require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
		emit OwnershipTransferred(owner, _newOwner);
		owner = _newOwner;
	}
}

pragma solidity ^0.8.22;

/**
 * @dev Tailored and pruned.
 */
library MerkleProof {
	function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
		return processProof(proof, leaf) == root;
	}

	function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
		bytes32 computedHash = leaf;
		for(uint256 i = 0; i < proof.length; i++) {
			computedHash = _hashPair(computedHash, proof[i]);
		}
		return computedHash;
	}

	function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
		bytes32 computedHash = leaf;
		for(uint256 i = 0; i < proof.length; i++) {
			computedHash = _hashPair(computedHash, proof[i]);
		}
		return computedHash;
	}

	function processMultiProof(bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves) internal pure returns (bytes32 merkleRoot) {
		uint256 leavesLen = leaves.length;
		uint256 totalHashes = proofFlags.length;

		require(leavesLen + proof.length - 1 == totalHashes, _strInvalidMultiproof);

		bytes32[] memory hashes = new bytes32[](totalHashes);
		uint256 leafPos = 0;
		uint256 hashPos = 0;
		uint256 proofPos = 0;

		for(uint256 i = 0; i < totalHashes; i++) {
			bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
			bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
			hashes[i] = _hashPair(a, b);
		}

		if(totalHashes > 0) {
			return hashes[totalHashes - 1];
		}
		else if(leavesLen > 0) {
			return leaves[0];
		}
		else {
			return proof[0];
		}
	}

	function processMultiProofCalldata(bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves) internal pure returns (bytes32 merkleRoot) {
		uint256 leavesLen = leaves.length;
		uint256 totalHashes = proofFlags.length;

		require(leavesLen + proof.length - 1 == totalHashes, _strInvalidMultiproof);

		bytes32[] memory hashes = new bytes32[](totalHashes);
		uint256 leafPos = 0;
		uint256 hashPos = 0;
		uint256 proofPos = 0;

		for(uint256 i = 0; i < totalHashes; i++) {
			bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
			bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
			hashes[i] = _hashPair(a, b);
		}

		if(totalHashes > 0) {
			return hashes[totalHashes - 1];
		}
		else if(leavesLen > 0) {
			return leaves[0];
		}
		else {
			return proof[0];
		}
	}

	function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
		return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
	}

	function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
		/// @solidity memory-safe-assembly
		assembly {
			mstore(0x00, a)
			mstore(0x20, b)
			value := keccak256(0x00, 0x40)
		}
	}
}

pragma solidity ^0.8.22;
contract Mablab is Context, ERC721, IERC4906 {
	using MerkleProof for bytes32[];
	event ReceivedRoyalties(address indexed creator, address indexed buyer, uint256 indexed amount);

	bool private _boolPaused = true;

	bytes32 _legitMerkleRoot = 0x9da2d7260bb59a40371b7bfb656798384e73b9b05f2f57c7bab1a451a0db48fd;

	uint256 private _mintFee = 39900000000000000; //39900000000000000, 0.0399 ETH.
	uint256 private _mintedTokens = 0;
	uint256 private _maxCap = 1669;
	uint256 private _sellerFeePoints = 1000; // 10%.

	uint256[] private tokenTracker;

	address private _addrContractOwner = 0x389D43178ad6076521C7F2Ca19bEEc806ef00D2a;
	address private _addrContractCopilot = 0x4DaE7E6c0Ca196643012cDc526bBc6b445A2ca59;

	string private _strMetadataURI = 'https://mablab.mypinata.cloud/ipfs/QmPAvaxvjw5UnfVxgj8vyp938Juh1YBZ6xXBYkNk4BojHm/';
	string private _strContractJSON = 'https://mablab.mypinata.cloud/ipfs/QmYYUuaaBWFGok1bAiZL7QsGnVuiQHZMYXCMduswGY2kGZ';

// ==================================================================
//                              MODIFIERS
// ==================================================================

	modifier isUnpaused() {
		require(!_boolPaused, _strPaused);
		_;
	}

	modifier isWithinExistence(uint256 tokenId) {
		require(tokenId > 0, _strOutOfBounds);
		require(tokenId <= _maxCap, _strOutOfBounds);
		require(_exists(tokenId), _strOutOfBounds);
		_;
	}

	modifier isMintable(uint256 tokenId) {
		require(tokenId > 0, _strOutOfBounds);
		require(tokenId <= _maxCap, _strOutOfBounds);
		require(!_exists(tokenId), _strAlreadyMinted);
		_;
	}

	modifier isAudited(uint256 tokenId, bytes32[] memory proof, string memory hash) {
		bytes32 _leaf = keccak256(bytes.concat(keccak256(abi.encode(tokenId, hash))));
		require(MerkleProof.verify(proof, _legitMerkleRoot, _leaf), _strNotAuthorized);
		_;
	}

	modifier onlyAdmin {
		require(_msgSender() == _addrContractOwner, _strNotAuthorized);
		_;
	}

	modifier onlyPilots {
		require((_msgSender() == _addrContractOwner || _msgSender() == _addrContractCopilot), _strNotAuthorized);
		_;
	}

	constructor() ERC721() {}

// ==================================================================
//                       MAIN PUBLIC FUNCTIONS
// ==================================================================

// ------------------------------------------------------------------
//                               GETTERS
// ------------------------------------------------------------------
	/// @notice Returns a URI to the contract's JSON.
	function contractURI() public view returns(string memory) {
		return _strContractJSON;
	}

	/// @notice Returns 1 if a given tokenId exists, 0 if it does not exist.
	/// @param tokenId Token ID.
	function isMinted(uint256 tokenId) public view returns(bool) {
		return _exists(tokenId);
	}

	/// @notice Returns how many minted tokens are at the moment.
	function mintedTokens() public view returns(uint256) {
		return _mintedTokens;
	}

	/// @notice Returns the mint value expressed in wei.
	function mintFee() public view returns(uint256) {
		return _mintFee;
	}

	/// @notice Returns the current Merkle root.
	function merkleRoot() public view returns(bytes32) {
		return _legitMerkleRoot;
	}

	/// @notice Returns the contract's name.
	function name() public view returns(string memory) {
		return _strTokenName;
	}

	function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns(bool) {
		return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId);
	}

	/// @notice Returns the contract's symbol, or ticker.
	function symbol() public view returns(string memory) {
		return _strTokenTicker;
	}

	/// @notice Returns a URI to the external JSON holding the token's metadata.
	/// @param tokenId Token ID.
	function tokenURI(uint256 tokenId) isWithinExistence(tokenId) public view returns(string memory) {
		// Convert this to external JSON, located on the specific path.
		return string(
			abi.encodePacked(
				_strMetadataURI,
				Strings.toString(tokenId),
				'.json'
			)
		);
	}

	/// @notice Returns contract's max supply.
	function totalSupply() public view returns(uint256) {
		return _maxCap;
	}

// ------------------------------------------------------------------
//                               SETTERS
// ------------------------------------------------------------------

	/// @notice Mints a new token without the need of a Merkle proof. Only for admins.
	/// @param tokenId A number between 1 and 1669, that uniquely identifies this token.
	function adminMint(uint256 tokenId) public isMintable(tokenId) onlyPilots payable {
		_mintedTokens++;
		_mint(_msgSender(), tokenId);
	}

	/// @notice Changes the contract's owner.
	///	 Note: Only current contract's owner can change this.
	/// @param _newOwner Address of the new owner.
	function changeContractOwner(address _newOwner) onlyPilots public {
		_addrContractOwner = _newOwner;
	}

	/// @notice Changes mint fee.
	///	 Note: Only contract's owner can change this.
	/// @param _newValue New value in wei.
	function changeMintFee(uint256 _newValue) onlyAdmin public {
		_mintFee = _newValue;
	}

	/// @notice Changes onchain contents.
	///	 Note: Only contract's owner can change this.
	/// @param _string New content, minified.
	/// @param _index 1 for metadata URI, 3 for contract's metadata.
	function changeOnchainData(string memory _string, uint8 _index) onlyAdmin public {
		if(_index == 1) {
			_strMetadataURI = _string;
		}
		else if(_index == 2) {
			_strContractJSON = _string;
		}
		if(_mintedTokens > 0) {
			emit BatchMetadataUpdate(1, 1669);
		}
	}

	/// @notice Mints a new token.
	/// @param tokenId A number between 1 and 1669, that uniquely identifies this token.
	/// @param proof Merkle proof.
	/// @param hash Merkled hash, to avoid tampering.
	function mint(uint256 tokenId, bytes32[] memory proof, string memory hash) public isMintable(tokenId) isAudited(tokenId, proof, hash) payable {
		require(msg.value >= _mintFee, string(abi.encodePacked('Must pay ', Strings.toString(_mintFee), ' wei.')));
		require(!_boolPaused, _strPaused);
		_mintedTokens++;
		_mint(_msgSender(), tokenId);
	}

	/// @notice Sets the merkle root.
	///	 Note: Only contract's owner can use this function.
	/// @param _merkleRoot merkle root.
	function setMerkleRoot(bytes32 _merkleRoot) public onlyAdmin {
		_legitMerkleRoot = _merkleRoot;
	}

	/// @notice Pauses or unpauses the contract
	///	 Note: Only contract's owner can change this.
	/// @param _state boolean, true to pause, false to unpause
	function setPauseStatus(bool _state) onlyPilots public {
		_boolPaused = _state;
	}

	/// @notice Allows to withdraw any ETH available on this contract.
	///	 Note: Only contract's owner can withdraw.
	function withdraw() public onlyPilots isUnpaused payable {
		uint balance = address(this).balance;
		uint myBalance = balance * 30 / 100;
		uint remaining = balance - myBalance;
		require(balance > 0, _strNotEnoughBalance);
		(bool firstTX, ) = (_addrContractCopilot).call{value: myBalance}('');
		(bool secondTX, ) = (_addrContractOwner).call{value: remaining}('');
		require(firstTX && secondTX, _strTransferFailed);
	}

	/// @notice Allows to withdraw any ETH available on this contract.
	///	 Note: This function is set in place to withdraw only if for some reason the normal function isn't working properly, or one of the addresses is no longer available.
	function overrideWithdraw() public onlyPilots isUnpaused payable {
		uint balance = address(this).balance;
		require(balance > 0, _strNotEnoughBalance);
		(bool success, ) = (msg.sender).call{value: balance}("");
		require(success, _strTransferFailed);
	}

	function royaltiesReceived(address _creator, address _buyer, uint256 _amount) external {
		emit ReceivedRoyalties(_creator, _buyer, _amount);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceivedRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"payable","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":"addy","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeContractOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"changeMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_string","type":"string"},{"internalType":"uint8","name":"_index","type":"uint8"}],"name":"changeOnchainData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"string","name":"hash","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overrideWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"royaltiesReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPauseStatus","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600160055f6101000a81548160ff0219169083151502179055507f9da2d7260bb59a40371b7bfb656798384e73b9b05f2f57c7bab1a451a0db48fd5f1b600655668dc0d6ae89c0006007555f6008556106856009556103e8600a5573389d43178ad6076521c7f2ca19beec806ef00d2a600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734dae7e6c0ca196643012cdc526bbc6b445a2ca59600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060800160405280605281526020016200533d60529139600e9081620001319190620003d4565b50604051806080016040528060518152602001620052ec60519139600f90816200015c9190620003d4565b5034801562000169575f80fd5b50620004b8565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620001ec57607f821691505b602082108103620002025762000201620001a7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620002667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000229565b62000272868362000229565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002bc620002b6620002b0846200028a565b62000293565b6200028a565b9050919050565b5f819050919050565b620002d7836200029c565b620002ef620002e682620002c3565b84845462000235565b825550505050565b5f90565b62000305620002f7565b62000312818484620002cc565b505050565b5b8181101562000339576200032d5f82620002fb565b60018101905062000318565b5050565b601f8211156200038857620003528162000208565b6200035d846200021a565b810160208510156200036d578190505b620003856200037c856200021a565b83018262000317565b50505b505050565b5f82821c905092915050565b5f620003aa5f19846008026200038d565b1980831691505092915050565b5f620003c4838362000399565b9150826002028217905092915050565b620003df8262000170565b67ffffffffffffffff811115620003fb57620003fa6200017a565b5b620004078254620001d4565b620004148282856200033d565b5f60209050601f8311600181146200044a575f841562000435578287015190505b620004418582620003b7565b865550620004b0565b601f1984166200045a8662000208565b5f5b8281101562000483578489015182556001820191506020850194506020810190506200045c565b86831015620004a357848901516200049f601f89168262000399565b8355505b6001600288020188555050505b505050505050565b614e2680620004c65f395ff3fe6080604052600436106101e2575f3560e01c80637cb6475911610101578063c87b56dd11610094578063e985e9c511610063578063e985e9c514610684578063f9f92be4146106c0578063fe172a2c146106e8578063fe575a8714610704576101e2565b8063c87b56dd146105ec578063c9083c8314610628578063e8a3d48514610632578063e929d6691461065c576101e2565b8063a71db72f116100d0578063a71db72f14610558578063b88d4fde14610580578063c1f26123146105a8578063c38bb537146105c4576101e2565b80637cb64759146104b45780638d75fe05146104dc57806395d89b4114610506578063a22cb46514610530576101e2565b806333c41a90116101795780635244475a116101485780635244475a146103ec5780636352211e1461041457806370a082311461045057806375e3661e1461048c576101e2565b806333c41a90146103565780633ccfd60b146103925780633ead67b51461039c57806342842e0e146103c4576101e2565b806313966db5116101b557806313966db5146102b057806318160ddd146102da57806323b872dd146103045780632eb4a7ab1461032c576101e2565b806301ffc9a7146101e657806306fdde0314610222578063081812fc1461024c578063095ea7b314610288575b5f80fd5b3480156101f1575f80fd5b5061020c60048036038101906102079190613bf0565b610740565b6040516102199190613c35565b60405180910390f35b34801561022d575f80fd5b506102366107a0565b6040516102439190613cd8565b60405180910390f35b348015610257575f80fd5b50610272600480360381019061026d9190613d2b565b6107fc565b60405161027f9190613d95565b60405180910390f35b348015610293575f80fd5b506102ae60048036038101906102a99190613dd8565b6108b6565b005b3480156102bb575f80fd5b506102c4610b04565b6040516102d19190613e25565b60405180910390f35b3480156102e5575f80fd5b506102ee610b0d565b6040516102fb9190613e25565b60405180910390f35b34801561030f575f80fd5b5061032a60048036038101906103259190613e3e565b610b16565b005b348015610337575f80fd5b50610340610cc9565b60405161034d9190613ea6565b60405180910390f35b348015610361575f80fd5b5061037c60048036038101906103779190613d2b565b610cd2565b6040516103899190613c35565b60405180910390f35b61039a610ce3565b005b3480156103a7575f80fd5b506103c260048036038101906103bd9190613ebf565b6110dd565b005b3480156103cf575f80fd5b506103ea60048036038101906103e59190613e3e565b61124d565b005b3480156103f7575f80fd5b50610412600480360381019061040d9190613e3e565b611386565b005b34801561041f575f80fd5b5061043a60048036038101906104359190613d2b565b6113e6565b6040516104479190613d95565b60405180910390f35b34801561045b575f80fd5b5061047660048036038101906104719190613ebf565b6114cb565b6040516104839190613e25565b60405180910390f35b348015610497575f80fd5b506104b260048036038101906104ad9190613ebf565b61159c565b005b3480156104bf575f80fd5b506104da60048036038101906104d59190613f14565b611643565b005b3480156104e7575f80fd5b506104f061171c565b6040516104fd9190613e25565b60405180910390f35b348015610511575f80fd5b5061051a611725565b6040516105279190613cd8565b60405180910390f35b34801561053b575f80fd5b5061055660048036038101906105519190613f69565b611762565b005b348015610563575f80fd5b5061057e60048036038101906105799190614109565b6119dc565b005b34801561058b575f80fd5b506105a660048036038101906105a19190614201565b611b33565b005b6105c260048036038101906105bd9190613d2b565b611ce8565b005b3480156105cf575f80fd5b506105ea60048036038101906105e59190614281565b611fbd565b005b3480156105f7575f80fd5b50610612600480360381019061060d9190613d2b565b612106565b60405161061f9190613cd8565b60405180910390f35b6106306122b6565b005b34801561063d575f80fd5b506106466125cf565b6040516106539190613cd8565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d9190613d2b565b61265f565b005b34801561068f575f80fd5b506106aa60048036038101906106a591906142ac565b612738565b6040516106b79190613c35565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190613ebf565b6127c6565b005b61070260048036038101906106fd91906143ae565b61286d565b005b34801561070f575f80fd5b5061072a60048036038101906107259190613ebf565b612bef565b6040516107379190613cd8565b60405180910390f35b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882612cbb565b5b9050919050565b60606040518060400160405280600481526020017f76312e30000000000000000000000000000000000000000000000000000000008152506040516020016107e891906144e0565b604051602081830303815290604052905090565b5f61080682612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e6473210000000000000000000000000000000000008152509061087d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108749190613cd8565b60405180910390fd5b5060025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709190613cd8565b60405180910390fd5b505f610984836113e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249190613cd8565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16610a4d612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480610a7c5750610a7b81610a76612d9b565b612738565b5b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea9190613cd8565b60405180910390fd5b50610afe8484612da2565b50505050565b5f600754905090565b5f600954905090565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015610bb6575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249190613cd8565b60405180910390fd5b50610c3f610c39612d9b565b84612f1d565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad9190613cd8565b60405180910390fd5b50610cc2858585613032565b5050505050565b5f600654905090565b5f610cdc82612d34565b9050919050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d23612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480610d985750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d80612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e069190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e0000000000000000000000000081525090610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e9190613cd8565b60405180910390fd5b505f4790505f6064601e83610eac919061452e565b610eb6919061459c565b90505f8183610ec591906145cc565b90505f83116040518060400160405280601581526020017f496e73756666696369656e742062616c616e636521000000000000000000000081525090610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f389190613cd8565b60405180910390fd5b505f600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051610f889061462c565b5f6040518083038185875af1925050503d805f8114610fc2576040519150601f19603f3d011682016040523d82523d5f602084013e610fc7565b606091505b505090505f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516110119061462c565b5f6040518083038185875af1925050503d805f811461104b576040519150601f19603f3d011682016040523d82523d5f602084013e611050565b606091505b5050905081801561105e5750805b6040518060400160405280601081526020017f5472616e73666572206661696c65642e00000000000000000000000000000000815250906110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc9190613cd8565b60405180910390fd5b505050505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661111d612d9b565b73ffffffffffffffffffffffffffffffffffffffff1614806111925750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661117a612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611209576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112009190613cd8565b60405180910390fd5b5080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156112ed575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b9190613cd8565b60405180910390fd5b5061137f85858560405180602001604052805f815250611b33565b5050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fa4835412df2a3ce32882e9e735e6d40c263d116b4f169bd11a6e281979eed06160405160405180910390a4505050565b5f805f808481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600e81526020017f4f7574206f6620626f756e647321000000000000000000000000000000000000815250906114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89190613cd8565b60405180910390fd5b5080915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415604051806060016040528060238152602001614dce6023913990611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d9190613cd8565b60405180910390fd5b5060015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611640575f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611683612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117089190613cd8565b60405180910390fd5b508060068190555050565b5f600854905090565b60606040518060400160405280600681526020017f4d41424c41420000000000000000000000000000000000000000000000000000815250905090565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c9190613cd8565b60405180910390fd5b5061182e612d9b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb9190613cd8565b60405180910390fd5b508160035f6118e1612d9b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff1661198a612d9b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516119cf9190613c35565b60405180910390a3505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a1c612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa19190613cd8565b60405180910390fd5b5060018160ff1603611acb5781600e9081611ac5919061483a565b50611ae8565b60028160ff1603611ae75781600f9081611ae5919061483a565b505b5b5f6008541115611b2f577f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c6001610685604051611b2692919061497b565b60405180910390a15b5050565b838360045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611bd3575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419190613cd8565b60405180910390fd5b50611c5c611c56612d9b565b85612f1d565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9190613cd8565b60405180910390fd5b50611ce086868686613465565b505050505050565b805f81116040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd89190613cd8565b60405180910390fd5b50611deb81612d34565b156040518060400160405280600f81526020017f416c7265616479206d696e74656421000000000000000000000000000000000081525090611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9190613cd8565b60405180910390fd5b50600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea4612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480611f195750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f01612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f879190613cd8565b60405180910390fd5b5060085f815480929190611fa3906149a2565b9190505550611fb9611fb3612d9b565b836135f7565b5050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ffd612d9b565b73ffffffffffffffffffffffffffffffffffffffff1614806120725750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661205a612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e09190613cd8565b60405180910390fd5b508060055f6101000a81548160ff02191690831515021790555050565b6060815f81116040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f89190613cd8565b60405180910390fd5b5061220b81612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122799190613cd8565b60405180910390fd5b50600e61228e84613779565b60405160200161229f929190614ab3565b604051602081830303815290604052915050919050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122f6612d9b565b73ffffffffffffffffffffffffffffffffffffffff16148061236b5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612353612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e000000000000000000000000008152509061246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619190613cd8565b60405180910390fd5b505f4790505f81116040518060400160405280601581526020017f496e73756666696369656e742062616c616e6365210000000000000000000000815250906124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e09190613cd8565b60405180910390fd5b505f3373ffffffffffffffffffffffffffffffffffffffff168260405161250f9061462c565b5f6040518083038185875af1925050503d805f8114612549576040519150601f19603f3d011682016040523d82523d5f602084013e61254e565b606091505b50509050806040518060400160405280601081526020017f5472616e73666572206661696c65642e00000000000000000000000000000000815250906125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c19190613cd8565b60405180910390fd5b505050565b6060600f80546125de9061466d565b80601f016020809104026020016040519081016040528092919081815260200182805461260a9061466d565b80156126555780601f1061262c57610100808354040283529160200191612655565b820191905f5260205f20905b81548152906001019060200180831161263857829003601f168201915b5050505050905090565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661269f612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a65642100000000000000000000000000000000008152509061272d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127249190613cd8565b60405180910390fd5b508060078190555050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661286a57600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b825f81116040518060400160405280600e81526020017f4f7574206f6620626f756e647321000000000000000000000000000000000000815250906128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295d9190613cd8565b60405180910390fd5b5061297081612d34565b156040518060400160405280600f81526020017f416c7265616479206d696e746564210000000000000000000000000000000000815250906129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df9190613cd8565b60405180910390fd5b508383835f8382604051602001612a00929190614ae1565b60405160208183030381529060405280519060200120604051602001612a269190614b2f565b604051602081830303815290604052805190602001209050612a4b83600654836138d2565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab99190613cd8565b60405180910390fd5b50600754341015612ad4600754613779565b604051602001612ae49190614bdd565b60405160208183030381529060405290612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b9190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e0000000000000000000000000081525090612bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb39190613cd8565b60405180910390fd5b5060085f815480929190612bcf906149a2565b9190505550612be5612bdf612d9b565b896135f7565b5050505050505050565b606060045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612c7d576040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e0000000000000000000000008152509050612cb6565b6040518060400160405280601a81526020017f4e6f74206120626c61636b6c697374656420616464726573732e00000000000081525090505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d2d5750612d2c826138e8565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff165f808481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090612e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5c9190613cd8565b60405180910390fd5b508260025f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff16612ed6846113e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f612f2782612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f959190613cd8565b60405180910390fd5b505f612fa9836113e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061301857508373ffffffffffffffffffffffffffffffffffffffff16613000846107fc565b73ffffffffffffffffffffffffffffffffffffffff16145b8061302957506130288185612738565b5b91505092915050565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156130d2575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090613149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131409190613cd8565b60405180910390fd5b508473ffffffffffffffffffffffffffffffffffffffff1661316a846113e6565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef9190613cd8565b60405180910390fd5b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415604051806060016040528060248152602001614d756024913990613283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327a9190613cd8565b60405180910390fd5b5061328d83612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fb9190613cd8565b60405180910390fd5b5061330f5f84612da2565b6001805f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461335b91906145cc565b925050819055506001805f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546133ae9190614c09565b92505081905550835f808581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b838360045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613505575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e0000000000000000000000008152509061357c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135739190613cd8565b60405180910390fd5b50613588868686613032565b61359486868686613951565b604051806060016040528060358152602001614d9960359139906135ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e59190613cd8565b60405180910390fd5b50505050505050565b61360081612d34565b156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090613678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366f9190613cd8565b60405180910390fd5b506001805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546136c59190614c09565b92505081905550815f808381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60605f82036137bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138cd565b5f8290505f5b5f82146137ee5780806137d7906149a2565b915050600a826137e7919061459c565b91506137c5565b5f8167ffffffffffffffff81111561380957613808613faf565b5b6040519080825280601f01601f19166020018201604052801561383b5781602001600182028036833780820191505090505b5090505b5f85146138c65760018261385391906145cc565b9150600a856138629190614c3c565b603061386e9190614c09565b60f81b81838151811061388457613883614c6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856138bf919061459c565b945061383f565b8093505050505b919050565b5f826138de8584613aed565b1490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f6139718473ffffffffffffffffffffffffffffffffffffffff16613b3b565b15613ae0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261399a612d9b565b8786866040518563ffffffff1660e01b81526004016139bc9493929190614ceb565b6020604051808303815f875af19250505080156139f757506040513d601f19601f820116820180604052508101906139f49190614d49565b60015b613a90573d805f8114613a25576040519150601f19603f3d011682016040523d82523d5f602084013e613a2a565b606091505b505f815103613a8857604051806060016040528060358152602001614d99603591396040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7f9190613cd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ae5565b600190505b949350505050565b5f808290505f5b8451811015613b3057613b2182868381518110613b1457613b13614c6c565b5b6020026020010151613b4c565b91508080600101915050613af4565b508091505092915050565b5f80823b90505f8111915050919050565b5f818310613b6357613b5e8284613b76565b613b6e565b613b6d8383613b76565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bcf81613b9b565b8114613bd9575f80fd5b50565b5f81359050613bea81613bc6565b92915050565b5f60208284031215613c0557613c04613b93565b5b5f613c1284828501613bdc565b91505092915050565b5f8115159050919050565b613c2f81613c1b565b82525050565b5f602082019050613c485f830184613c26565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c85578082015181840152602081019050613c6a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613caa82613c4e565b613cb48185613c58565b9350613cc4818560208601613c68565b613ccd81613c90565b840191505092915050565b5f6020820190508181035f830152613cf08184613ca0565b905092915050565b5f819050919050565b613d0a81613cf8565b8114613d14575f80fd5b50565b5f81359050613d2581613d01565b92915050565b5f60208284031215613d4057613d3f613b93565b5b5f613d4d84828501613d17565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d7f82613d56565b9050919050565b613d8f81613d75565b82525050565b5f602082019050613da85f830184613d86565b92915050565b613db781613d75565b8114613dc1575f80fd5b50565b5f81359050613dd281613dae565b92915050565b5f8060408385031215613dee57613ded613b93565b5b5f613dfb85828601613dc4565b9250506020613e0c85828601613d17565b9150509250929050565b613e1f81613cf8565b82525050565b5f602082019050613e385f830184613e16565b92915050565b5f805f60608486031215613e5557613e54613b93565b5b5f613e6286828701613dc4565b9350506020613e7386828701613dc4565b9250506040613e8486828701613d17565b9150509250925092565b5f819050919050565b613ea081613e8e565b82525050565b5f602082019050613eb95f830184613e97565b92915050565b5f60208284031215613ed457613ed3613b93565b5b5f613ee184828501613dc4565b91505092915050565b613ef381613e8e565b8114613efd575f80fd5b50565b5f81359050613f0e81613eea565b92915050565b5f60208284031215613f2957613f28613b93565b5b5f613f3684828501613f00565b91505092915050565b613f4881613c1b565b8114613f52575f80fd5b50565b5f81359050613f6381613f3f565b92915050565b5f8060408385031215613f7f57613f7e613b93565b5b5f613f8c85828601613dc4565b9250506020613f9d85828601613f55565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613fe582613c90565b810181811067ffffffffffffffff8211171561400457614003613faf565b5b80604052505050565b5f614016613b8a565b90506140228282613fdc565b919050565b5f67ffffffffffffffff82111561404157614040613faf565b5b61404a82613c90565b9050602081019050919050565b828183375f83830152505050565b5f61407761407284614027565b61400d565b90508281526020810184848401111561409357614092613fab565b5b61409e848285614057565b509392505050565b5f82601f8301126140ba576140b9613fa7565b5b81356140ca848260208601614065565b91505092915050565b5f60ff82169050919050565b6140e8816140d3565b81146140f2575f80fd5b50565b5f81359050614103816140df565b92915050565b5f806040838503121561411f5761411e613b93565b5b5f83013567ffffffffffffffff81111561413c5761413b613b97565b5b614148858286016140a6565b9250506020614159858286016140f5565b9150509250929050565b5f67ffffffffffffffff82111561417d5761417c613faf565b5b61418682613c90565b9050602081019050919050565b5f6141a56141a084614163565b61400d565b9050828152602081018484840111156141c1576141c0613fab565b5b6141cc848285614057565b509392505050565b5f82601f8301126141e8576141e7613fa7565b5b81356141f8848260208601614193565b91505092915050565b5f805f806080858703121561421957614218613b93565b5b5f61422687828801613dc4565b945050602061423787828801613dc4565b935050604061424887828801613d17565b925050606085013567ffffffffffffffff81111561426957614268613b97565b5b614275878288016141d4565b91505092959194509250565b5f6020828403121561429657614295613b93565b5b5f6142a384828501613f55565b91505092915050565b5f80604083850312156142c2576142c1613b93565b5b5f6142cf85828601613dc4565b92505060206142e085828601613dc4565b9150509250929050565b5f67ffffffffffffffff82111561430457614303613faf565b5b602082029050602081019050919050565b5f80fd5b5f61432b614326846142ea565b61400d565b9050808382526020820190506020840283018581111561434e5761434d614315565b5b835b8181101561437757806143638882613f00565b845260208401935050602081019050614350565b5050509392505050565b5f82601f83011261439557614394613fa7565b5b81356143a5848260208601614319565b91505092915050565b5f805f606084860312156143c5576143c4613b93565b5b5f6143d286828701613d17565b935050602084013567ffffffffffffffff8111156143f3576143f2613b97565b5b6143ff86828701614381565b925050604084013567ffffffffffffffff8111156144205761441f613b97565b5b61442c868287016140a6565b9150509250925092565b5f81905092915050565b7f4d41424c41422e20506972616e6573692e204669656c6473206f6620436861695f8201527f6e2e200000000000000000000000000000000000000000000000000000000000602082015250565b5f61449a602383614436565b91506144a582614440565b602382019050919050565b5f6144ba82613c4e565b6144c48185614436565b93506144d4818560208601613c68565b80840191505092915050565b5f6144ea8261448e565b91506144f682846144b0565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61453882613cf8565b915061454383613cf8565b925082820261455181613cf8565b9150828204841483151761456857614567614501565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6145a682613cf8565b91506145b183613cf8565b9250826145c1576145c061456f565b5b828204905092915050565b5f6145d682613cf8565b91506145e183613cf8565b92508282039050818111156145f9576145f8614501565b5b92915050565b5f81905092915050565b50565b5f6146175f836145ff565b915061462282614609565b5f82019050919050565b5f6146368261460c565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061468457607f821691505b60208210810361469757614696614640565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026146f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146be565b61470386836146be565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61473e61473961473484613cf8565b61471b565b613cf8565b9050919050565b5f819050919050565b61475783614724565b61476b61476382614745565b8484546146ca565b825550505050565b5f90565b61477f614773565b61478a81848461474e565b505050565b5b818110156147ad576147a25f82614777565b600181019050614790565b5050565b601f8211156147f2576147c38161469d565b6147cc846146af565b810160208510156147db578190505b6147ef6147e7856146af565b83018261478f565b50505b505050565b5f82821c905092915050565b5f6148125f19846008026147f7565b1980831691505092915050565b5f61482a8383614803565b9150826002028217905092915050565b61484382613c4e565b67ffffffffffffffff81111561485c5761485b613faf565b5b614866825461466d565b6148718282856147b1565b5f60209050601f8311600181146148a2575f8415614890578287015190505b61489a858261481f565b865550614901565b601f1984166148b08661469d565b5f5b828110156148d7578489015182556001820191506020850194506020810190506148b2565b868310156148f457848901516148f0601f891682614803565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b5f61492c61492761492284614909565b61471b565b613cf8565b9050919050565b61493c81614912565b82525050565b5f819050919050565b5f61496561496061495b84614942565b61471b565b613cf8565b9050919050565b6149758161494b565b82525050565b5f60408201905061498e5f830185614933565b61499b602083018461496c565b9392505050565b5f6149ac82613cf8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149de576149dd614501565b5b600182019050919050565b5f81546149f58161466d565b6149ff8186614436565b9450600182165f8114614a195760018114614a2e57614a60565b60ff1983168652811515820286019350614a60565b614a378561469d565b5f5b83811015614a5857815481890152600182019150602081019050614a39565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f614a9d600583614436565b9150614aa882614a69565b600582019050919050565b5f614abe82856149e9565b9150614aca82846144b0565b9150614ad582614a91565b91508190509392505050565b5f604082019050614af45f830185613e16565b8181036020830152614b068184613ca0565b90509392505050565b5f819050919050565b614b29614b2482613e8e565b614b0f565b82525050565b5f614b3a8284614b18565b60208201915081905092915050565b7f4d757374207061792000000000000000000000000000000000000000000000005f82015250565b5f614b7d600983614436565b9150614b8882614b49565b600982019050919050565b7f207765692e0000000000000000000000000000000000000000000000000000005f82015250565b5f614bc7600583614436565b9150614bd282614b93565b600582019050919050565b5f614be782614b71565b9150614bf382846144b0565b9150614bfe82614bbb565b915081905092915050565b5f614c1382613cf8565b9150614c1e83613cf8565b9250828201905080821115614c3657614c35614501565b5b92915050565b5f614c4682613cf8565b9150614c5183613cf8565b925082614c6157614c6061456f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f614cbd82614c99565b614cc78185614ca3565b9350614cd7818560208601613c68565b614ce081613c90565b840191505092915050565b5f608082019050614cfe5f830187613d86565b614d0b6020830186613d86565b614d186040830185613e16565b8181036060830152614d2a8184614cb3565b905095945050505050565b5f81519050614d4381613bc6565b92915050565b5f60208284031215614d5e57614d5d613b93565b5b5f614d6b84828501614d35565b9150509291505056fe43616e6e6f74207472616e7366657220746f20746865207a65726f206164647265737321417474656d70746564207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465722142616c616e636520717565727920666f7220746865207a65726f20616464726573732ea26469706673582212206b0103a9098b89a210e216e0fd95bb2e3a53797a12ca93b21cc8a4351085976c64736f6c6343000816003368747470733a2f2f6d61626c61622e6d7970696e6174612e636c6f75642f697066732f516d595955756161425746476f6b316241695a4c375173476e56756951485a4d5958434d647573774759326b475a68747470733a2f2f6d61626c61622e6d7970696e6174612e636c6f75642f697066732f516d5041766178766a7735556e665678676a387679703933384a75683159425a36785842596b4e6b34426f6a486d2f

Deployed Bytecode

0x6080604052600436106101e2575f3560e01c80637cb6475911610101578063c87b56dd11610094578063e985e9c511610063578063e985e9c514610684578063f9f92be4146106c0578063fe172a2c146106e8578063fe575a8714610704576101e2565b8063c87b56dd146105ec578063c9083c8314610628578063e8a3d48514610632578063e929d6691461065c576101e2565b8063a71db72f116100d0578063a71db72f14610558578063b88d4fde14610580578063c1f26123146105a8578063c38bb537146105c4576101e2565b80637cb64759146104b45780638d75fe05146104dc57806395d89b4114610506578063a22cb46514610530576101e2565b806333c41a90116101795780635244475a116101485780635244475a146103ec5780636352211e1461041457806370a082311461045057806375e3661e1461048c576101e2565b806333c41a90146103565780633ccfd60b146103925780633ead67b51461039c57806342842e0e146103c4576101e2565b806313966db5116101b557806313966db5146102b057806318160ddd146102da57806323b872dd146103045780632eb4a7ab1461032c576101e2565b806301ffc9a7146101e657806306fdde0314610222578063081812fc1461024c578063095ea7b314610288575b5f80fd5b3480156101f1575f80fd5b5061020c60048036038101906102079190613bf0565b610740565b6040516102199190613c35565b60405180910390f35b34801561022d575f80fd5b506102366107a0565b6040516102439190613cd8565b60405180910390f35b348015610257575f80fd5b50610272600480360381019061026d9190613d2b565b6107fc565b60405161027f9190613d95565b60405180910390f35b348015610293575f80fd5b506102ae60048036038101906102a99190613dd8565b6108b6565b005b3480156102bb575f80fd5b506102c4610b04565b6040516102d19190613e25565b60405180910390f35b3480156102e5575f80fd5b506102ee610b0d565b6040516102fb9190613e25565b60405180910390f35b34801561030f575f80fd5b5061032a60048036038101906103259190613e3e565b610b16565b005b348015610337575f80fd5b50610340610cc9565b60405161034d9190613ea6565b60405180910390f35b348015610361575f80fd5b5061037c60048036038101906103779190613d2b565b610cd2565b6040516103899190613c35565b60405180910390f35b61039a610ce3565b005b3480156103a7575f80fd5b506103c260048036038101906103bd9190613ebf565b6110dd565b005b3480156103cf575f80fd5b506103ea60048036038101906103e59190613e3e565b61124d565b005b3480156103f7575f80fd5b50610412600480360381019061040d9190613e3e565b611386565b005b34801561041f575f80fd5b5061043a60048036038101906104359190613d2b565b6113e6565b6040516104479190613d95565b60405180910390f35b34801561045b575f80fd5b5061047660048036038101906104719190613ebf565b6114cb565b6040516104839190613e25565b60405180910390f35b348015610497575f80fd5b506104b260048036038101906104ad9190613ebf565b61159c565b005b3480156104bf575f80fd5b506104da60048036038101906104d59190613f14565b611643565b005b3480156104e7575f80fd5b506104f061171c565b6040516104fd9190613e25565b60405180910390f35b348015610511575f80fd5b5061051a611725565b6040516105279190613cd8565b60405180910390f35b34801561053b575f80fd5b5061055660048036038101906105519190613f69565b611762565b005b348015610563575f80fd5b5061057e60048036038101906105799190614109565b6119dc565b005b34801561058b575f80fd5b506105a660048036038101906105a19190614201565b611b33565b005b6105c260048036038101906105bd9190613d2b565b611ce8565b005b3480156105cf575f80fd5b506105ea60048036038101906105e59190614281565b611fbd565b005b3480156105f7575f80fd5b50610612600480360381019061060d9190613d2b565b612106565b60405161061f9190613cd8565b60405180910390f35b6106306122b6565b005b34801561063d575f80fd5b506106466125cf565b6040516106539190613cd8565b60405180910390f35b348015610667575f80fd5b50610682600480360381019061067d9190613d2b565b61265f565b005b34801561068f575f80fd5b506106aa60048036038101906106a591906142ac565b612738565b6040516106b79190613c35565b60405180910390f35b3480156106cb575f80fd5b506106e660048036038101906106e19190613ebf565b6127c6565b005b61070260048036038101906106fd91906143ae565b61286d565b005b34801561070f575f80fd5b5061072a60048036038101906107259190613ebf565b612bef565b6040516107379190613cd8565b60405180910390f35b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882612cbb565b5b9050919050565b60606040518060400160405280600481526020017f76312e30000000000000000000000000000000000000000000000000000000008152506040516020016107e891906144e0565b604051602081830303815290604052905090565b5f61080682612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e6473210000000000000000000000000000000000008152509061087d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108749190613cd8565b60405180910390fd5b5060025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709190613cd8565b60405180910390fd5b505f610984836113e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249190613cd8565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16610a4d612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480610a7c5750610a7b81610a76612d9b565b612738565b5b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea9190613cd8565b60405180910390fd5b50610afe8484612da2565b50505050565b5f600754905090565b5f600954905090565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015610bb6575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249190613cd8565b60405180910390fd5b50610c3f610c39612d9b565b84612f1d565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad9190613cd8565b60405180910390fd5b50610cc2858585613032565b5050505050565b5f600654905090565b5f610cdc82612d34565b9050919050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d23612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480610d985750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d80612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e069190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e0000000000000000000000000081525090610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e9190613cd8565b60405180910390fd5b505f4790505f6064601e83610eac919061452e565b610eb6919061459c565b90505f8183610ec591906145cc565b90505f83116040518060400160405280601581526020017f496e73756666696369656e742062616c616e636521000000000000000000000081525090610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f389190613cd8565b60405180910390fd5b505f600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051610f889061462c565b5f6040518083038185875af1925050503d805f8114610fc2576040519150601f19603f3d011682016040523d82523d5f602084013e610fc7565b606091505b505090505f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516110119061462c565b5f6040518083038185875af1925050503d805f811461104b576040519150601f19603f3d011682016040523d82523d5f602084013e611050565b606091505b5050905081801561105e5750805b6040518060400160405280601081526020017f5472616e73666572206661696c65642e00000000000000000000000000000000815250906110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc9190613cd8565b60405180910390fd5b505050505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661111d612d9b565b73ffffffffffffffffffffffffffffffffffffffff1614806111925750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661117a612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611209576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112009190613cd8565b60405180910390fd5b5080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156112ed575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b9190613cd8565b60405180910390fd5b5061137f85858560405180602001604052805f815250611b33565b5050505050565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fa4835412df2a3ce32882e9e735e6d40c263d116b4f169bd11a6e281979eed06160405160405180910390a4505050565b5f805f808481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600e81526020017f4f7574206f6620626f756e647321000000000000000000000000000000000000815250906114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89190613cd8565b60405180910390fd5b5080915050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415604051806060016040528060238152602001614dce6023913990611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d9190613cd8565b60405180910390fd5b5060015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611640575f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611683612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117089190613cd8565b60405180910390fd5b508060068190555050565b5f600854905090565b60606040518060400160405280600681526020017f4d41424c41420000000000000000000000000000000000000000000000000000815250905090565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c9190613cd8565b60405180910390fd5b5061182e612d9b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb9190613cd8565b60405180910390fd5b508160035f6118e1612d9b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff1661198a612d9b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31846040516119cf9190613c35565b60405180910390a3505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a1c612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa19190613cd8565b60405180910390fd5b5060018160ff1603611acb5781600e9081611ac5919061483a565b50611ae8565b60028160ff1603611ae75781600f9081611ae5919061483a565b505b5b5f6008541115611b2f577f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c6001610685604051611b2692919061497b565b60405180910390a15b5050565b838360045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611bd3575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419190613cd8565b60405180910390fd5b50611c5c611c56612d9b565b85612f1d565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9190613cd8565b60405180910390fd5b50611ce086868686613465565b505050505050565b805f81116040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd89190613cd8565b60405180910390fd5b50611deb81612d34565b156040518060400160405280600f81526020017f416c7265616479206d696e74656421000000000000000000000000000000000081525090611e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5a9190613cd8565b60405180910390fd5b50600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea4612d9b565b73ffffffffffffffffffffffffffffffffffffffff161480611f195750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f01612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090611f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f879190613cd8565b60405180910390fd5b5060085f815480929190611fa3906149a2565b9190505550611fb9611fb3612d9b565b836135f7565b5050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ffd612d9b565b73ffffffffffffffffffffffffffffffffffffffff1614806120725750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661205a612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e09190613cd8565b60405180910390fd5b508060055f6101000a81548160ff02191690831515021790555050565b6060815f81116040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f89190613cd8565b60405180910390fd5b5061220b81612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122799190613cd8565b60405180910390fd5b50600e61228e84613779565b60405160200161229f929190614ab3565b604051602081830303815290604052915050919050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166122f6612d9b565b73ffffffffffffffffffffffffffffffffffffffff16148061236b5750600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612353612d9b565b73ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d99190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e000000000000000000000000008152509061246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619190613cd8565b60405180910390fd5b505f4790505f81116040518060400160405280601581526020017f496e73756666696369656e742062616c616e6365210000000000000000000000815250906124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e09190613cd8565b60405180910390fd5b505f3373ffffffffffffffffffffffffffffffffffffffff168260405161250f9061462c565b5f6040518083038185875af1925050503d805f8114612549576040519150601f19603f3d011682016040523d82523d5f602084013e61254e565b606091505b50509050806040518060400160405280601081526020017f5472616e73666572206661696c65642e00000000000000000000000000000000815250906125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c19190613cd8565b60405180910390fd5b505050565b6060600f80546125de9061466d565b80601f016020809104026020016040519081016040528092919081815260200182805461260a9061466d565b80156126555780601f1061262c57610100808354040283529160200191612655565b820191905f5260205f20905b81548152906001019060200180831161263857829003601f168201915b5050505050905090565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661269f612d9b565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a65642100000000000000000000000000000000008152509061272d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127249190613cd8565b60405180910390fd5b508060078190555050565b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661286a57600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b825f81116040518060400160405280600e81526020017f4f7574206f6620626f756e647321000000000000000000000000000000000000815250906128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df9190613cd8565b60405180910390fd5b506009548111156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295d9190613cd8565b60405180910390fd5b5061297081612d34565b156040518060400160405280600f81526020017f416c7265616479206d696e746564210000000000000000000000000000000000815250906129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df9190613cd8565b60405180910390fd5b508383835f8382604051602001612a00929190614ae1565b60405160208183030381529060405280519060200120604051602001612a269190614b2f565b604051602081830303815290604052805190602001209050612a4b83600654836138d2565b6040518060400160405280600f81526020017f4e6f7420617574686f72697a656421000000000000000000000000000000000081525090612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab99190613cd8565b60405180910390fd5b50600754341015612ad4600754613779565b604051602001612ae49190614bdd565b60405160208183030381529060405290612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b9190613cd8565b60405180910390fd5b5060055f9054906101000a900460ff16156040518060400160405280601381526020017f436f6e7472616374206973207061757365642e0000000000000000000000000081525090612bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb39190613cd8565b60405180910390fd5b5060085f815480929190612bcf906149a2565b9190505550612be5612bdf612d9b565b896135f7565b5050505050505050565b606060045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612c7d576040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e0000000000000000000000008152509050612cb6565b6040518060400160405280601a81526020017f4e6f74206120626c61636b6c697374656420616464726573732e00000000000081525090505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d2d5750612d2c826138e8565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff165f808481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090612e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5c9190613cd8565b60405180910390fd5b508260025f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff16612ed6846113e6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f612f2782612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090612f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f959190613cd8565b60405180910390fd5b505f612fa9836113e6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061301857508373ffffffffffffffffffffffffffffffffffffffff16613000846107fc565b73ffffffffffffffffffffffffffffffffffffffff16145b8061302957506130288185612738565b5b91505092915050565b828260045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156130d2575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e00000000000000000000000081525090613149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131409190613cd8565b60405180910390fd5b508473ffffffffffffffffffffffffffffffffffffffff1661316a846113e6565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600f81526020017f4e6f7420617574686f72697a6564210000000000000000000000000000000000815250906131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef9190613cd8565b60405180910390fd5b505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415604051806060016040528060248152602001614d756024913990613283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327a9190613cd8565b60405180910390fd5b5061328d83612d34565b6040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fb9190613cd8565b60405180910390fd5b5061330f5f84612da2565b6001805f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461335b91906145cc565b925050819055506001805f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546133ae9190614c09565b92505081905550835f808581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b838360045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613505575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b6040518060400160405280601481526020017f426c61636b6c697374656420616464726573732e0000000000000000000000008152509061357c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135739190613cd8565b60405180910390fd5b50613588868686613032565b61359486868686613951565b604051806060016040528060358152602001614d9960359139906135ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e59190613cd8565b60405180910390fd5b50505050505050565b61360081612d34565b156040518060400160405280600e81526020017f4f7574206f6620626f756e64732100000000000000000000000000000000000081525090613678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366f9190613cd8565b60405180910390fd5b506001805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546136c59190614c09565b92505081905550815f808381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60605f82036137bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138cd565b5f8290505f5b5f82146137ee5780806137d7906149a2565b915050600a826137e7919061459c565b91506137c5565b5f8167ffffffffffffffff81111561380957613808613faf565b5b6040519080825280601f01601f19166020018201604052801561383b5781602001600182028036833780820191505090505b5090505b5f85146138c65760018261385391906145cc565b9150600a856138629190614c3c565b603061386e9190614c09565b60f81b81838151811061388457613883614c6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856138bf919061459c565b945061383f565b8093505050505b919050565b5f826138de8584613aed565b1490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f6139718473ffffffffffffffffffffffffffffffffffffffff16613b3b565b15613ae0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261399a612d9b565b8786866040518563ffffffff1660e01b81526004016139bc9493929190614ceb565b6020604051808303815f875af19250505080156139f757506040513d601f19601f820116820180604052508101906139f49190614d49565b60015b613a90573d805f8114613a25576040519150601f19603f3d011682016040523d82523d5f602084013e613a2a565b606091505b505f815103613a8857604051806060016040528060358152602001614d99603591396040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7f9190613cd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ae5565b600190505b949350505050565b5f808290505f5b8451811015613b3057613b2182868381518110613b1457613b13614c6c565b5b6020026020010151613b4c565b91508080600101915050613af4565b508091505092915050565b5f80823b90505f8111915050919050565b5f818310613b6357613b5e8284613b76565b613b6e565b613b6d8383613b76565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bcf81613b9b565b8114613bd9575f80fd5b50565b5f81359050613bea81613bc6565b92915050565b5f60208284031215613c0557613c04613b93565b5b5f613c1284828501613bdc565b91505092915050565b5f8115159050919050565b613c2f81613c1b565b82525050565b5f602082019050613c485f830184613c26565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c85578082015181840152602081019050613c6a565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613caa82613c4e565b613cb48185613c58565b9350613cc4818560208601613c68565b613ccd81613c90565b840191505092915050565b5f6020820190508181035f830152613cf08184613ca0565b905092915050565b5f819050919050565b613d0a81613cf8565b8114613d14575f80fd5b50565b5f81359050613d2581613d01565b92915050565b5f60208284031215613d4057613d3f613b93565b5b5f613d4d84828501613d17565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d7f82613d56565b9050919050565b613d8f81613d75565b82525050565b5f602082019050613da85f830184613d86565b92915050565b613db781613d75565b8114613dc1575f80fd5b50565b5f81359050613dd281613dae565b92915050565b5f8060408385031215613dee57613ded613b93565b5b5f613dfb85828601613dc4565b9250506020613e0c85828601613d17565b9150509250929050565b613e1f81613cf8565b82525050565b5f602082019050613e385f830184613e16565b92915050565b5f805f60608486031215613e5557613e54613b93565b5b5f613e6286828701613dc4565b9350506020613e7386828701613dc4565b9250506040613e8486828701613d17565b9150509250925092565b5f819050919050565b613ea081613e8e565b82525050565b5f602082019050613eb95f830184613e97565b92915050565b5f60208284031215613ed457613ed3613b93565b5b5f613ee184828501613dc4565b91505092915050565b613ef381613e8e565b8114613efd575f80fd5b50565b5f81359050613f0e81613eea565b92915050565b5f60208284031215613f2957613f28613b93565b5b5f613f3684828501613f00565b91505092915050565b613f4881613c1b565b8114613f52575f80fd5b50565b5f81359050613f6381613f3f565b92915050565b5f8060408385031215613f7f57613f7e613b93565b5b5f613f8c85828601613dc4565b9250506020613f9d85828601613f55565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613fe582613c90565b810181811067ffffffffffffffff8211171561400457614003613faf565b5b80604052505050565b5f614016613b8a565b90506140228282613fdc565b919050565b5f67ffffffffffffffff82111561404157614040613faf565b5b61404a82613c90565b9050602081019050919050565b828183375f83830152505050565b5f61407761407284614027565b61400d565b90508281526020810184848401111561409357614092613fab565b5b61409e848285614057565b509392505050565b5f82601f8301126140ba576140b9613fa7565b5b81356140ca848260208601614065565b91505092915050565b5f60ff82169050919050565b6140e8816140d3565b81146140f2575f80fd5b50565b5f81359050614103816140df565b92915050565b5f806040838503121561411f5761411e613b93565b5b5f83013567ffffffffffffffff81111561413c5761413b613b97565b5b614148858286016140a6565b9250506020614159858286016140f5565b9150509250929050565b5f67ffffffffffffffff82111561417d5761417c613faf565b5b61418682613c90565b9050602081019050919050565b5f6141a56141a084614163565b61400d565b9050828152602081018484840111156141c1576141c0613fab565b5b6141cc848285614057565b509392505050565b5f82601f8301126141e8576141e7613fa7565b5b81356141f8848260208601614193565b91505092915050565b5f805f806080858703121561421957614218613b93565b5b5f61422687828801613dc4565b945050602061423787828801613dc4565b935050604061424887828801613d17565b925050606085013567ffffffffffffffff81111561426957614268613b97565b5b614275878288016141d4565b91505092959194509250565b5f6020828403121561429657614295613b93565b5b5f6142a384828501613f55565b91505092915050565b5f80604083850312156142c2576142c1613b93565b5b5f6142cf85828601613dc4565b92505060206142e085828601613dc4565b9150509250929050565b5f67ffffffffffffffff82111561430457614303613faf565b5b602082029050602081019050919050565b5f80fd5b5f61432b614326846142ea565b61400d565b9050808382526020820190506020840283018581111561434e5761434d614315565b5b835b8181101561437757806143638882613f00565b845260208401935050602081019050614350565b5050509392505050565b5f82601f83011261439557614394613fa7565b5b81356143a5848260208601614319565b91505092915050565b5f805f606084860312156143c5576143c4613b93565b5b5f6143d286828701613d17565b935050602084013567ffffffffffffffff8111156143f3576143f2613b97565b5b6143ff86828701614381565b925050604084013567ffffffffffffffff8111156144205761441f613b97565b5b61442c868287016140a6565b9150509250925092565b5f81905092915050565b7f4d41424c41422e20506972616e6573692e204669656c6473206f6620436861695f8201527f6e2e200000000000000000000000000000000000000000000000000000000000602082015250565b5f61449a602383614436565b91506144a582614440565b602382019050919050565b5f6144ba82613c4e565b6144c48185614436565b93506144d4818560208601613c68565b80840191505092915050565b5f6144ea8261448e565b91506144f682846144b0565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61453882613cf8565b915061454383613cf8565b925082820261455181613cf8565b9150828204841483151761456857614567614501565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6145a682613cf8565b91506145b183613cf8565b9250826145c1576145c061456f565b5b828204905092915050565b5f6145d682613cf8565b91506145e183613cf8565b92508282039050818111156145f9576145f8614501565b5b92915050565b5f81905092915050565b50565b5f6146175f836145ff565b915061462282614609565b5f82019050919050565b5f6146368261460c565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061468457607f821691505b60208210810361469757614696614640565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026146f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146be565b61470386836146be565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61473e61473961473484613cf8565b61471b565b613cf8565b9050919050565b5f819050919050565b61475783614724565b61476b61476382614745565b8484546146ca565b825550505050565b5f90565b61477f614773565b61478a81848461474e565b505050565b5b818110156147ad576147a25f82614777565b600181019050614790565b5050565b601f8211156147f2576147c38161469d565b6147cc846146af565b810160208510156147db578190505b6147ef6147e7856146af565b83018261478f565b50505b505050565b5f82821c905092915050565b5f6148125f19846008026147f7565b1980831691505092915050565b5f61482a8383614803565b9150826002028217905092915050565b61484382613c4e565b67ffffffffffffffff81111561485c5761485b613faf565b5b614866825461466d565b6148718282856147b1565b5f60209050601f8311600181146148a2575f8415614890578287015190505b61489a858261481f565b865550614901565b601f1984166148b08661469d565b5f5b828110156148d7578489015182556001820191506020850194506020810190506148b2565b868310156148f457848901516148f0601f891682614803565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b5f61492c61492761492284614909565b61471b565b613cf8565b9050919050565b61493c81614912565b82525050565b5f819050919050565b5f61496561496061495b84614942565b61471b565b613cf8565b9050919050565b6149758161494b565b82525050565b5f60408201905061498e5f830185614933565b61499b602083018461496c565b9392505050565b5f6149ac82613cf8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149de576149dd614501565b5b600182019050919050565b5f81546149f58161466d565b6149ff8186614436565b9450600182165f8114614a195760018114614a2e57614a60565b60ff1983168652811515820286019350614a60565b614a378561469d565b5f5b83811015614a5857815481890152600182019150602081019050614a39565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f614a9d600583614436565b9150614aa882614a69565b600582019050919050565b5f614abe82856149e9565b9150614aca82846144b0565b9150614ad582614a91565b91508190509392505050565b5f604082019050614af45f830185613e16565b8181036020830152614b068184613ca0565b90509392505050565b5f819050919050565b614b29614b2482613e8e565b614b0f565b82525050565b5f614b3a8284614b18565b60208201915081905092915050565b7f4d757374207061792000000000000000000000000000000000000000000000005f82015250565b5f614b7d600983614436565b9150614b8882614b49565b600982019050919050565b7f207765692e0000000000000000000000000000000000000000000000000000005f82015250565b5f614bc7600583614436565b9150614bd282614b93565b600582019050919050565b5f614be782614b71565b9150614bf382846144b0565b9150614bfe82614bbb565b915081905092915050565b5f614c1382613cf8565b9150614c1e83613cf8565b9250828201905080821115614c3657614c35614501565b5b92915050565b5f614c4682613cf8565b9150614c5183613cf8565b925082614c6157614c6061456f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f614cbd82614c99565b614cc78185614ca3565b9350614cd7818560208601613c68565b614ce081613c90565b840191505092915050565b5f608082019050614cfe5f830187613d86565b614d0b6020830186613d86565b614d186040830185613e16565b8181036060830152614d2a8184614cb3565b905095945050505050565b5f81519050614d4381613bc6565b92915050565b5f60208284031215614d5e57614d5d613b93565b5b5f614d6b84828501614d35565b9150509291505056fe43616e6e6f74207472616e7366657220746f20746865207a65726f206164647265737321417474656d70746564207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465722142616c616e636520717565727920666f7220746865207a65726f20616464726573732ea26469706673582212206b0103a9098b89a210e216e0fd95bb2e3a53797a12ca93b21cc8a4351085976c64736f6c63430008160033

Deployed Bytecode Sourcemap

18970:8048:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22418:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22332:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11030:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10700:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22075:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23214:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11666:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22200:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21769:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25930:429;;;:::i;:::-;;23951:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11905:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26869:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10506:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10334:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9686:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25457:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21932:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22676:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11207:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24484:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12085:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23653:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25722:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22876:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26604:260;;;:::i;:::-;;21567:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24187:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11507:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9441:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24971:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9921:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22418:197;22519:4;22559:10;22552:18;;22537:33;;;:11;:33;;;;:73;;;;22574:36;22598:11;22574:23;:36::i;:::-;22537:73;22530:80;;22418:197;;;:::o;22332:81::-;22368:13;1366:11;;;;;;;;;;;;;;;;;1310:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;22388:20;;22332:81;:::o;11030:172::-;11105:7;11127:16;11135:7;11127;:16::i;:::-;11145:15;;;;;;;;;;;;;;;;;11119:42;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11173:15;:24;11189:7;11173:24;;;;;;;;;;;;;;;;;;;;;11166:31;;11030:172;;;:::o;10700:325::-;10776:2;9112:21;:27;9134:4;9112:27;;;;;;;;;;;;;;;;;;;;;;;;;9111:28;9141:15;;;;;;;;;;;;;;;;;9103:54;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10802:13:::1;10818:23;10833:7;10818:14;:23::i;:::-;10802:39;;10860:5;10854:11;;:2;:11;;;;10867:17;;;;;;;;;;;;;;;;::::0;10846:39:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10919:5;10903:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;10928:37;10945:5;10952:12;:10;:12::i;:::-;10928:16;:37::i;:::-;10903:62;10972:17;;;;;;;;;;;;;;;;::::0;10890:104:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10999:21;11008:2;11012:7;10999:8;:21::i;:::-;10797:228;10700:325:::0;;;:::o;22075:73::-;22114:7;22135:8;;22128:15;;22075:73;:::o;23214:76::-;23257:7;23278;;23271:14;;23214:76;:::o;11666:234::-;11761:4;11767:2;9245:21;:27;9267:4;9245:27;;;;;;;;;;;;;;;;;;;;;;;;;9244:28;:58;;;;;9277:21;:25;9299:2;9277:25;;;;;;;;;;;;;;;;;;;;;;;;;9276:26;9244:58;9304:15;;;;;;;;;;;;;;;;;9236:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11801:41:::1;11820:12;:10;:12::i;:::-;11834:7;11801:18;:41::i;:::-;11844:17;;;;;;;;;;;;;;;;::::0;11793:69:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11867:28;11877:4;11883:2;11887:7;11867:9;:28::i;:::-;11666:234:::0;;;;;:::o;22200:84::-;22242:7;22263:16;;22256:23;;22200:84;:::o;21769:94::-;21824:4;21842:16;21850:7;21842;:16::i;:::-;21835:23;;21769:94;;;:::o;25930:429::-;21014:18;;;;;;;;;;;20998:34;;:12;:10;:12::i;:::-;:34;;;:74;;;;21052:20;;;;;;;;;;;21036:36;;:12;:10;:12::i;:::-;:36;;;20998:74;21075:17;;;;;;;;;;;;;;;;;20989:104;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20169:11:::1;;;;;;;;;;;20168:12;20182:10;;;;;;;;;;;;;;;;::::0;20160:33:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25992:12:::2;26007:21;25992:36;;26033:14;26065:3;26060:2;26050:7;:12;;;;:::i;:::-;:18;;;;:::i;:::-;26033:35;;26073:14;26100:9;26090:7;:19;;;;:::i;:::-;26073:36;;26132:1;26122:7;:11;26135:20;;;;;;;;;;;;;;;;::::0;26114:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26162:12;26181:20;;;;;;;;;;;26180:27;;26215:9;26180:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26161:68;;;26235:13;26255:18;;;;;;;;;;;26254:25;;26287:9;26254:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26234:67;;;26314:7;:19;;;;;26325:8;26314:19;26335:18;;;;;;;;;;;;;;;;::::0;26306:48:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25987:372;;;;;25930:429::o:0;23951:106::-;21014:18;;;;;;;;;;;20998:34;;:12;:10;:12::i;:::-;:34;;;:74;;;;21052:20;;;;;;;;;;;21036:36;;:12;:10;:12::i;:::-;:36;;;20998:74;21075:17;;;;;;;;;;;;;;;;;20989:104;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24043:9:::1;24022:18;;:30;;;;;;;;;;;;;;;;;;23951:106:::0;:::o;11905:175::-;12004:4;12010:2;9245:21;:27;9267:4;9245:27;;;;;;;;;;;;;;;;;;;;;;;;;9244:28;:58;;;;;9277:21;:25;9299:2;9277:25;;;;;;;;;;;;;;;;;;;;;;;;;9276:26;9244:58;9304:15;;;;;;;;;;;;;;;;;9236:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12036:39:::1;12053:4;12059:2;12063:7;12036:39;;;;;;;;;;;::::0;:16:::1;:39::i;:::-;11905:175:::0;;;;;:::o;26869:146::-;27002:7;26994:6;26966:44;;26984:8;26966:44;;;;;;;;;;;;26869:146;;;:::o;10506:189::-;10577:7;10591:13;10607:7;:16;10615:7;10607:16;;;;;;;;;;;;;;;;;;;;;10591:32;;10653:1;10636:19;;:5;:19;;;;10657:15;;;;;;;;;;;;;;;;;10628:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10685:5;10678:12;;;10506:189;;;:::o;10334:167::-;10405:7;10444:1;10427:19;;:5;:19;;;;10448;;;;;;;;;;;;;;;;;10419:49;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10480:9;:16;10490:5;10480:16;;;;;;;;;;;;;;;;10473:23;;10334:167;;;:::o;9686:130::-;9736:21;:27;9758:4;9736:27;;;;;;;;;;;;;;;;;;;;;;;;;9733:79;;;9801:5;9771:21;:27;9793:4;9771:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;9733:79;9686:130;:::o;25457:101::-;20910:18;;;;;;;;;;;20894:34;;:12;:10;:12::i;:::-;:34;;;20930:17;;;;;;;;;;;;;;;;;20886:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25542:11:::1;25523:16;:30;;;;25457:101:::0;:::o;21932:83::-;21976:7;21997:13;;21990:20;;21932:83;:::o;22676:85::-;22714:13;22741:15;;;;;;;;;;;;;;;;;22734:22;;22676:85;:::o;11207:295::-;11297:8;9112:21;:27;9134:4;9112:27;;;;;;;;;;;;;;;;;;;;;;;;;9111:28;9141:15;;;;;;;;;;;;;;;;;9103:54;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11349:12:::1;:10;:12::i;:::-;11337:24;;:8;:24;;;;11363:17;;;;;;;;;;;;;;;;::::0;11329:52:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11431:8;11386:18;:32;11405:12;:10;:12::i;:::-;11386:32;;;;;;;;;;;;;;;:42;11419:8;11386:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;11478:8;11449:48;;11464:12;:10;:12::i;:::-;11449:48;;;11488:8;11449:48;;;;;;:::i;:::-;;;;;;;;11207:295:::0;;;:::o;24484:277::-;20910:18;;;;;;;;;;;20894:34;;:12;:10;:12::i;:::-;:34;;;20930:17;;;;;;;;;;;;;;;;;20886:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24583:1:::1;24573:6;:11;;::::0;24570:116:::1;;24610:7;24592:15;:25;;;;;;:::i;:::-;;24570:116;;;24645:1;24635:6;:11;;::::0;24632:54:::1;;24673:7;24654:16;:26;;;;;;:::i;:::-;;24632:54;24570:116;24709:1;24693:13;;:17;24690:67;;;24723:28;24743:1;24746:4;24723:28;;;;;;;:::i;:::-;;;;;;;;24690:67;24484:277:::0;;:::o;12085:269::-;12204:4;12210:2;9245:21;:27;9267:4;9245:27;;;;;;;;;;;;;;;;;;;;;;;;;9244:28;:58;;;;;9277:21;:25;9299:2;9277:25;;;;;;;;;;;;;;;;;;;;;;;;;9276:26;9244:58;9304:15;;;;;;;;;;;;;;;;;9236:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12244:41:::1;12263:12;:10;:12::i;:::-;12277:7;12244:18;:41::i;:::-;12287:17;;;;;;;;;;;;;;;;::::0;12236:69:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12310:39;12324:4;12330:2;12334:7;12343:5;12310:13;:39::i;:::-;12085:269:::0;;;;;;:::o;23653:140::-;23707:7;20467:1;20457:7;:11;20470:15;;;;;;;;;;;;;;;;;20449:37;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20510:7;;20499;:18;;20519:15;;;;;;;;;;;;;;;;;20491:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20549:16;20557:7;20549;:16::i;:::-;20548:17;20567;;;;;;;;;;;;;;;;;20540:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21014:18:::1;;;;;;;;;;;20998:34;;:12;:10;:12::i;:::-;:34;;;:74;;;;21052:20;;;;;;;;;;;21036:36;;:12;:10;:12::i;:::-;:36;;;20998:74;21075:17;;;;;;;;;;;;;;;;::::0;20989:104:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23740:13:::2;;:15;;;;;;;;;:::i;:::-;;;;;;23760:28;23766:12;:10;:12::i;:::-;23780:7;23760:5;:28::i;:::-;23653:140:::0;;:::o;25722:85::-;21014:18;;;;;;;;;;;20998:34;;:12;:10;:12::i;:::-;:34;;;:74;;;;21052:20;;;;;;;;;;;21036:36;;:12;:10;:12::i;:::-;:36;;;20998:74;21075:17;;;;;;;;;;;;;;;;;20989:104;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25796:6:::1;25782:11;;:20;;;;;;;;;;;;;;;;;;25722:85:::0;:::o;22876:288::-;22958:13;22929:7;20276:1;20266:7;:11;20279:15;;;;;;;;;;;;;;;;;20258:37;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20319:7;;20308;:18;;20328:15;;;;;;;;;;;;;;;;;20300:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20357:16;20365:7;20357;:16::i;:::-;20375:15;;;;;;;;;;;;;;;;;20349:42;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23087:15:::1;23109:25;23126:7;23109:16;:25::i;:::-;23064:90;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23045:114;;22876:288:::0;;;;:::o;26604:260::-;21014:18;;;;;;;;;;;20998:34;;:12;:10;:12::i;:::-;:34;;;:74;;;;21052:20;;;;;;;;;;;21036:36;;:12;:10;:12::i;:::-;:36;;;20998:74;21075:17;;;;;;;;;;;;;;;;;20989:104;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20169:11:::1;;;;;;;;;;;20168:12;20182:10;;;;;;;;;;;;;;;;::::0;20160:33:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26674:12:::2;26689:21;26674:36;;26733:1;26723:7;:11;26736:20;;;;;;;;;;;;;;;;::::0;26715:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26763:12;26782:10;26781:17;;26806:7;26781:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26762:56;;;26831:7;26840:18;;;;;;;;;;;;;;;;::::0;26823:36:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26669:195;;26604:260::o:0;21567:91::-;21610:13;21637:16;21630:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21567:91;:::o;24187:89::-;20910:18;;;;;;;;;;;20894:34;;:12;:10;:12::i;:::-;:34;;;20930:17;;;;;;;;;;;;;;;;;20886:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24262:9:::1;24251:8;:20;;;;24187:89:::0;:::o;11507:154::-;11603:4;11621:18;:25;11640:5;11621:25;;;;;;;;;;;;;;;:35;11647:8;11621:35;;;;;;;;;;;;;;;;;;;;;;;;;11614:42;;11507:154;;;;:::o;9441:128::-;9490:21;:27;9512:4;9490:27;;;;;;;;;;;;;;;;;;;;;;;;;9486:79;;9555:4;9525:21;:27;9547:4;9525:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;9486:79;9441:128;:::o;24971:349::-;25064:7;20467:1;20457:7;:11;20470:15;;;;;;;;;;;;;;;;;20449:37;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20510:7;;20499;:18;;20519:15;;;;;;;;;;;;;;;;;20491:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20549:16;20557:7;20549;:16::i;:::-;20548:17;20567;;;;;;;;;;;;;;;;;20540:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25083:7:::1;25092:5;25099:4;20686:13;20746:7;20755:4;20735:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20725:36;;;;;;20712:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;20702:61;;;;;;20686:77;;20776:50;20795:5;20802:16;;20820:5;20776:18;:50::i;:::-;20828:17;;;;;;;;;;;;;;;;::::0;20768:78:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25139:8:::2;;25126:9;:21;;25186:26;25203:8;;25186:16;:26::i;:::-;25156:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;25118:106;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25238:11;;;;;;;;;;;25237:12;25251:10;;;;;;;;;;;;;;;;::::0;25229:33:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25267:13;;:15;;;;;;;;;:::i;:::-;;;;;;25287:28;25293:12;:10;:12::i;:::-;25307:7;25287:5;:28::i;:::-;20681:176:::1;20590:1;;;24971:349:::0;;;;:::o;9921:193::-;9978:13;10001:21;:27;10023:4;10001:27;;;;;;;;;;;;;;;;;;;;;;;;;9998:112;;;10043:15;;;;;;;;;;;;;;;;;10036:22;;;;9998:112;10086:18;;;;;;;;;;;;;;;;;10079:25;;9921:193;;;;:::o;10119:210::-;10220:4;10256:25;10241:40;;;:11;:40;;;;:83;;;;10288:36;10312:11;10288:23;:36::i;:::-;10241:83;10231:93;;10119:210;;;:::o;12622:117::-;12686:4;12732:1;12704:30;;:7;:16;12712:7;12704:16;;;;;;;;;;;;;;;;;;;;;:30;;;;12697:37;;12622:117;;;:::o;7051:88::-;7103:7;7124:10;7117:17;;7051:88;:::o;14013:186::-;14092:2;9112:21;:27;9134:4;9112:27;;;;;;;;;;;;;;;;;;;;;;;;;9111:28;9141:15;;;;;;;;;;;;;;;;;9103:54;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;14136:2:::1;14109:15;:24;14125:7;14109:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;14186:7;14182:2;14148:46;;14157:23;14172:7;14157:14;:23::i;:::-;14148:46;;;;;;;;;;;;14013:186:::0;;;:::o;12744:295::-;12836:4;12855:16;12863:7;12855;:16::i;:::-;12873:15;;;;;;;;;;;;;;;;;12847:42;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12894:13;12910:23;12925:7;12910:14;:23::i;:::-;12894:39;;12957:5;12946:16;;:7;:16;;;:51;;;;12990:7;12966:31;;:20;12978:7;12966:11;:20::i;:::-;:31;;;12946:51;:87;;;;13001:32;13018:5;13025:7;13001:16;:32::i;:::-;12946:87;12938:96;;;12744:295;;;;:::o;13583:425::-;13677:4;13683:2;9245:21;:27;9267:4;9245:27;;;;;;;;;;;;;;;;;;;;;;;;;9244:28;:58;;;;;9277:21;:25;9299:2;9277:25;;;;;;;;;;;;;;;;;;;;;;;;;9276:26;9244:58;9304:15;;;;;;;;;;;;;;;;;9236:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;13735:4:::1;13708:31;;:23;13723:7;13708:14;:23::i;:::-;:31;;;13741:17;;;;;;;;;;;;;;;;::::0;13700:59:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;13786:1;13772:16;;:2;:16;;;;13790:20;;;;;;;;;;;;;;;;;13764:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;13824:16;13832:7;13824;:16::i;:::-;13842:15;;;;;;;;;;;;;;;;::::0;13816:42:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;13863:29;13880:1;13884:7;13863:8;:29::i;:::-;13916:1;13897:9:::0;:15:::1;13907:4;13897:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;13939:1;13922:9:::0;:13:::1;13932:2;13922:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;13964:2;13945:7;:16:::0;13953:7:::1;13945:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;13995:7;13991:2;13976:27;;13985:4;13976:27;;;;;;;;;;;;13583:425:::0;;;;;:::o;12359:258::-;12477:4;12483:2;9245:21;:27;9267:4;9245:27;;;;;;;;;;;;;;;;;;;;;;;;;9244:28;:58;;;;;9277:21;:25;9299:2;9277:25;;;;;;;;;;;;;;;;;;;;;;;;;9276:26;9244:58;9304:15;;;;;;;;;;;;;;;;;9236:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12500:28:::1;12510:4;12516:2;12520:7;12500:9;:28::i;:::-;12541:48;12564:4;12570:2;12574:7;12583:5;12541:22;:48::i;:::-;12591:20;;;;;;;;;;;;;;;;;12533:79;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12359:258:::0;;;;;;:::o;13372:206::-;13447:16;13455:7;13447;:16::i;:::-;13446:17;13465:15;;;;;;;;;;;;;;;;;13438:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;13503:1;13486:9;:13;13496:2;13486:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;13528:2;13509:7;:16;13517:7;13509:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;13565:7;13561:2;13540:33;;13557:1;13540:33;;;;;;;;;;;;13372:206;;:::o;7395:413::-;7450:13;7482:1;7473:5;:10;7470:37;;7491:10;;;;;;;;;;;;;;;;;;;;;7470:37;7511:12;7526:5;7511:20;;7536:14;7555:54;7570:1;7562:4;:9;7555:54;;7579:8;;;;;:::i;:::-;;;;7601:2;7593:10;;;;;:::i;:::-;;;7555:54;;;7613:19;7645:6;7635:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7613:39;;7657:121;7673:1;7664:5;:10;7657:121;;7692:1;7682:11;;;;;:::i;:::-;;;7750:2;7742:5;:10;;;;:::i;:::-;7729:2;:24;;;;:::i;:::-;7716:39;;7699:6;7706;7699:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7770:2;7761:11;;;;;:::i;:::-;;;7657:121;;;7796:6;7782:21;;;;;7395:413;;;;:::o;16098:147::-;16189:4;16236;16207:25;16220:5;16227:4;16207:12;:25::i;:::-;:33;16200:40;;16098:147;;;;;:::o;8463:::-;8547:4;8580:25;8565:40;;;:11;:40;;;;8558:47;;8463:147;;;:::o;14204:555::-;14315:4;14329:15;:2;:13;;;:15::i;:::-;14326:429;;;14372:2;14356:36;;;14393:12;:10;:12::i;:::-;14407:4;14413:7;14422:5;14356:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14352:366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14580:1;14563:6;:13;:18;14560:152;;14598:20;;;;;;;;;;;;;;;;;14591:28;;;;;;;;;;;:::i;:::-;;;;;;;;14560:152;14689:6;14683:13;14674:6;14670:2;14666:15;14659:38;14352:366;14476:41;;;14466:51;;;:6;:51;;;;14459:58;;;;;14326:429;14745:4;14738:11;;14204:555;;;;;;;:::o;16250:259::-;16333:7;16347:20;16370:4;16347:27;;16383:9;16379:102;16402:5;:12;16398:1;:16;16379:102;;;16442:33;16452:12;16466:5;16472:1;16466:8;;;;;;;;:::i;:::-;;;;;;;;16442:9;:33::i;:::-;16427:48;;16416:3;;;;;;;16379:102;;;;16492:12;16485:19;;;16250:259;;;;:::o;4243:159::-;4302:4;4313:12;4365:7;4353:20;4345:28;;4396:1;4389:4;:8;4382:15;;;4243:159;;;:::o;18572:140::-;18635:7;18660:1;18656;:5;:51;;18687:20;18702:1;18705;18687:14;:20::i;:::-;18656:51;;;18664:20;18679:1;18682;18664:14;:20::i;:::-;18656:51;18649:58;;18572:140;;;;:::o;18717:220::-;18785:13;18871:1;18865:4;18858:15;18891:1;18885:4;18878:15;18923:4;18917;18907:21;18898:30;;18717:220;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:329::-;6361:6;6410:2;6398:9;6389:7;6385:23;6381:32;6378:119;;;6416:79;;:::i;:::-;6378:119;6536:1;6561:53;6606:7;6597:6;6586:9;6582:22;6561:53;:::i;:::-;6551:63;;6507:117;6302:329;;;;:::o;6637:122::-;6710:24;6728:5;6710:24;:::i;:::-;6703:5;6700:35;6690:63;;6749:1;6746;6739:12;6690:63;6637:122;:::o;6765:139::-;6811:5;6849:6;6836:20;6827:29;;6865:33;6892:5;6865:33;:::i;:::-;6765:139;;;;:::o;6910:329::-;6969:6;7018:2;7006:9;6997:7;6993:23;6989:32;6986:119;;;7024:79;;:::i;:::-;6986:119;7144:1;7169:53;7214:7;7205:6;7194:9;7190:22;7169:53;:::i;:::-;7159:63;;7115:117;6910:329;;;;:::o;7245:116::-;7315:21;7330:5;7315:21;:::i;:::-;7308:5;7305:32;7295:60;;7351:1;7348;7341:12;7295:60;7245:116;:::o;7367:133::-;7410:5;7448:6;7435:20;7426:29;;7464:30;7488:5;7464:30;:::i;:::-;7367:133;;;;:::o;7506:468::-;7571:6;7579;7628:2;7616:9;7607:7;7603:23;7599:32;7596:119;;;7634:79;;:::i;:::-;7596:119;7754:1;7779:53;7824:7;7815:6;7804:9;7800:22;7779:53;:::i;:::-;7769:63;;7725:117;7881:2;7907:50;7949:7;7940:6;7929:9;7925:22;7907:50;:::i;:::-;7897:60;;7852:115;7506:468;;;;;:::o;7980:117::-;8089:1;8086;8079:12;8103:117;8212:1;8209;8202:12;8226:180;8274:77;8271:1;8264:88;8371:4;8368:1;8361:15;8395:4;8392:1;8385:15;8412:281;8495:27;8517:4;8495:27;:::i;:::-;8487:6;8483:40;8625:6;8613:10;8610:22;8589:18;8577:10;8574:34;8571:62;8568:88;;;8636:18;;:::i;:::-;8568:88;8676:10;8672:2;8665:22;8455:238;8412:281;;:::o;8699:129::-;8733:6;8760:20;;:::i;:::-;8750:30;;8789:33;8817:4;8809:6;8789:33;:::i;:::-;8699:129;;;:::o;8834:308::-;8896:4;8986:18;8978:6;8975:30;8972:56;;;9008:18;;:::i;:::-;8972:56;9046:29;9068:6;9046:29;:::i;:::-;9038:37;;9130:4;9124;9120:15;9112:23;;8834:308;;;:::o;9148:146::-;9245:6;9240:3;9235;9222:30;9286:1;9277:6;9272:3;9268:16;9261:27;9148:146;;;:::o;9300:425::-;9378:5;9403:66;9419:49;9461:6;9419:49;:::i;:::-;9403:66;:::i;:::-;9394:75;;9492:6;9485:5;9478:21;9530:4;9523:5;9519:16;9568:3;9559:6;9554:3;9550:16;9547:25;9544:112;;;9575:79;;:::i;:::-;9544:112;9665:54;9712:6;9707:3;9702;9665:54;:::i;:::-;9384:341;9300:425;;;;;:::o;9745:340::-;9801:5;9850:3;9843:4;9835:6;9831:17;9827:27;9817:122;;9858:79;;:::i;:::-;9817:122;9975:6;9962:20;10000:79;10075:3;10067:6;10060:4;10052:6;10048:17;10000:79;:::i;:::-;9991:88;;9807:278;9745:340;;;;:::o;10091:86::-;10126:7;10166:4;10159:5;10155:16;10144:27;;10091:86;;;:::o;10183:118::-;10254:22;10270:5;10254:22;:::i;:::-;10247:5;10244:33;10234:61;;10291:1;10288;10281:12;10234:61;10183:118;:::o;10307:135::-;10351:5;10389:6;10376:20;10367:29;;10405:31;10430:5;10405:31;:::i;:::-;10307:135;;;;:::o;10448:650::-;10524:6;10532;10581:2;10569:9;10560:7;10556:23;10552:32;10549:119;;;10587:79;;:::i;:::-;10549:119;10735:1;10724:9;10720:17;10707:31;10765:18;10757:6;10754:30;10751:117;;;10787:79;;:::i;:::-;10751:117;10892:63;10947:7;10938:6;10927:9;10923:22;10892:63;:::i;:::-;10882:73;;10678:287;11004:2;11030:51;11073:7;11064:6;11053:9;11049:22;11030:51;:::i;:::-;11020:61;;10975:116;10448:650;;;;;:::o;11104:307::-;11165:4;11255:18;11247:6;11244:30;11241:56;;;11277:18;;:::i;:::-;11241:56;11315:29;11337:6;11315:29;:::i;:::-;11307:37;;11399:4;11393;11389:15;11381:23;;11104:307;;;:::o;11417:423::-;11494:5;11519:65;11535:48;11576:6;11535:48;:::i;:::-;11519:65;:::i;:::-;11510:74;;11607:6;11600:5;11593:21;11645:4;11638:5;11634:16;11683:3;11674:6;11669:3;11665:16;11662:25;11659:112;;;11690:79;;:::i;:::-;11659:112;11780:54;11827:6;11822:3;11817;11780:54;:::i;:::-;11500:340;11417:423;;;;;:::o;11859:338::-;11914:5;11963:3;11956:4;11948:6;11944:17;11940:27;11930:122;;11971:79;;:::i;:::-;11930:122;12088:6;12075:20;12113:78;12187:3;12179:6;12172:4;12164:6;12160:17;12113:78;:::i;:::-;12104:87;;11920:277;11859:338;;;;:::o;12203:943::-;12298:6;12306;12314;12322;12371:3;12359:9;12350:7;12346:23;12342:33;12339:120;;;12378:79;;:::i;:::-;12339:120;12498:1;12523:53;12568:7;12559:6;12548:9;12544:22;12523:53;:::i;:::-;12513:63;;12469:117;12625:2;12651:53;12696:7;12687:6;12676:9;12672:22;12651:53;:::i;:::-;12641:63;;12596:118;12753:2;12779:53;12824:7;12815:6;12804:9;12800:22;12779:53;:::i;:::-;12769:63;;12724:118;12909:2;12898:9;12894:18;12881:32;12940:18;12932:6;12929:30;12926:117;;;12962:79;;:::i;:::-;12926:117;13067:62;13121:7;13112:6;13101:9;13097:22;13067:62;:::i;:::-;13057:72;;12852:287;12203:943;;;;;;;:::o;13152:323::-;13208:6;13257:2;13245:9;13236:7;13232:23;13228:32;13225:119;;;13263:79;;:::i;:::-;13225:119;13383:1;13408:50;13450:7;13441:6;13430:9;13426:22;13408:50;:::i;:::-;13398:60;;13354:114;13152:323;;;;:::o;13481:474::-;13549:6;13557;13606:2;13594:9;13585:7;13581:23;13577:32;13574:119;;;13612:79;;:::i;:::-;13574:119;13732:1;13757:53;13802:7;13793:6;13782:9;13778:22;13757:53;:::i;:::-;13747:63;;13703:117;13859:2;13885:53;13930:7;13921:6;13910:9;13906:22;13885:53;:::i;:::-;13875:63;;13830:118;13481:474;;;;;:::o;13961:311::-;14038:4;14128:18;14120:6;14117:30;14114:56;;;14150:18;;:::i;:::-;14114:56;14200:4;14192:6;14188:17;14180:25;;14260:4;14254;14250:15;14242:23;;13961:311;;;:::o;14278:117::-;14387:1;14384;14377:12;14418:710;14514:5;14539:81;14555:64;14612:6;14555:64;:::i;:::-;14539:81;:::i;:::-;14530:90;;14640:5;14669:6;14662:5;14655:21;14703:4;14696:5;14692:16;14685:23;;14756:4;14748:6;14744:17;14736:6;14732:30;14785:3;14777:6;14774:15;14771:122;;;14804:79;;:::i;:::-;14771:122;14919:6;14902:220;14936:6;14931:3;14928:15;14902:220;;;15011:3;15040:37;15073:3;15061:10;15040:37;:::i;:::-;15035:3;15028:50;15107:4;15102:3;15098:14;15091:21;;14978:144;14962:4;14957:3;14953:14;14946:21;;14902:220;;;14906:21;14520:608;;14418:710;;;;;:::o;15151:370::-;15222:5;15271:3;15264:4;15256:6;15252:17;15248:27;15238:122;;15279:79;;:::i;:::-;15238:122;15396:6;15383:20;15421:94;15511:3;15503:6;15496:4;15488:6;15484:17;15421:94;:::i;:::-;15412:103;;15228:293;15151:370;;;;:::o;15527:1009::-;15639:6;15647;15655;15704:2;15692:9;15683:7;15679:23;15675:32;15672:119;;;15710:79;;:::i;:::-;15672:119;15830:1;15855:53;15900:7;15891:6;15880:9;15876:22;15855:53;:::i;:::-;15845:63;;15801:117;15985:2;15974:9;15970:18;15957:32;16016:18;16008:6;16005:30;16002:117;;;16038:79;;:::i;:::-;16002:117;16143:78;16213:7;16204:6;16193:9;16189:22;16143:78;:::i;:::-;16133:88;;15928:303;16298:2;16287:9;16283:18;16270:32;16329:18;16321:6;16318:30;16315:117;;;16351:79;;:::i;:::-;16315:117;16456:63;16511:7;16502:6;16491:9;16487:22;16456:63;:::i;:::-;16446:73;;16241:288;15527:1009;;;;;:::o;16542:148::-;16644:11;16681:3;16666:18;;16542:148;;;;:::o;16696:222::-;16836:34;16832:1;16824:6;16820:14;16813:58;16905:5;16900:2;16892:6;16888:15;16881:30;16696:222;:::o;16924:402::-;17084:3;17105:85;17187:2;17182:3;17105:85;:::i;:::-;17098:92;;17199:93;17288:3;17199:93;:::i;:::-;17317:2;17312:3;17308:12;17301:19;;16924:402;;;:::o;17332:390::-;17438:3;17466:39;17499:5;17466:39;:::i;:::-;17521:89;17603:6;17598:3;17521:89;:::i;:::-;17514:96;;17619:65;17677:6;17672:3;17665:4;17658:5;17654:16;17619:65;:::i;:::-;17709:6;17704:3;17700:16;17693:23;;17442:280;17332:390;;;;:::o;17728:541::-;17961:3;17983:148;18127:3;17983:148;:::i;:::-;17976:155;;18148:95;18239:3;18230:6;18148:95;:::i;:::-;18141:102;;18260:3;18253:10;;17728:541;;;;:::o;18275:180::-;18323:77;18320:1;18313:88;18420:4;18417:1;18410:15;18444:4;18441:1;18434:15;18461:410;18501:7;18524:20;18542:1;18524:20;:::i;:::-;18519:25;;18558:20;18576:1;18558:20;:::i;:::-;18553:25;;18613:1;18610;18606:9;18635:30;18653:11;18635:30;:::i;:::-;18624:41;;18814:1;18805:7;18801:15;18798:1;18795:22;18775:1;18768:9;18748:83;18725:139;;18844:18;;:::i;:::-;18725:139;18509:362;18461:410;;;;:::o;18877:180::-;18925:77;18922:1;18915:88;19022:4;19019:1;19012:15;19046:4;19043:1;19036:15;19063:185;19103:1;19120:20;19138:1;19120:20;:::i;:::-;19115:25;;19154:20;19172:1;19154:20;:::i;:::-;19149:25;;19193:1;19183:35;;19198:18;;:::i;:::-;19183:35;19240:1;19237;19233:9;19228:14;;19063:185;;;;:::o;19254:194::-;19294:4;19314:20;19332:1;19314:20;:::i;:::-;19309:25;;19348:20;19366:1;19348:20;:::i;:::-;19343:25;;19392:1;19389;19385:9;19377:17;;19416:1;19410:4;19407:11;19404:37;;;19421:18;;:::i;:::-;19404:37;19254:194;;;;:::o;19454:147::-;19555:11;19592:3;19577:18;;19454:147;;;;:::o;19607:114::-;;:::o;19727:398::-;19886:3;19907:83;19988:1;19983:3;19907:83;:::i;:::-;19900:90;;19999:93;20088:3;19999:93;:::i;:::-;20117:1;20112:3;20108:11;20101:18;;19727:398;;;:::o;20131:379::-;20315:3;20337:147;20480:3;20337:147;:::i;:::-;20330:154;;20501:3;20494:10;;20131:379;;;:::o;20516:180::-;20564:77;20561:1;20554:88;20661:4;20658:1;20651:15;20685:4;20682:1;20675:15;20702:320;20746:6;20783:1;20777:4;20773:12;20763:22;;20830:1;20824:4;20820:12;20851:18;20841:81;;20907:4;20899:6;20895:17;20885:27;;20841:81;20969:2;20961:6;20958:14;20938:18;20935:38;20932:84;;20988:18;;:::i;:::-;20932:84;20753:269;20702:320;;;:::o;21028:141::-;21077:4;21100:3;21092:11;;21123:3;21120:1;21113:14;21157:4;21154:1;21144:18;21136:26;;21028:141;;;:::o;21175:93::-;21212:6;21259:2;21254;21247:5;21243:14;21239:23;21229:33;;21175:93;;;:::o;21274:107::-;21318:8;21368:5;21362:4;21358:16;21337:37;;21274:107;;;;:::o;21387:393::-;21456:6;21506:1;21494:10;21490:18;21529:97;21559:66;21548:9;21529:97;:::i;:::-;21647:39;21677:8;21666:9;21647:39;:::i;:::-;21635:51;;21719:4;21715:9;21708:5;21704:21;21695:30;;21768:4;21758:8;21754:19;21747:5;21744:30;21734:40;;21463:317;;21387:393;;;;;:::o;21786:60::-;21814:3;21835:5;21828:12;;21786:60;;;:::o;21852:142::-;21902:9;21935:53;21953:34;21962:24;21980:5;21962:24;:::i;:::-;21953:34;:::i;:::-;21935:53;:::i;:::-;21922:66;;21852:142;;;:::o;22000:75::-;22043:3;22064:5;22057:12;;22000:75;;;:::o;22081:269::-;22191:39;22222:7;22191:39;:::i;:::-;22252:91;22301:41;22325:16;22301:41;:::i;:::-;22293:6;22286:4;22280:11;22252:91;:::i;:::-;22246:4;22239:105;22157:193;22081:269;;;:::o;22356:73::-;22401:3;22356:73;:::o;22435:189::-;22512:32;;:::i;:::-;22553:65;22611:6;22603;22597:4;22553:65;:::i;:::-;22488:136;22435:189;;:::o;22630:186::-;22690:120;22707:3;22700:5;22697:14;22690:120;;;22761:39;22798:1;22791:5;22761:39;:::i;:::-;22734:1;22727:5;22723:13;22714:22;;22690:120;;;22630:186;;:::o;22822:543::-;22923:2;22918:3;22915:11;22912:446;;;22957:38;22989:5;22957:38;:::i;:::-;23041:29;23059:10;23041:29;:::i;:::-;23031:8;23027:44;23224:2;23212:10;23209:18;23206:49;;;23245:8;23230:23;;23206:49;23268:80;23324:22;23342:3;23324:22;:::i;:::-;23314:8;23310:37;23297:11;23268:80;:::i;:::-;22927:431;;22912:446;22822:543;;;:::o;23371:117::-;23425:8;23475:5;23469:4;23465:16;23444:37;;23371:117;;;;:::o;23494:169::-;23538:6;23571:51;23619:1;23615:6;23607:5;23604:1;23600:13;23571:51;:::i;:::-;23567:56;23652:4;23646;23642:15;23632:25;;23545:118;23494:169;;;;:::o;23668:295::-;23744:4;23890:29;23915:3;23909:4;23890:29;:::i;:::-;23882:37;;23952:3;23949:1;23945:11;23939:4;23936:21;23928:29;;23668:295;;;;:::o;23968:1395::-;24085:37;24118:3;24085:37;:::i;:::-;24187:18;24179:6;24176:30;24173:56;;;24209:18;;:::i;:::-;24173:56;24253:38;24285:4;24279:11;24253:38;:::i;:::-;24338:67;24398:6;24390;24384:4;24338:67;:::i;:::-;24432:1;24456:4;24443:17;;24488:2;24480:6;24477:14;24505:1;24500:618;;;;25162:1;25179:6;25176:77;;;25228:9;25223:3;25219:19;25213:26;25204:35;;25176:77;25279:67;25339:6;25332:5;25279:67;:::i;:::-;25273:4;25266:81;25135:222;24470:887;;24500:618;24552:4;24548:9;24540:6;24536:22;24586:37;24618:4;24586:37;:::i;:::-;24645:1;24659:208;24673:7;24670:1;24667:14;24659:208;;;24752:9;24747:3;24743:19;24737:26;24729:6;24722:42;24803:1;24795:6;24791:14;24781:24;;24850:2;24839:9;24835:18;24822:31;;24696:4;24693:1;24689:12;24684:17;;24659:208;;;24895:6;24886:7;24883:19;24880:179;;;24953:9;24948:3;24944:19;24938:26;24996:48;25038:4;25030:6;25026:17;25015:9;24996:48;:::i;:::-;24988:6;24981:64;24903:156;24880:179;25105:1;25101;25093:6;25089:14;25085:22;25079:4;25072:36;24507:611;;;24470:887;;24060:1303;;;23968:1395;;:::o;25369:85::-;25414:7;25443:5;25432:16;;25369:85;;;:::o;25460:158::-;25518:9;25551:61;25569:42;25578:32;25604:5;25578:32;:::i;:::-;25569:42;:::i;:::-;25551:61;:::i;:::-;25538:74;;25460:158;;;:::o;25624:147::-;25719:45;25758:5;25719:45;:::i;:::-;25714:3;25707:58;25624:147;;:::o;25777:88::-;25825:7;25854:5;25843:16;;25777:88;;;:::o;25871:164::-;25932:9;25965:64;25983:45;25992:35;26021:5;25992:35;:::i;:::-;25983:45;:::i;:::-;25965:64;:::i;:::-;25952:77;;25871:164;;;:::o;26041:153::-;26139:48;26181:5;26139:48;:::i;:::-;26134:3;26127:61;26041:153;;:::o;26200:370::-;26340:4;26378:2;26367:9;26363:18;26355:26;;26391:79;26467:1;26456:9;26452:17;26443:6;26391:79;:::i;:::-;26480:83;26559:2;26548:9;26544:18;26535:6;26480:83;:::i;:::-;26200:370;;;;;:::o;26576:233::-;26615:3;26638:24;26656:5;26638:24;:::i;:::-;26629:33;;26684:66;26677:5;26674:77;26671:103;;26754:18;;:::i;:::-;26671:103;26801:1;26794:5;26790:13;26783:20;;26576:233;;;:::o;26839:874::-;26942:3;26979:5;26973:12;27008:36;27034:9;27008:36;:::i;:::-;27060:89;27142:6;27137:3;27060:89;:::i;:::-;27053:96;;27180:1;27169:9;27165:17;27196:1;27191:166;;;;27371:1;27366:341;;;;27158:549;;27191:166;27275:4;27271:9;27260;27256:25;27251:3;27244:38;27337:6;27330:14;27323:22;27315:6;27311:35;27306:3;27302:45;27295:52;;27191:166;;27366:341;27433:38;27465:5;27433:38;:::i;:::-;27493:1;27507:154;27521:6;27518:1;27515:13;27507:154;;;27595:7;27589:14;27585:1;27580:3;27576:11;27569:35;27645:1;27636:7;27632:15;27621:26;;27543:4;27540:1;27536:12;27531:17;;27507:154;;;27690:6;27685:3;27681:16;27674:23;;27373:334;;27158:549;;26946:767;;26839:874;;;;:::o;27719:155::-;27859:7;27855:1;27847:6;27843:14;27836:31;27719:155;:::o;27880:400::-;28040:3;28061:84;28143:1;28138:3;28061:84;:::i;:::-;28054:91;;28154:93;28243:3;28154:93;:::i;:::-;28272:1;28267:3;28263:11;28256:18;;27880:400;;;:::o;28286:695::-;28564:3;28586:92;28674:3;28665:6;28586:92;:::i;:::-;28579:99;;28695:95;28786:3;28777:6;28695:95;:::i;:::-;28688:102;;28807:148;28951:3;28807:148;:::i;:::-;28800:155;;28972:3;28965:10;;28286:695;;;;;:::o;28987:423::-;29128:4;29166:2;29155:9;29151:18;29143:26;;29179:71;29247:1;29236:9;29232:17;29223:6;29179:71;:::i;:::-;29297:9;29291:4;29287:20;29282:2;29271:9;29267:18;29260:48;29325:78;29398:4;29389:6;29325:78;:::i;:::-;29317:86;;28987:423;;;;;:::o;29416:79::-;29455:7;29484:5;29473:16;;29416:79;;;:::o;29501:157::-;29606:45;29626:24;29644:5;29626:24;:::i;:::-;29606:45;:::i;:::-;29601:3;29594:58;29501:157;;:::o;29664:256::-;29776:3;29791:75;29862:3;29853:6;29791:75;:::i;:::-;29891:2;29886:3;29882:12;29875:19;;29911:3;29904:10;;29664:256;;;;:::o;29926:159::-;30066:11;30062:1;30054:6;30050:14;30043:35;29926:159;:::o;30091:400::-;30251:3;30272:84;30354:1;30349:3;30272:84;:::i;:::-;30265:91;;30365:93;30454:3;30365:93;:::i;:::-;30483:1;30478:3;30474:11;30467:18;;30091:400;;;:::o;30497:155::-;30637:7;30633:1;30625:6;30621:14;30614:31;30497:155;:::o;30658:400::-;30818:3;30839:84;30921:1;30916:3;30839:84;:::i;:::-;30832:91;;30932:93;31021:3;30932:93;:::i;:::-;31050:1;31045:3;31041:11;31034:18;;30658:400;;;:::o;31064:807::-;31398:3;31420:148;31564:3;31420:148;:::i;:::-;31413:155;;31585:95;31676:3;31667:6;31585:95;:::i;:::-;31578:102;;31697:148;31841:3;31697:148;:::i;:::-;31690:155;;31862:3;31855:10;;31064:807;;;;:::o;31877:191::-;31917:3;31936:20;31954:1;31936:20;:::i;:::-;31931:25;;31970:20;31988:1;31970:20;:::i;:::-;31965:25;;32013:1;32010;32006:9;31999:16;;32034:3;32031:1;32028:10;32025:36;;;32041:18;;:::i;:::-;32025:36;31877:191;;;;:::o;32074:176::-;32106:1;32123:20;32141:1;32123:20;:::i;:::-;32118:25;;32157:20;32175:1;32157:20;:::i;:::-;32152:25;;32196:1;32186:35;;32201:18;;:::i;:::-;32186:35;32242:1;32239;32235:9;32230:14;;32074:176;;;;:::o;32256:180::-;32304:77;32301:1;32294:88;32401:4;32398:1;32391:15;32425:4;32422:1;32415:15;32442:98;32493:6;32527:5;32521:12;32511:22;;32442:98;;;:::o;32546:168::-;32629:11;32663:6;32658:3;32651:19;32703:4;32698:3;32694:14;32679:29;;32546:168;;;;:::o;32720:373::-;32806:3;32834:38;32866:5;32834:38;:::i;:::-;32888:70;32951:6;32946:3;32888:70;:::i;:::-;32881:77;;32967:65;33025:6;33020:3;33013:4;33006:5;33002:16;32967:65;:::i;:::-;33057:29;33079:6;33057:29;:::i;:::-;33052:3;33048:39;33041:46;;32810:283;32720:373;;;;:::o;33099:640::-;33294:4;33332:3;33321:9;33317:19;33309:27;;33346:71;33414:1;33403:9;33399:17;33390:6;33346:71;:::i;:::-;33427:72;33495:2;33484:9;33480:18;33471:6;33427:72;:::i;:::-;33509;33577:2;33566:9;33562:18;33553:6;33509:72;:::i;:::-;33628:9;33622:4;33618:20;33613:2;33602:9;33598:18;33591:48;33656:76;33727:4;33718:6;33656:76;:::i;:::-;33648:84;;33099:640;;;;;;;:::o;33745:141::-;33801:5;33832:6;33826:13;33817:22;;33848:32;33874:5;33848:32;:::i;:::-;33745:141;;;;:::o;33892:349::-;33961:6;34010:2;33998:9;33989:7;33985:23;33981:32;33978:119;;;34016:79;;:::i;:::-;33978:119;34136:1;34161:63;34216:7;34207:6;34196:9;34192:22;34161:63;:::i;:::-;34151:73;;34107:127;33892:349;;;;:::o

Swarm Source

ipfs://6b0103a9098b89a210e216e0fd95bb2e3a53797a12ca93b21cc8a4351085976c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.