Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 661 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Send From | 119480405 | 642 days ago | IN | 0.000127967437416 ETH | 0.000015711057 | ||||
| Mint | 119480393 | 642 days ago | IN | 0.000002 ETH | 0.000003398443 | ||||
| Send From | 119402794 | 644 days ago | IN | 0.000034898023831 ETH | 0.000015464831 | ||||
| Mint | 119402786 | 644 days ago | IN | 0.000002 ETH | 0.000003421474 | ||||
| Send From | 119396104 | 644 days ago | IN | 0.000051146990897 ETH | 0.000015547235 | ||||
| Send From | 119395697 | 644 days ago | IN | 0.000034243175545 ETH | 0.00001549123 | ||||
| Mint | 119395689 | 644 days ago | IN | 0.000004 ETH | 0.000003390617 | ||||
| Send From | 119378617 | 645 days ago | IN | 0.000121166438349 ETH | 0.00001552907 | ||||
| Send From | 119378604 | 645 days ago | IN | 0.000037579755419 ETH | 0.000016030527 | ||||
| Send From | 119378596 | 645 days ago | IN | 0.000174543557061 ETH | 0.000016442803 | ||||
| Mint | 119378592 | 645 days ago | IN | 0.000006 ETH | 0.000003387757 | ||||
| Send From | 119358693 | 645 days ago | IN | 0.000051146990897 ETH | 0.00001563688 | ||||
| Send From | 119358665 | 645 days ago | IN | 0.000062881303057 ETH | 0.000015748162 | ||||
| Send From | 119358647 | 645 days ago | IN | 0.000067358317315 ETH | 0.00001612695 | ||||
| Send From | 119358635 | 645 days ago | IN | 0.000035007926569 ETH | 0.000015970165 | ||||
| Send From | 119358628 | 645 days ago | IN | 0.000060549036731 ETH | 0.000016219246 | ||||
| Mint | 119358609 | 645 days ago | IN | 0.000004 ETH | 0.000002394851 | ||||
| Mint | 119358586 | 645 days ago | IN | 0.000044 ETH | 0.000003441712 | ||||
| Send From | 119357750 | 645 days ago | IN | 0.000092660095544 ETH | 0.000015669443 | ||||
| Mint | 119357735 | 645 days ago | IN | 0.000002 ETH | 0.000003495105 | ||||
| Send From | 119346112 | 645 days ago | IN | 0.000060549036731 ETH | 0.000015830804 | ||||
| Mint | 119346103 | 645 days ago | IN | 0.000004 ETH | 0.000003394649 | ||||
| Send From | 119310125 | 646 days ago | IN | 0.000328923801199 ETH | 0.000015701088 | ||||
| Mint | 119310111 | 646 days ago | IN | 0.000002 ETH | 0.000003409734 | ||||
| Send From | 119305765 | 646 days ago | IN | 0.000037579755419 ETH | 0.000015992539 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 119480405 | 642 days ago | 0.000107967437416 ETH | ||||
| 119402794 | 644 days ago | 0.000014898023831 ETH | ||||
| 119396104 | 644 days ago | 0.000031146990897 ETH | ||||
| 119395697 | 644 days ago | 0.000014243175545 ETH | ||||
| 119378617 | 645 days ago | 0.000101166438349 ETH | ||||
| 119378604 | 645 days ago | 0.000017579755419 ETH | ||||
| 119378596 | 645 days ago | 0.000154543557061 ETH | ||||
| 119358693 | 645 days ago | 0.000031146990897 ETH | ||||
| 119358665 | 645 days ago | 0.000042881303057 ETH | ||||
| 119358647 | 645 days ago | 0.000047358317315 ETH | ||||
| 119358635 | 645 days ago | 0.000015007926569 ETH | ||||
| 119358628 | 645 days ago | 0.000040549036731 ETH | ||||
| 119357750 | 645 days ago | 0.000072660095544 ETH | ||||
| 119346112 | 645 days ago | 0.000040549036731 ETH | ||||
| 119310125 | 646 days ago | 0.000308923801199 ETH | ||||
| 119305765 | 646 days ago | 0.000017579755419 ETH | ||||
| 119305721 | 646 days ago | 0.000017680455281 ETH | ||||
| 119305694 | 646 days ago | 0.000031146990897 ETH | ||||
| 119305679 | 646 days ago | 0.000050441303057 ETH | ||||
| 119305670 | 646 days ago | 0.000015007926569 ETH | ||||
| 119305664 | 646 days ago | 0.000041740975167 ETH | ||||
| 119302234 | 646 days ago | 0.000015469564732 ETH | ||||
| 119302201 | 646 days ago | 0.000308923801199 ETH | ||||
| 119297847 | 646 days ago | 0.000017579755419 ETH | ||||
| 119297839 | 646 days ago | 0.000031146990897 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Omni
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%(((((((((((((#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@#((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((@@@@@@@&((@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@&((((((((((((((((((((#@@@@@@@(((((((((((#@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@#@@&(((((((((((((((((&@@@@@@&(((((((((((((((((((#@@@@@@@@@@@@@@@
// @@@@@@@@@@@&(((((&@%((((((((((((/@@@@@@@#((((((((((((((((((((#@@@@@@@@@@@@@@@@@@
// @@@@@@@#(((((((((&@%((((((((((@@@@@@(////////////((((((((%@@@@@@@((((((((#@@@@@@
// @@@@@@%((((((((((&@%((((((((//@%////////////////////(@@@@@@@%(((((((((((((#@@@@@
// @@@@@@%((((((((((&@%((((((//////////////////////#@@@@@@@((((((((((((((((((#@@@@@
// @@@@@@%((((((((%@@@%((((////////////////////&@@@@@@@//////(((((((((((((((((@@@@@
// @@@@@@%((((%@@@@@@&/((/////////////////(@@@@@@@%////////////(((((((((((((((@@@@@
// @@@@@@@@@@@@@@#(((((///////////////%@@@@@@@(/////////////////((((((((((((((@@@@@
// @@@@@@@@@@((((((((((///////////&@@@@@@&/////////////////////#/(((((((((((((@@@@@
// @@@@@@%((((((((((((///////////@@@@#////////////////////(@@@@@/(((((((((((((@@@@@
// @@@@@@%(((((((((((////////////@@@//////////////////%@@@@@@&////((((((((((((@@@@@
// @@@@@@%((((((((((/&(//////////@@@//////////////&@@@@@@#///////(((((((((((((@@@@@
// @@@@@@%(((((((@@@@@#//////////@@@/////////(@@@@@@@////////////(((((((((((((@@@@@
// @@@@@@&((%@@@@@@@@@%//////////@@@/////%@@@@@@&///////////////((((((((((((((@@@@@
// @@@@@@@@@@@@%((((@@%((////////@@@#@@@@@@@#/////////////////((((((((((((((((@@@@@
// @@@@@@@@%((((((((@@%((((/////#@@@@@@@/////////////////////%@@((((((((((((((@@@@@
// @@@@@@@((((((((((&@&((((/%@@@@@@&/////////////////////&@@@@@&((((((((((((((@@@@@
// @@@@@@@((((((((((&@@#@@@@@@@#////////////////////(@@@@@@@((((((((((((((((((@@@@@
// @@@@@@@#((((((((%@@@@@@@((((((((/////////////%@@@@@@%(((((((((((((((((((((@@@@@@
// @@@@@@@@@@@&&@@@@@@&((((((((((((((((((((/@@@@@@@((((((((((((((((((((((@@@@@@@@@@
// @@@@@@@@@@@@@@@@#((((((((((((((((((((@@@@@@@(((((((((((((((((((((%@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@#(((((((((((%@@@@@@%(((((((((((((((((((((@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@&(((@@@@@@@(((((((((((((((((((((#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((&@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(((((%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
pragma solidity ^0.8.0;
import "./OFT.sol";
// OMNI Contract
contract Omni is OFT {
uint public fee = 0.000002 ether;
uint public referral_fee = 0.000001 ether;
// Referral Event
event ReferralUsed(address indexed to, uint256 amount, address referralAddress);
constructor(address _layerZeroEndpoint) OFT("Omni OFT", "OMNI", _layerZeroEndpoint) {}
// Mint with referral function
function _mintWithReferral(address _to, uint256 _amount, address referralAddress) internal {
require(_amount * fee <= msg.value, "Insufficient ether");
// If referral address is provided, add tracking event
if (referralAddress != address(0)) {
emit ReferralUsed(_to, _amount, referralAddress);
}
_mint(_to, _amount * 10 ** decimals());
}
// Mint function without referral
function mint(address _to, uint256 _amount) external payable {
_mintWithReferral(_to, _amount, address(0));
}
// Mint function with referral
function mint(address _to, uint256 _amount, address referralAddress) external payable {
_mintWithReferral(_to, _amount, referralAddress);
}
// Set Fee
function setFee(uint _fee) external onlyOwner {
fee = _fee;
}
// Withdraw
function withdraw() public payable onlyOwner {
(bool success, ) = payable(msg.sender).call{
value: address(this).balance
}("");
require(success);
}
}
// SPDX-License-Identifier: Unlicense /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.19;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/**
* @dev Standard ERC20 Errors
* Interface of the ERC6093 custom errors for ERC20 tokens
* as defined in https://eips.ethereum.org/EIPS/eip-6093
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the ERC6093 custom errors for ERC721 tokens
* as defined in https://eips.ethereum.org/EIPS/eip-6093
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the ERC6093 custom errors for ERC1155 tokens
* as defined in https://eips.ethereum.org/EIPS/eip-6093
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.19;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.19;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./IERC20Metadata.sol";
import {Context} from "./Context.sol";
import {IERC20Errors} from "./draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error ERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `requestedDecrease`.
*
* NOTE: Although this function is designed to avoid double spending with {approval},
* it can still be frontrunned, preventing any attempt of allowance reduction.
*/
function decreaseAllowance(address spender, uint256 requestedDecrease) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < requestedDecrease) {
revert ERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
unchecked {
_approve(owner, spender, currentAllowance - requestedDecrease);
}
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` (or `to`) is
* the zero address. All customizations to transfers, mints, and burns should be done by overriding this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, by transferring it to address(0).
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 value) internal virtual {
_approve(owner, spender, value, true);
}
/**
* @dev Alternative version of {_approve} with an optional flag that can enable or disable the Approval event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to true
* using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.7.6;
library ExcessivelySafeCall {
uint256 constant LOW_28_MASK =
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := call(
_gas, // gas
_target, // recipient
0, // ether value
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeStaticCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal view returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := staticcall(
_gas, // gas
_target, // recipient
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/**
* @notice Swaps function selectors in encoded contract calls
* @dev Allows reuse of encoded calldata for functions with identical
* argument types but different names. It simply swaps out the first 4 bytes
* for the new selector. This function modifies memory in place, and should
* only be used with caution.
* @param _newSelector The new 4-byte selector
* @param _buf The encoded contract args
*/
function swapSelector(bytes4 _newSelector, bytes memory _buf)
internal
pure
{
require(_buf.length >= 4);
uint256 _mask = LOW_28_MASK;
assembly {
// load the first word of
let _word := mload(add(_buf, 0x20))
// mask out the top 4 bytes
// /x
_word := and(_word, _mask)
_word := or(_newSelector, _word)
mstore(add(_buf, 0x20), _word)
}
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.19;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.19;
import {IERC20} from "./IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./ILayerZeroUserApplicationConfig.sol";
interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
// @notice send a LayerZero message to the specified address at a LayerZero endpoint.
// @param _dstChainId - the destination chain identifier
// @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
// @param _payload - a custom bytes payload to send to the destination contract
// @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
// @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
// @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
// @notice used by the messaging library to publish verified payload
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source contract (as bytes) at the source chain
// @param _dstAddress - the address on destination chain
// @param _nonce - the unbound message ordering nonce
// @param _gasLimit - the gas limit for external contract execution
// @param _payload - verified payload to send to the destination contract
function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;
// @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
// @notice get the outboundNonce from this source chain which, consequently, is always an EVM
// @param _srcAddress - the source chain contract address
function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
// @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
// @param _dstChainId - the destination chain identifier
// @param _userApplication - the user app address on this EVM chain
// @param _payload - the custom message to send over LayerZero
// @param _payInZRO - if false, user app pays the protocol fee in native token
// @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
// @notice get this Endpoint's immutable source identifier
function getChainId() external view returns (uint16);
// @notice the interface to retry failed message on this Endpoint destination
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
// @param _payload - the payload to be retried
function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;
// @notice query if any STORED payload (message blocking) at the endpoint.
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
// @notice query if the _libraryAddress is valid for sending msgs.
// @param _userApplication - the user app address on this EVM chain
function getSendLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the _libraryAddress is valid for receiving msgs.
// @param _userApplication - the user app address on this EVM chain
function getReceiveLibraryAddress(address _userApplication) external view returns (address);
// @notice query if the non-reentrancy guard for send() is on
// @return true if the guard is on. false otherwise
function isSendingPayload() external view returns (bool);
// @notice query if the non-reentrancy guard for receive() is on
// @return true if the guard is on. false otherwise
function isReceivingPayload() external view returns (bool);
// @notice get the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _userApplication - the contract address of the user application
// @param _configType - type of configuration. every messaging library has its own convention.
function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
// @notice get the send() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getSendVersion(address _userApplication) external view returns (uint16);
// @notice get the lzReceive() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getReceiveVersion(address _userApplication) external view returns (uint16);
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface ILayerZeroReceiver {
// @notice LayerZero endpoint will invoke this function to deliver the message on the destination
// @param _srcChainId - the source endpoint identifier
// @param _srcAddress - the source sending contract address from the source chain
// @param _nonce - the ordered message nonce
// @param _payload - the signed payload is the UA bytes has encoded to be sent
function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface ILayerZeroUserApplicationConfig {
// @notice set the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _configType - type of configuration. every messaging library has its own convention.
// @param _config - configuration in the bytes. can encode arbitrary content.
function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;
// @notice set the send() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setSendVersion(uint16 _version) external;
// @notice set the lzReceive() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setReceiveVersion(uint16 _version) external;
// @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
// @param _srcChainId - the chainId of the source chain
// @param _srcAddress - the contract address of the source contract at the source chain
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./IOFTCore.sol";
import "./IERC20.sol";
/**
* @dev Interface of the OFT standard
*/
interface IOFT is IOFTCore, IERC20 {
}
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./IERC165.sol";
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTCore is IERC165 {
/**
* @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
* _dstChainId - L0 defined chain id to send tokens too
* _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
* _amount - amount of the tokens to transfer
* _useZro - indicates to use zro to pay L0 fees
* _adapterParam - flexible bytes array to indicate messaging adapter services in L0
*/
function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
/**
* @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
* `_from` the owner of token
* `_dstChainId` the destination chain identifier
* `_toAddress` can be any size depending on the `dstChainId`.
* `_amount` the quantity of tokens in wei
* `_refundAddress` the address LayerZero refunds if too much message fee is sent
* `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
* `_adapterParams` is a flexible bytes array to indicate messaging adapter services
*/
function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
/**
* @dev returns the circulating amount of tokens on current chain
*/
function circulatingSupply() external view returns (uint);
/**
* @dev returns the address of the ERC20 token
*/
function token() external view returns (address);
/**
* @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
* `_nonce` is the outbound nonce
*/
event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount);
/**
* @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
* `_nonce` is the inbound nonce.
*/
event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);
event SetUseCustomAdapterParams(bool _useCustomAdapterParams);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Ownable.sol";
import "./ILayerZeroReceiver.sol";
import "./ILayerZeroUserApplicationConfig.sol";
import "./ILayerZeroEndpoint.sol";
import "./BytesLib.sol";
/*
* a generic LzReceiver implementation
*/
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
using BytesLib for bytes;
// ua can not send payload larger than this by default, but it can be changed by the ua owner
uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;
ILayerZeroEndpoint public immutable lzEndpoint;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
mapping(uint16 => uint) public payloadSizeLimitLookup;
address public precrime;
event SetPrecrime(address precrime);
event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);
constructor(address _endpoint) Ownable(msg.sender) {
lzEndpoint = ILayerZeroEndpoint(_endpoint);
}
function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {
// lzReceive must be called by the endpoint for security
require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");
bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
// if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract");
_blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
// abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;
function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual {
bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
_checkPayloadSize(_dstChainId, _payload.length);
lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
}
function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {
uint providedGasLimit = _getGasLimit(_adapterParams);
uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;
require(minGasLimit > 0, "LzApp: minGasLimit not set");
require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low");
}
function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
assembly {
gasLimit := mload(add(_adapterParams, 34))
}
}
function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
if (payloadSizeLimit == 0) { // use default if not set
payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
}
require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large");
}
//---------------------------UserApplication config----------------------------------------
function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {
return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
}
// generic config for LayerZero user Application
function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {
lzEndpoint.setConfig(_version, _chainId, _configType, _config);
}
function setSendVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setSendVersion(_version);
}
function setReceiveVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setReceiveVersion(_version);
}
function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
}
// _path = abi.encodePacked(remoteAddress, localAddress)
// this function set the trusted path for the cross-chain communication
function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner {
trustedRemoteLookup[_remoteChainId] = _path;
emit SetTrustedRemote(_remoteChainId, _path);
}
function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
}
function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
bytes memory path = trustedRemoteLookup[_remoteChainId];
require(path.length != 0, "LzApp: no trusted path record");
return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
}
function setPrecrime(address _precrime) external onlyOwner {
precrime = _precrime;
emit SetPrecrime(_precrime);
}
function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {
require(_minGas > 0, "LzApp: invalid minGas");
minDstGasLookup[_dstChainId][_packetType] = _minGas;
emit SetMinDstGas(_dstChainId, _packetType, _minGas);
}
// if the size is 0, it means default size limit
function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
payloadSizeLimitLookup[_dstChainId] = _size;
}
//--------------------------- VIEW FUNCTION ----------------------------------------
function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
return keccak256(trustedSource) == keccak256(_srcAddress);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./LzApp.sol";
import "./ExcessivelySafeCall.sol";
/*
* the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
* this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
* NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
*/
abstract contract NonblockingLzApp is LzApp {
using ExcessivelySafeCall for address;
constructor(address _endpoint) LzApp(_endpoint) {}
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;
event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);
// overriding the virtual function in LzReceiver
function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
(bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));
// try-catch all errors/exceptions
if (!success) {
_storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
}
}
function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual {
failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
}
function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {
// only internal transaction
require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
//@notice override this function
function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;
function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {
// assert there is message to retry
bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
// clear the stored message
failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
// execute the message. revert if it fails again
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ERC20.sol";
import "./IERC165.sol";
import "./IOFT.sol";
import "./OFTCore.sol";
// override decimal() function is needed
contract OFT is OFTCore, ERC20, IOFT {
constructor(string memory _name, string memory _symbol, address _lzEndpoint) ERC20(_name, _symbol) OFTCore(_lzEndpoint) {}
function supportsInterface(bytes4 interfaceId) public view virtual override(OFTCore, IERC165) returns (bool) {
return interfaceId == type(IOFT).interfaceId || interfaceId == type(IERC20).interfaceId || super.supportsInterface(interfaceId);
}
function token() public view virtual override returns (address) {
return address(this);
}
function circulatingSupply() public view virtual override returns (uint) {
return totalSupply();
}
function _debitFrom(address _from, uint16, bytes memory, uint _amount) internal virtual override returns(uint) {
address spender = _msgSender();
if (_from != spender) _spendAllowance(_from, spender, _amount);
_burn(_from, _amount);
return _amount;
}
function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns(uint) {
_mint(_toAddress, _amount);
return _amount;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./NonblockingLzApp.sol";
import "./IOFTCore.sol";
import "./ERC165.sol";
abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore {
using BytesLib for bytes;
uint public constant NO_EXTRA_GAS = 0;
// packet type
uint16 public constant PT_SEND = 0;
bool public useCustomAdapterParams;
constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId);
}
function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
// mock the payload for sendFrom()
bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount);
return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
}
function estimateSendFee2(uint16 _dstChainId, bytes memory payload, bool _useZro, bytes memory _adapterParams) public view virtual returns (uint nativeFee, uint zroFee) {
return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
}
function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) public payable virtual override {
_send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams);
}
function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner {
useCustomAdapterParams = _useCustomAdapterParams;
emit SetUseCustomAdapterParams(_useCustomAdapterParams);
}
function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
uint16 packetType;
assembly {
packetType := mload(add(_payload, 32))
}
if (packetType == PT_SEND) {
_sendAck(_srcChainId, _srcAddress, _nonce, _payload);
} else {
revert("OFTCore: unknown packet type");
}
}
function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
_checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);
uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount);
bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount);
(uint nativeFee,) = estimateSendFee2(_dstChainId, lzPayload, false, _adapterParams);
require(msg.value >= nativeFee, "Not enough gas to send");
_lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, nativeFee);
emit SendToChain(_dstChainId, _from, _toAddress, amount);
}
function _sendAck(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual {
(, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint));
address to = toAddressBytes.toAddress(0);
amount = _creditTo(_srcChainId, to, amount);
emit ReceiveFromChain(_srcChainId, to, amount);
}
function _checkAdapterParams(uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas) internal virtual {
if (useCustomAdapterParams) {
_checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas);
} else {
require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty.");
}
}
function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount) internal virtual returns(uint);
function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual returns(uint);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.19;
import {Context} from "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"ERC20FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"referralAddress","type":"address"}],"name":"ReferralUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee2","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"referralAddress","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referral_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","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":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60a06040526501d1a94a2000600c5564e8d4a51000600d553480156200002457600080fd5b50604051620061b2380380620061b283398181016040528101906200004a919062000264565b6040518060400160405280600881526020017f4f6d6e69204f46540000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4f4d4e490000000000000000000000000000000000000000000000000000000081525082828282808033620000ce816200013660201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505081600a908162000117919062000510565b5080600b908162000129919062000510565b50505050505050620005f7565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022c82620001ff565b9050919050565b6200023e816200021f565b81146200024a57600080fd5b50565b6000815190506200025e8162000233565b92915050565b6000602082840312156200027d576200027c620001fa565b5b60006200028d848285016200024d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200031857607f821691505b6020821081036200032e576200032d620002d0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003987fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000359565b620003a4868362000359565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003f1620003eb620003e584620003bc565b620003c6565b620003bc565b9050919050565b6000819050919050565b6200040d83620003d0565b620004256200041c82620003f8565b84845462000366565b825550505050565b600090565b6200043c6200042d565b6200044981848462000402565b505050565b5b8181101562000471576200046560008262000432565b6001810190506200044f565b5050565b601f821115620004c0576200048a8162000334565b620004958462000349565b81016020851015620004a5578190505b620004bd620004b48562000349565b8301826200044e565b50505b505050565b600082821c905092915050565b6000620004e560001984600802620004c5565b1980831691505092915050565b6000620005008383620004d2565b9150826002028217905092915050565b6200051b8262000296565b67ffffffffffffffff811115620005375762000536620002a1565b5b620005438254620002ff565b6200055082828562000475565b600060209050601f83116001811462000588576000841562000573578287015190505b6200057f8582620004f2565b865550620005ef565b601f198416620005988662000334565b60005b82811015620005c2578489015182556001820191506020850194506020810190506200059b565b86831015620005e25784890151620005de601f891682620004d2565b8355505b6001600288020188555050505b505050505050565b608051615b606200065260003960008181610c680152818161101a0152818161110f015281816112030152818161147c0152818161172a01528181611c3701528181611cf20152818161228a01526133040152615b606000f3fe6080604052600436106102fe5760003560e01c8063715018a611610190578063c4461834116100dc578063df2a5b3b11610095578063ed629c5c1161006f578063ed629c5c14610baa578063f2fde38b14610bd5578063f5ecbdbc14610bfe578063fc0c546a14610c3b576102fe565b8063df2a5b3b14610b2f578063eab45d9c14610b58578063eb8d72b714610b81576102fe565b8063c446183414610a2c578063c9fbdc3614610a57578063cbed8b9c14610a82578063d1deba1f14610aab578063dd62ed3e14610ac7578063ddca3f4314610b04576102fe565b806395d89b4111610149578063a6c3d16511610123578063a6c3d16514610972578063a9059cbb1461099b578063b353aaa7146109d8578063baf3292d14610a03576102fe565b806395d89b41146108cd5780639f38369a146108f8578063a457c2d714610935576102fe565b8063715018a6146107bb5780637533d788146107d25780638cfd8f5c1461080f5780638da5cb5b1461084c5780639358928b14610877578063950c8a74146108a2576102fe565b80633ccfd60b1161024f5780634c42899a1161020857806366ad5c8a116101e257806366ad5c8a146106ee57806369fe0e2d146107175780636d4135381461074057806370a082311461077e576102fe565b80634c42899a1461066a57806351905636146106955780635b8c41e6146106b1576102fe565b80633ccfd60b146105765780633d8b38f6146105805780633f1f4fa4146105bd57806340c10f19146105fa57806342d65a8d14610616578063447705151461063f576102fe565b80630df37483116102bc57806323b872dd1161029657806323b872dd146104935780632a205e3d146104d0578063313ce5671461050e5780633950935114610539576102fe565b80630df374831461041657806310ddb1371461043f57806318160ddd14610468576102fe565b80621d35671461030357806301ffc9a71461032c57806306fdde031461036957806307e0db1714610394578063095ea7b3146103bd5780630d4d1513146103fa575b600080fd5b34801561030f57600080fd5b5061032a600480360381019061032591906137e7565b610c66565b005b34801561033857600080fd5b50610353600480360381019061034e91906138e6565b610ebc565b604051610360919061392e565b60405180910390f35b34801561037557600080fd5b5061037e610f7e565b60405161038b91906139d9565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b691906139fb565b611010565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613abc565b6110a6565b6040516103f1919061392e565b60405180910390f35b610414600480360381019061040f9190613afc565b6110c9565b005b34801561042257600080fd5b5061043d60048036038101906104389190613b4f565b6110d9565b005b34801561044b57600080fd5b50610466600480360381019061046191906139fb565b611105565b005b34801561047457600080fd5b5061047d61119b565b60405161048a9190613b9e565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613bb9565b6111a5565b6040516104c7919061392e565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613c38565b6111d4565b604051610505929190613cf4565b60405180910390f35b34801561051a57600080fd5b506105236112b5565b6040516105309190613d39565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b9190613abc565b6112be565b60405161056d919061392e565b60405180910390f35b61057e6112f5565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613d54565b611376565b6040516105b4919061392e565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906139fb565b61144a565b6040516105f19190613b9e565b60405180910390f35b610614600480360381019061060f9190613abc565b611462565b005b34801561062257600080fd5b5061063d60048036038101906106389190613d54565b611472565b005b34801561064b57600080fd5b5061065461150e565b6040516106619190613b9e565b60405180910390f35b34801561067657600080fd5b5061067f611513565b60405161068c9190613dc3565b60405180910390f35b6106af60048036038101906106aa9190613e1c565b611518565b005b3480156106bd57600080fd5b506106d860048036038101906106d3919061402e565b6115ba565b6040516106e591906140b6565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906137e7565b611602565b005b34801561072357600080fd5b5061073e600480360381019061073991906140d1565b611713565b005b34801561074c57600080fd5b50610767600480360381019061076291906140fe565b611725565b604051610775929190613cf4565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a0919061419d565b6117d6565b6040516107b29190613b9e565b60405180910390f35b3480156107c757600080fd5b506107d061181f565b005b3480156107de57600080fd5b506107f960048036038101906107f491906139fb565b611833565b604051610806919061421f565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614241565b6118d3565b6040516108439190613b9e565b60405180910390f35b34801561085857600080fd5b506108616118f8565b60405161086e9190614290565b60405180910390f35b34801561088357600080fd5b5061088c611921565b6040516108999190613b9e565b60405180910390f35b3480156108ae57600080fd5b506108b7611930565b6040516108c49190614290565b60405180910390f35b3480156108d957600080fd5b506108e2611956565b6040516108ef91906139d9565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a91906139fb565b6119e8565b60405161092c919061421f565b60405180910390f35b34801561094157600080fd5b5061095c60048036038101906109579190613abc565b611b01565b604051610969919061392e565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613d54565b611b7e565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613abc565b611c12565b6040516109cf919061392e565b60405180910390f35b3480156109e457600080fd5b506109ed611c35565b6040516109fa919061430a565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a25919061419d565b611c59565b005b348015610a3857600080fd5b50610a41611cdc565b604051610a4e9190613b9e565b60405180910390f35b348015610a6357600080fd5b50610a6c611ce2565b604051610a799190613b9e565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190614325565b611ce8565b005b610ac56004803603810190610ac091906137e7565b611d8a565b005b348015610ad357600080fd5b50610aee6004803603810190610ae991906143ad565b611fcd565b604051610afb9190613b9e565b60405180910390f35b348015610b1057600080fd5b50610b19612054565b604051610b269190613b9e565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b5191906143ed565b61205a565b005b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190614440565b61211e565b005b348015610b8d57600080fd5b50610ba86004803603810190610ba39190613d54565b61217a565b005b348015610bb657600080fd5b50610bbf6121ed565b604051610bcc919061392e565b60405180910390f35b348015610be157600080fd5b50610bfc6004803603810190610bf7919061419d565b612200565b005b348015610c0a57600080fd5b50610c256004803603810190610c20919061446d565b612286565b604051610c32919061421f565b60405180910390f35b348015610c4757600080fd5b50610c50612337565b604051610c5d9190614290565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610ca561233f565b73ffffffffffffffffffffffffffffffffffffffff1614610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf290614520565b60405180910390fd5b6000600160008861ffff1661ffff1681526020019081526020016000208054610d239061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4f9061456f565b8015610d9c5780601f10610d7157610100808354040283529160200191610d9c565b820191906000526020600020905b815481529060010190602001808311610d7f57829003601f168201915b50505050509050805186869050148015610db7575060008151115b8015610de0575080805190602001208686604051610dd69291906145d0565b6040518091039020145b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061465b565b60405180910390fd5b610eb38787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612347565b50505050505050565b6000807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f6757507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f775750610f7682612412565b5b9050919050565b6060600a8054610f8d9061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb99061456f565b80156110065780601f10610fdb57610100808354040283529160200191611006565b820191906000526020600020905b815481529060010190602001808311610fe957829003601f168201915b5050505050905090565b61101861248c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b81526004016110719190613dc3565b600060405180830381600087803b15801561108b57600080fd5b505af115801561109f573d6000803e3d6000fd5b5050505050565b6000806110b161233f565b90506110be818585612513565b600191505092915050565b6110d4838383612525565b505050565b6110e161248c565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b61110d61248c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b81526004016111669190613dc3565b600060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b5050505050565b6000600954905090565b6000806111b061233f565b90506111bd858285612627565b6111c88585856126bb565b60019150509392505050565b6000806000808989896040516020016111f094939291906146a8565b60405160208183030381529060405290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401611264969594939291906146e8565b6040805180830381865afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190614760565b925092505097509795505050505050565b60006012905090565b6000806112c961233f565b90506112ea8185856112db8589611fcd565b6112e591906147cf565b612513565b600191505092915050565b6112fd61248c565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132390614829565b60006040518083038185875af1925050503d8060008114611360576040519150601f19603f3d011682016040523d82523d6000602084013e611365565b606091505b505090508061137357600080fd5b50565b600080600160008661ffff1661ffff168152602001908152602001600020805461139f9061456f565b80601f01602080910402602001604051908101604052809291908181526020018280546113cb9061456f565b80156114185780601f106113ed57610100808354040283529160200191611418565b820191906000526020600020905b8154815290600101906020018083116113fb57829003601f168201915b50505050509050838360405161142f9291906145d0565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b61146e82826000612525565b5050565b61147a61248c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016114d79392919061483e565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50505050505050565b600081565b600081565b6115af898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127af565b505050505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff1661162161233f565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906148e2565b60405180910390fd5b61170b8686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128b9565b505050505050565b61171b61248c565b80600c8190555050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb1087308888886040518663ffffffff1660e01b8152600401611789959493929190614902565b6040805180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190614760565b9150915094509492505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61182761248c565b6118316000612925565b565b600160205280600052604060002060009150905080546118529061456f565b80601f016020809104026020016040519081016040528092919081815260200182805461187e9061456f565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061192b61119b565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546119659061456f565b80601f01602080910402602001604051908101604052809291908181526020018280546119919061456f565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b5050505050905090565b60606000600160008461ffff1661ffff1681526020019081526020016000208054611a129061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e9061456f565b8015611a8b5780601f10611a6057610100808354040283529160200191611a8b565b820191906000526020600020905b815481529060010190602001808311611a6e57829003601f168201915b505050505090506000815103611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906149af565b60405180910390fd5b611af9600060148351611ae991906149cf565b836129e99092919063ffffffff16565b915050919050565b600080611b0c61233f565b90506000611b1a8286611fcd565b905083811015611b65578481856040517fa60f030c000000000000000000000000000000000000000000000000000000008152600401611b5c93929190614a03565b60405180910390fd5b611b728286868403612513565b60019250505092915050565b611b8661248c565b818130604051602001611b9b93929190614a82565b604051602081830303815290604052600160008561ffff1661ffff1681526020019081526020016000209081611bd19190614c4e565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611c059392919061483e565b60405180910390a1505050565b600080611c1d61233f565b9050611c2a8185856126bb565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611c6161248c565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b81604051611cd19190614290565b60405180910390a150565b61271081565b600d5481565b611cf061248c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611d51959493929190614d20565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff1681526020019081526020016000208686604051611db79291906145d0565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b8103611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990614de0565b60405180910390fd5b808383604051611e439291906145d0565b604051809103902014611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290614e72565b60405180910390fd5b6000801b600560008961ffff1661ffff1681526020019081526020016000208787604051611eba9291906145d0565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002081905550611f858787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128b9565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611fbc959493929190614ea1565b60405180910390a150505050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b61206261248c565b600081116120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90614f3b565b60405180910390fd5b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac083838360405161211193929190614f5b565b60405180910390a1505050565b61212661248c565b80600660006101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a48160405161216f919061392e565b60405180910390a150565b61218261248c565b8181600160008661ffff1661ffff16815260200190815260200160002091826121ac929190614f9d565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516121e09392919061483e565b60405180910390a1505050565b600660009054906101000a900460ff1681565b61220861248c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361227a5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122719190614290565b60405180910390fd5b61228381612925565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b81526004016122e7949392919061506d565b600060405180830381865afa158015612304573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061232d9190615122565b9050949350505050565b600030905090565b600033905090565b6000806123f35a60966366ad5c8a60e01b8989898960405160240161236f949392919061516b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16612b07909392919063ffffffff16565b915091508161240a576124098686868685612b9f565b5b505050505050565b60007f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612485575061248482612c4d565b5b9050919050565b61249461233f565b73ffffffffffffffffffffffffffffffffffffffff166124b26118f8565b73ffffffffffffffffffffffffffffffffffffffff1614612511576124d561233f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125089190614290565b60405180910390fd5b565b6125208383836001612cb7565b505050565b34600c548361253491906151be565b1115612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256c9061524c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125fa578273ffffffffffffffffffffffffffffffffffffffff167f0dbf48b2d95441997ef389702675fe528a55fde0899829fa0f9af2325781bc5183836040516125f192919061526c565b60405180910390a25b612622836126066112b5565b600a61261291906153c8565b8461261d91906151be565b612e8e565b505050565b60006126338484611fcd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146126b557818110156126a5578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161269c93929190614a03565b60405180910390fd5b6126b484848484036000612cb7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361272d5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016127249190614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016127969190614290565b60405180910390fd5b6127aa838383612f10565b505050565b6127bd866000836000613138565b60006127cb888888886131a9565b905060008087836040516020016127e493929190615413565b604051602081830303815290604052905060006128048983600087611725565b5090508034101561284a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128419061549d565b60405180910390fd5b61285889838888888661320b565b8973ffffffffffffffffffffffffffffffffffffffff168961ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08a866040516128a59291906154bd565b60405180910390a350505050505050505050565b600060208201519050600061ffff168161ffff16036128e3576128de858585856133a1565b61291e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291590615539565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836129f991906147cf565b1015612a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a31906155a5565b60405180910390fd5b8183612a4691906147cf565b84511015612a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8090615611565b60405180910390fd5b6060821560008114612aaa5760405191506000825260208201604052612afb565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ae85780518352602083019250602081019050612acb565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff811115612b2e57612b2d613f03565b5b6040519080825280601f01601f191660200182016040528015612b605781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d925086831115612b82578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612bd09190615662565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612c3e959493929190615679565b60405180910390a15050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d295760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612d209190614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d9b5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612d929190614290565b60405180910390fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612e88578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612e7f9190613b9e565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f005760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612ef79190614290565b60405180910390fd5b612f0c60008383612f10565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f62578060096000828254612f5691906147cf565b92505081905550613037565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fef578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612fe693929190614a03565b60405180910390fd5b818103600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361308057806009600082825403925050819055506130ce565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161312b9190613b9e565b60405180910390a3505050565b600660009054906101000a900460ff161561315e576131598484848461343e565b6131a3565b60008251146131a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319990615753565b60405180910390fd5b5b50505050565b6000806131b461233f565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146131f5576131f4868285612627565b5b6131ff868461351d565b82915050949350505050565b6000600160008861ffff1661ffff16815260200190815260200160002080546132339061456f565b80601f016020809104026020016040519081016040528092919081815260200182805461325f9061456f565b80156132ac5780601f10613281576101008083540402835291602001916132ac565b820191906000526020600020905b81548152906001019060200180831161328f57829003601f168201915b5050505050905060008151036132f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ee906157e5565b60405180910390fd5b61330287875161359f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b815260040161336696959493929190615814565b6000604051808303818588803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050505050505050505050565b600080828060200190518101906133b8919061589f565b925092505060006133d360008461361590919063ffffffff16565b90506133e087828461368b565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8460405161342d9190613b9e565b60405180910390a350505050505050565b6000613449836136a1565b9050600082600260008861ffff1661ffff16815260200190815260200160002060008761ffff1661ffff1681526020019081526020016000205461348d91906147cf565b9050600081116134d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c99061595a565b60405180910390fd5b80821015613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c906159c6565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361358f5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016135869190614290565b60405180910390fd5b61359b82600083612f10565b5050565b6000600360008461ffff1661ffff168152602001908152602001600020549050600081036135cd5761271090505b80821115613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790615a32565b60405180910390fd5b505050565b600060148261362491906147cf565b83511015613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e90615a9e565b60405180910390fd5b60006c01000000000000000000000000836020860101510490508091505092915050565b60006136978383612e8e565b8190509392505050565b60006022825110156136e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136df90615b0a565b60405180910390fd5b60228201519050919050565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b61371f81613708565b811461372a57600080fd5b50565b60008135905061373c81613716565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261376757613766613742565b5b8235905067ffffffffffffffff81111561378457613783613747565b5b6020830191508360018202830111156137a05761379f61374c565b5b9250929050565b600067ffffffffffffffff82169050919050565b6137c4816137a7565b81146137cf57600080fd5b50565b6000813590506137e1816137bb565b92915050565b60008060008060008060808789031215613804576138036136fe565b5b600061381289828a0161372d565b965050602087013567ffffffffffffffff81111561383357613832613703565b5b61383f89828a01613751565b9550955050604061385289828a016137d2565b935050606087013567ffffffffffffffff81111561387357613872613703565b5b61387f89828a01613751565b92509250509295509295509295565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138c38161388e565b81146138ce57600080fd5b50565b6000813590506138e0816138ba565b92915050565b6000602082840312156138fc576138fb6136fe565b5b600061390a848285016138d1565b91505092915050565b60008115159050919050565b61392881613913565b82525050565b6000602082019050613943600083018461391f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613983578082015181840152602081019050613968565b60008484015250505050565b6000601f19601f8301169050919050565b60006139ab82613949565b6139b58185613954565b93506139c5818560208601613965565b6139ce8161398f565b840191505092915050565b600060208201905081810360008301526139f381846139a0565b905092915050565b600060208284031215613a1157613a106136fe565b5b6000613a1f8482850161372d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5382613a28565b9050919050565b613a6381613a48565b8114613a6e57600080fd5b50565b600081359050613a8081613a5a565b92915050565b6000819050919050565b613a9981613a86565b8114613aa457600080fd5b50565b600081359050613ab681613a90565b92915050565b60008060408385031215613ad357613ad26136fe565b5b6000613ae185828601613a71565b9250506020613af285828601613aa7565b9150509250929050565b600080600060608486031215613b1557613b146136fe565b5b6000613b2386828701613a71565b9350506020613b3486828701613aa7565b9250506040613b4586828701613a71565b9150509250925092565b60008060408385031215613b6657613b656136fe565b5b6000613b748582860161372d565b9250506020613b8585828601613aa7565b9150509250929050565b613b9881613a86565b82525050565b6000602082019050613bb36000830184613b8f565b92915050565b600080600060608486031215613bd257613bd16136fe565b5b6000613be086828701613a71565b9350506020613bf186828701613a71565b9250506040613c0286828701613aa7565b9150509250925092565b613c1581613913565b8114613c2057600080fd5b50565b600081359050613c3281613c0c565b92915050565b600080600080600080600060a0888a031215613c5757613c566136fe565b5b6000613c658a828b0161372d565b975050602088013567ffffffffffffffff811115613c8657613c85613703565b5b613c928a828b01613751565b96509650506040613ca58a828b01613aa7565b9450506060613cb68a828b01613c23565b935050608088013567ffffffffffffffff811115613cd757613cd6613703565b5b613ce38a828b01613751565b925092505092959891949750929550565b6000604082019050613d096000830185613b8f565b613d166020830184613b8f565b9392505050565b600060ff82169050919050565b613d3381613d1d565b82525050565b6000602082019050613d4e6000830184613d2a565b92915050565b600080600060408486031215613d6d57613d6c6136fe565b5b6000613d7b8682870161372d565b935050602084013567ffffffffffffffff811115613d9c57613d9b613703565b5b613da886828701613751565b92509250509250925092565b613dbd81613708565b82525050565b6000602082019050613dd86000830184613db4565b92915050565b6000613de982613a28565b9050919050565b613df981613dde565b8114613e0457600080fd5b50565b600081359050613e1681613df0565b92915050565b600080600080600080600080600060e08a8c031215613e3e57613e3d6136fe565b5b6000613e4c8c828d01613a71565b9950506020613e5d8c828d0161372d565b98505060408a013567ffffffffffffffff811115613e7e57613e7d613703565b5b613e8a8c828d01613751565b97509750506060613e9d8c828d01613aa7565b9550506080613eae8c828d01613e07565b94505060a0613ebf8c828d01613a71565b93505060c08a013567ffffffffffffffff811115613ee057613edf613703565b5b613eec8c828d01613751565b92509250509295985092959850929598565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f3b8261398f565b810181811067ffffffffffffffff82111715613f5a57613f59613f03565b5b80604052505050565b6000613f6d6136f4565b9050613f798282613f32565b919050565b600067ffffffffffffffff821115613f9957613f98613f03565b5b613fa28261398f565b9050602081019050919050565b82818337600083830152505050565b6000613fd1613fcc84613f7e565b613f63565b905082815260208101848484011115613fed57613fec613efe565b5b613ff8848285613faf565b509392505050565b600082601f83011261401557614014613742565b5b8135614025848260208601613fbe565b91505092915050565b600080600060608486031215614047576140466136fe565b5b60006140558682870161372d565b935050602084013567ffffffffffffffff81111561407657614075613703565b5b61408286828701614000565b9250506040614093868287016137d2565b9150509250925092565b6000819050919050565b6140b08161409d565b82525050565b60006020820190506140cb60008301846140a7565b92915050565b6000602082840312156140e7576140e66136fe565b5b60006140f584828501613aa7565b91505092915050565b60008060008060808587031215614118576141176136fe565b5b60006141268782880161372d565b945050602085013567ffffffffffffffff81111561414757614146613703565b5b61415387828801614000565b935050604061416487828801613c23565b925050606085013567ffffffffffffffff81111561418557614184613703565b5b61419187828801614000565b91505092959194509250565b6000602082840312156141b3576141b26136fe565b5b60006141c184828501613a71565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006141f1826141ca565b6141fb81856141d5565b935061420b818560208601613965565b6142148161398f565b840191505092915050565b6000602082019050818103600083015261423981846141e6565b905092915050565b60008060408385031215614258576142576136fe565b5b60006142668582860161372d565b92505060206142778582860161372d565b9150509250929050565b61428a81613a48565b82525050565b60006020820190506142a56000830184614281565b92915050565b6000819050919050565b60006142d06142cb6142c684613a28565b6142ab565b613a28565b9050919050565b60006142e2826142b5565b9050919050565b60006142f4826142d7565b9050919050565b614304816142e9565b82525050565b600060208201905061431f60008301846142fb565b92915050565b600080600080600060808688031215614341576143406136fe565b5b600061434f8882890161372d565b95505060206143608882890161372d565b945050604061437188828901613aa7565b935050606086013567ffffffffffffffff81111561439257614391613703565b5b61439e88828901613751565b92509250509295509295909350565b600080604083850312156143c4576143c36136fe565b5b60006143d285828601613a71565b92505060206143e385828601613a71565b9150509250929050565b600080600060608486031215614406576144056136fe565b5b60006144148682870161372d565b93505060206144258682870161372d565b925050604061443686828701613aa7565b9150509250925092565b600060208284031215614456576144556136fe565b5b600061446484828501613c23565b91505092915050565b60008060008060808587031215614487576144866136fe565b5b60006144958782880161372d565b94505060206144a68782880161372d565b93505060406144b787828801613a71565b92505060606144c887828801613aa7565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b600061450a601e83613954565b9150614515826144d4565b602082019050919050565b60006020820190508181036000830152614539816144fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061458757607f821691505b60208210810361459a57614599614540565b5b50919050565b600081905092915050565b60006145b783856145a0565b93506145c4838584613faf565b82840190509392505050565b60006145dd8284866145ab565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614645602683613954565b9150614650826145e9565b604082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b600061468783856141d5565b9350614694838584613faf565b61469d8361398f565b840190509392505050565b60006060820190506146bd6000830187613db4565b81810360208301526146d081858761467b565b90506146df6040830184613b8f565b95945050505050565b600060a0820190506146fd6000830189613db4565b61470a6020830188614281565b818103604083015261471c81876141e6565b905061472b606083018661391f565b818103608083015261473e81848661467b565b9050979650505050505050565b60008151905061475a81613a90565b92915050565b60008060408385031215614777576147766136fe565b5b60006147858582860161474b565b92505060206147968582860161474b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147da82613a86565b91506147e583613a86565b92508282019050808211156147fd576147fc6147a0565b5b92915050565b50565b60006148136000836145a0565b915061481e82614803565b600082019050919050565b600061483482614806565b9150819050919050565b60006040820190506148536000830186613db4565b818103602083015261486681848661467b565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b60006148cc602683613954565b91506148d782614870565b604082019050919050565b600060208201905081810360008301526148fb816148bf565b9050919050565b600060a0820190506149176000830188613db4565b6149246020830187614281565b818103604083015261493681866141e6565b9050614945606083018561391f565b818103608083015261495781846141e6565b90509695505050505050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000614999601d83613954565b91506149a482614963565b602082019050919050565b600060208201905081810360008301526149c88161498c565b9050919050565b60006149da82613a86565b91506149e583613a86565b92508282039050818111156149fd576149fc6147a0565b5b92915050565b6000606082019050614a186000830186614281565b614a256020830185613b8f565b614a326040830184613b8f565b949350505050565b60008160601b9050919050565b6000614a5282614a3a565b9050919050565b6000614a6482614a47565b9050919050565b614a7c614a7782613a48565b614a59565b82525050565b6000614a8f8285876145ab565b9150614a9b8284614a6b565b601482019150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b0e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ad1565b614b188683614ad1565b95508019841693508086168417925050509392505050565b6000614b4b614b46614b4184613a86565b6142ab565b613a86565b9050919050565b6000819050919050565b614b6583614b30565b614b79614b7182614b52565b848454614ade565b825550505050565b600090565b614b8e614b81565b614b99818484614b5c565b505050565b5b81811015614bbd57614bb2600082614b86565b600181019050614b9f565b5050565b601f821115614c0257614bd381614aac565b614bdc84614ac1565b81016020851015614beb578190505b614bff614bf785614ac1565b830182614b9e565b50505b505050565b600082821c905092915050565b6000614c2560001984600802614c07565b1980831691505092915050565b6000614c3e8383614c14565b9150826002028217905092915050565b614c57826141ca565b67ffffffffffffffff811115614c7057614c6f613f03565b5b614c7a825461456f565b614c85828285614bc1565b600060209050601f831160018114614cb85760008415614ca6578287015190505b614cb08582614c32565b865550614d18565b601f198416614cc686614aac565b60005b82811015614cee57848901518255600182019150602085019450602081019050614cc9565b86831015614d0b5784890151614d07601f891682614c14565b8355505b6001600288020188555050505b505050505050565b6000608082019050614d356000830188613db4565b614d426020830187613db4565b614d4f6040830186613b8f565b8181036060830152614d6281848661467b565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b6000614dca602383613954565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e5c602183613954565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b614e9b816137a7565b82525050565b6000608082019050614eb66000830188613db4565b8181036020830152614ec981868861467b565b9050614ed86040830185614e92565b614ee560608301846140a7565b9695505050505050565b7f4c7a4170703a20696e76616c6964206d696e4761730000000000000000000000600082015250565b6000614f25601583613954565b9150614f3082614eef565b602082019050919050565b60006020820190508181036000830152614f5481614f18565b9050919050565b6000606082019050614f706000830186613db4565b614f7d6020830185613db4565b614f8a6040830184613b8f565b949350505050565b600082905092915050565b614fa78383614f92565b67ffffffffffffffff811115614fc057614fbf613f03565b5b614fca825461456f565b614fd5828285614bc1565b6000601f8311600181146150045760008415614ff2578287013590505b614ffc8582614c32565b865550615064565b601f19841661501286614aac565b60005b8281101561503a57848901358255600182019150602085019450602081019050615015565b868310156150575784890135615053601f891682614c14565b8355505b6001600288020188555050505b50505050505050565b60006080820190506150826000830187613db4565b61508f6020830186613db4565b61509c6040830185614281565b6150a96060830184613b8f565b95945050505050565b60006150c56150c084613f7e565b613f63565b9050828152602081018484840111156150e1576150e0613efe565b5b6150ec848285613965565b509392505050565b600082601f83011261510957615108613742565b5b81516151198482602086016150b2565b91505092915050565b600060208284031215615138576151376136fe565b5b600082015167ffffffffffffffff81111561515657615155613703565b5b615162848285016150f4565b91505092915050565b60006080820190506151806000830187613db4565b818103602083015261519281866141e6565b90506151a16040830185614e92565b81810360608301526151b381846141e6565b905095945050505050565b60006151c982613a86565b91506151d483613a86565b92508282026151e281613a86565b915082820484148315176151f9576151f86147a0565b5b5092915050565b7f496e73756666696369656e742065746865720000000000000000000000000000600082015250565b6000615236601283613954565b915061524182615200565b602082019050919050565b6000602082019050818103600083015261526581615229565b9050919050565b60006040820190506152816000830185613b8f565b61528e6020830184614281565b9392505050565b60008160011c9050919050565b6000808291508390505b60018511156152ec578086048111156152c8576152c76147a0565b5b60018516156152d75780820291505b80810290506152e585615295565b94506152ac565b94509492505050565b60008261530557600190506153c1565b8161531357600090506153c1565b8160018114615329576002811461533357615362565b60019150506153c1565b60ff841115615345576153446147a0565b5b8360020a91508482111561535c5761535b6147a0565b5b506153c1565b5060208310610133831016604e8410600b84101617156153975782820a905083811115615392576153916147a0565b5b6153c1565b6153a484848460016152a2565b925090508184048111156153bb576153ba6147a0565b5b81810290505b9392505050565b60006153d382613a86565b91506153de83613d1d565b925061540b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846152f5565b905092915050565b60006060820190506154286000830186613db4565b818103602083015261543a81856141e6565b90506154496040830184613b8f565b949350505050565b7f4e6f7420656e6f7567682067617320746f2073656e6400000000000000000000600082015250565b6000615487601683613954565b915061549282615451565b602082019050919050565b600060208201905081810360008301526154b68161547a565b9050919050565b600060408201905081810360008301526154d781856141e6565b90506154e66020830184613b8f565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000600082015250565b6000615523601c83613954565b915061552e826154ed565b602082019050919050565b6000602082019050818103600083015261555281615516565b9050919050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b600061558f600e83613954565b915061559a82615559565b602082019050919050565b600060208201905081810360008301526155be81615582565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b60006155fb601183613954565b9150615606826155c5565b602082019050919050565b6000602082019050818103600083015261562a816155ee565b9050919050565b600061563c826141ca565b61564681856145a0565b9350615656818560208601613965565b80840191505092915050565b600061566e8284615631565b915081905092915050565b600060a08201905061568e6000830188613db4565b81810360208301526156a081876141e6565b90506156af6040830186614e92565b81810360608301526156c181856141e6565b905081810360808301526156d581846141e6565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060008201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b600061573d602683613954565b9150615748826156e1565b604082019050919050565b6000602082019050818103600083015261576c81615730565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b60006157cf603083613954565b91506157da82615773565b604082019050919050565b600060208201905081810360008301526157fe816157c2565b9050919050565b61580e81613dde565b82525050565b600060c0820190506158296000830189613db4565b818103602083015261583b81886141e6565b9050818103604083015261584f81876141e6565b905061585e6060830186615805565b61586b6080830185614281565b81810360a083015261587d81846141e6565b9050979650505050505050565b60008151905061589981613716565b92915050565b6000806000606084860312156158b8576158b76136fe565b5b60006158c68682870161588a565b935050602084015167ffffffffffffffff8111156158e7576158e6613703565b5b6158f3868287016150f4565b92505060406159048682870161474b565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000600082015250565b6000615944601a83613954565b915061594f8261590e565b602082019050919050565b6000602082019050818103600083015261597381615937565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000600082015250565b60006159b0601b83613954565b91506159bb8261597a565b602082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000615a1c602083613954565b9150615a27826159e6565b602082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f746f416464726573735f6f75744f66426f756e64730000000000000000000000600082015250565b6000615a88601583613954565b9150615a9382615a52565b602082019050919050565b60006020820190508181036000830152615ab781615a7b565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000600082015250565b6000615af4601c83613954565b9150615aff82615abe565b602082019050919050565b60006020820190508181036000830152615b2381615ae7565b905091905056fea264697066735822122098e6f1e610ac931f7cb4937864df670a8147fa158b18ca51367241bd85371b5564736f6c634300081300330000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Deployed Bytecode
0x6080604052600436106102fe5760003560e01c8063715018a611610190578063c4461834116100dc578063df2a5b3b11610095578063ed629c5c1161006f578063ed629c5c14610baa578063f2fde38b14610bd5578063f5ecbdbc14610bfe578063fc0c546a14610c3b576102fe565b8063df2a5b3b14610b2f578063eab45d9c14610b58578063eb8d72b714610b81576102fe565b8063c446183414610a2c578063c9fbdc3614610a57578063cbed8b9c14610a82578063d1deba1f14610aab578063dd62ed3e14610ac7578063ddca3f4314610b04576102fe565b806395d89b4111610149578063a6c3d16511610123578063a6c3d16514610972578063a9059cbb1461099b578063b353aaa7146109d8578063baf3292d14610a03576102fe565b806395d89b41146108cd5780639f38369a146108f8578063a457c2d714610935576102fe565b8063715018a6146107bb5780637533d788146107d25780638cfd8f5c1461080f5780638da5cb5b1461084c5780639358928b14610877578063950c8a74146108a2576102fe565b80633ccfd60b1161024f5780634c42899a1161020857806366ad5c8a116101e257806366ad5c8a146106ee57806369fe0e2d146107175780636d4135381461074057806370a082311461077e576102fe565b80634c42899a1461066a57806351905636146106955780635b8c41e6146106b1576102fe565b80633ccfd60b146105765780633d8b38f6146105805780633f1f4fa4146105bd57806340c10f19146105fa57806342d65a8d14610616578063447705151461063f576102fe565b80630df37483116102bc57806323b872dd1161029657806323b872dd146104935780632a205e3d146104d0578063313ce5671461050e5780633950935114610539576102fe565b80630df374831461041657806310ddb1371461043f57806318160ddd14610468576102fe565b80621d35671461030357806301ffc9a71461032c57806306fdde031461036957806307e0db1714610394578063095ea7b3146103bd5780630d4d1513146103fa575b600080fd5b34801561030f57600080fd5b5061032a600480360381019061032591906137e7565b610c66565b005b34801561033857600080fd5b50610353600480360381019061034e91906138e6565b610ebc565b604051610360919061392e565b60405180910390f35b34801561037557600080fd5b5061037e610f7e565b60405161038b91906139d9565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b691906139fb565b611010565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613abc565b6110a6565b6040516103f1919061392e565b60405180910390f35b610414600480360381019061040f9190613afc565b6110c9565b005b34801561042257600080fd5b5061043d60048036038101906104389190613b4f565b6110d9565b005b34801561044b57600080fd5b50610466600480360381019061046191906139fb565b611105565b005b34801561047457600080fd5b5061047d61119b565b60405161048a9190613b9e565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613bb9565b6111a5565b6040516104c7919061392e565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613c38565b6111d4565b604051610505929190613cf4565b60405180910390f35b34801561051a57600080fd5b506105236112b5565b6040516105309190613d39565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b9190613abc565b6112be565b60405161056d919061392e565b60405180910390f35b61057e6112f5565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613d54565b611376565b6040516105b4919061392e565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906139fb565b61144a565b6040516105f19190613b9e565b60405180910390f35b610614600480360381019061060f9190613abc565b611462565b005b34801561062257600080fd5b5061063d60048036038101906106389190613d54565b611472565b005b34801561064b57600080fd5b5061065461150e565b6040516106619190613b9e565b60405180910390f35b34801561067657600080fd5b5061067f611513565b60405161068c9190613dc3565b60405180910390f35b6106af60048036038101906106aa9190613e1c565b611518565b005b3480156106bd57600080fd5b506106d860048036038101906106d3919061402e565b6115ba565b6040516106e591906140b6565b60405180910390f35b3480156106fa57600080fd5b50610715600480360381019061071091906137e7565b611602565b005b34801561072357600080fd5b5061073e600480360381019061073991906140d1565b611713565b005b34801561074c57600080fd5b50610767600480360381019061076291906140fe565b611725565b604051610775929190613cf4565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a0919061419d565b6117d6565b6040516107b29190613b9e565b60405180910390f35b3480156107c757600080fd5b506107d061181f565b005b3480156107de57600080fd5b506107f960048036038101906107f491906139fb565b611833565b604051610806919061421f565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614241565b6118d3565b6040516108439190613b9e565b60405180910390f35b34801561085857600080fd5b506108616118f8565b60405161086e9190614290565b60405180910390f35b34801561088357600080fd5b5061088c611921565b6040516108999190613b9e565b60405180910390f35b3480156108ae57600080fd5b506108b7611930565b6040516108c49190614290565b60405180910390f35b3480156108d957600080fd5b506108e2611956565b6040516108ef91906139d9565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a91906139fb565b6119e8565b60405161092c919061421f565b60405180910390f35b34801561094157600080fd5b5061095c60048036038101906109579190613abc565b611b01565b604051610969919061392e565b60405180910390f35b34801561097e57600080fd5b5061099960048036038101906109949190613d54565b611b7e565b005b3480156109a757600080fd5b506109c260048036038101906109bd9190613abc565b611c12565b6040516109cf919061392e565b60405180910390f35b3480156109e457600080fd5b506109ed611c35565b6040516109fa919061430a565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a25919061419d565b611c59565b005b348015610a3857600080fd5b50610a41611cdc565b604051610a4e9190613b9e565b60405180910390f35b348015610a6357600080fd5b50610a6c611ce2565b604051610a799190613b9e565b60405180910390f35b348015610a8e57600080fd5b50610aa96004803603810190610aa49190614325565b611ce8565b005b610ac56004803603810190610ac091906137e7565b611d8a565b005b348015610ad357600080fd5b50610aee6004803603810190610ae991906143ad565b611fcd565b604051610afb9190613b9e565b60405180910390f35b348015610b1057600080fd5b50610b19612054565b604051610b269190613b9e565b60405180910390f35b348015610b3b57600080fd5b50610b566004803603810190610b5191906143ed565b61205a565b005b348015610b6457600080fd5b50610b7f6004803603810190610b7a9190614440565b61211e565b005b348015610b8d57600080fd5b50610ba86004803603810190610ba39190613d54565b61217a565b005b348015610bb657600080fd5b50610bbf6121ed565b604051610bcc919061392e565b60405180910390f35b348015610be157600080fd5b50610bfc6004803603810190610bf7919061419d565b612200565b005b348015610c0a57600080fd5b50610c256004803603810190610c20919061446d565b612286565b604051610c32919061421f565b60405180910390f35b348015610c4757600080fd5b50610c50612337565b604051610c5d9190614290565b60405180910390f35b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff16610ca561233f565b73ffffffffffffffffffffffffffffffffffffffff1614610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf290614520565b60405180910390fd5b6000600160008861ffff1661ffff1681526020019081526020016000208054610d239061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4f9061456f565b8015610d9c5780601f10610d7157610100808354040283529160200191610d9c565b820191906000526020600020905b815481529060010190602001808311610d7f57829003601f168201915b50505050509050805186869050148015610db7575060008151115b8015610de0575080805190602001208686604051610dd69291906145d0565b6040518091039020145b610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061465b565b60405180910390fd5b610eb38787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612347565b50505050505050565b6000807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f6757507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f775750610f7682612412565b5b9050919050565b6060600a8054610f8d9061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb99061456f565b80156110065780601f10610fdb57610100808354040283529160200191611006565b820191906000526020600020905b815481529060010190602001808311610fe957829003601f168201915b5050505050905090565b61101861248c565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b81526004016110719190613dc3565b600060405180830381600087803b15801561108b57600080fd5b505af115801561109f573d6000803e3d6000fd5b5050505050565b6000806110b161233f565b90506110be818585612513565b600191505092915050565b6110d4838383612525565b505050565b6110e161248c565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b61110d61248c565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b81526004016111669190613dc3565b600060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b5050505050565b6000600954905090565b6000806111b061233f565b90506111bd858285612627565b6111c88585856126bb565b60019150509392505050565b6000806000808989896040516020016111f094939291906146a8565b60405160208183030381529060405290507f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401611264969594939291906146e8565b6040805180830381865afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190614760565b925092505097509795505050505050565b60006012905090565b6000806112c961233f565b90506112ea8185856112db8589611fcd565b6112e591906147cf565b612513565b600191505092915050565b6112fd61248c565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161132390614829565b60006040518083038185875af1925050503d8060008114611360576040519150601f19603f3d011682016040523d82523d6000602084013e611365565b606091505b505090508061137357600080fd5b50565b600080600160008661ffff1661ffff168152602001908152602001600020805461139f9061456f565b80601f01602080910402602001604051908101604052809291908181526020018280546113cb9061456f565b80156114185780601f106113ed57610100808354040283529160200191611418565b820191906000526020600020905b8154815290600101906020018083116113fb57829003601f168201915b50505050509050838360405161142f9291906145d0565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b61146e82826000612525565b5050565b61147a61248c565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016114d79392919061483e565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50505050505050565b600081565b600081565b6115af898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127af565b505050505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff1661162161233f565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906148e2565b60405180910390fd5b61170b8686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128b9565b505050505050565b61171b61248c565b80600c8190555050565b6000807f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff166340a7bb1087308888886040518663ffffffff1660e01b8152600401611789959493929190614902565b6040805180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190614760565b9150915094509492505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61182761248c565b6118316000612925565b565b600160205280600052604060002060009150905080546118529061456f565b80601f016020809104026020016040519081016040528092919081815260200182805461187e9061456f565b80156118cb5780601f106118a0576101008083540402835291602001916118cb565b820191906000526020600020905b8154815290600101906020018083116118ae57829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061192b61119b565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b80546119659061456f565b80601f01602080910402602001604051908101604052809291908181526020018280546119919061456f565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b5050505050905090565b60606000600160008461ffff1661ffff1681526020019081526020016000208054611a129061456f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3e9061456f565b8015611a8b5780601f10611a6057610100808354040283529160200191611a8b565b820191906000526020600020905b815481529060010190602001808311611a6e57829003601f168201915b505050505090506000815103611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906149af565b60405180910390fd5b611af9600060148351611ae991906149cf565b836129e99092919063ffffffff16565b915050919050565b600080611b0c61233f565b90506000611b1a8286611fcd565b905083811015611b65578481856040517fa60f030c000000000000000000000000000000000000000000000000000000008152600401611b5c93929190614a03565b60405180910390fd5b611b728286868403612513565b60019250505092915050565b611b8661248c565b818130604051602001611b9b93929190614a82565b604051602081830303815290604052600160008561ffff1661ffff1681526020019081526020016000209081611bd19190614c4e565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611c059392919061483e565b60405180910390a1505050565b600080611c1d61233f565b9050611c2a8185856126bb565b600191505092915050565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b611c6161248c565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b81604051611cd19190614290565b60405180910390a150565b61271081565b600d5481565b611cf061248c565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611d51959493929190614d20565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff1681526020019081526020016000208686604051611db79291906145d0565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b8103611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990614de0565b60405180910390fd5b808383604051611e439291906145d0565b604051809103902014611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290614e72565b60405180910390fd5b6000801b600560008961ffff1661ffff1681526020019081526020016000208787604051611eba9291906145d0565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002081905550611f858787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128b9565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611fbc959493929190614ea1565b60405180910390a150505050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b61206261248c565b600081116120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90614f3b565b60405180910390fd5b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac083838360405161211193929190614f5b565b60405180910390a1505050565b61212661248c565b80600660006101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a48160405161216f919061392e565b60405180910390a150565b61218261248c565b8181600160008661ffff1661ffff16815260200190815260200160002091826121ac929190614f9d565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516121e09392919061483e565b60405180910390a1505050565b600660009054906101000a900460ff1681565b61220861248c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361227a5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122719190614290565b60405180910390fd5b61228381612925565b50565b60607f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b81526004016122e7949392919061506d565b600060405180830381865afa158015612304573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061232d9190615122565b9050949350505050565b600030905090565b600033905090565b6000806123f35a60966366ad5c8a60e01b8989898960405160240161236f949392919061516b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16612b07909392919063ffffffff16565b915091508161240a576124098686868685612b9f565b5b505050505050565b60007f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612485575061248482612c4d565b5b9050919050565b61249461233f565b73ffffffffffffffffffffffffffffffffffffffff166124b26118f8565b73ffffffffffffffffffffffffffffffffffffffff1614612511576124d561233f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125089190614290565b60405180910390fd5b565b6125208383836001612cb7565b505050565b34600c548361253491906151be565b1115612575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256c9061524c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125fa578273ffffffffffffffffffffffffffffffffffffffff167f0dbf48b2d95441997ef389702675fe528a55fde0899829fa0f9af2325781bc5183836040516125f192919061526c565b60405180910390a25b612622836126066112b5565b600a61261291906153c8565b8461261d91906151be565b612e8e565b505050565b60006126338484611fcd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146126b557818110156126a5578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161269c93929190614a03565b60405180910390fd5b6126b484848484036000612cb7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361272d5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016127249190614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016127969190614290565b60405180910390fd5b6127aa838383612f10565b505050565b6127bd866000836000613138565b60006127cb888888886131a9565b905060008087836040516020016127e493929190615413565b604051602081830303815290604052905060006128048983600087611725565b5090508034101561284a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128419061549d565b60405180910390fd5b61285889838888888661320b565b8973ffffffffffffffffffffffffffffffffffffffff168961ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08a866040516128a59291906154bd565b60405180910390a350505050505050505050565b600060208201519050600061ffff168161ffff16036128e3576128de858585856133a1565b61291e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291590615539565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836129f991906147cf565b1015612a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a31906155a5565b60405180910390fd5b8183612a4691906147cf565b84511015612a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8090615611565b60405180910390fd5b6060821560008114612aaa5760405191506000825260208201604052612afb565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ae85780518352602083019250602081019050612acb565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff811115612b2e57612b2d613f03565b5b6040519080825280601f01601f191660200182016040528015612b605781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d925086831115612b82578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612bd09190615662565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612c3e959493929190615679565b60405180910390a15050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d295760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612d209190614290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d9b5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612d929190614290565b60405180910390fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015612e88578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612e7f9190613b9e565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f005760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612ef79190614290565b60405180910390fd5b612f0c60008383612f10565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f62578060096000828254612f5691906147cf565b92505081905550613037565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612fef578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612fe693929190614a03565b60405180910390fd5b818103600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361308057806009600082825403925050819055506130ce565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161312b9190613b9e565b60405180910390a3505050565b600660009054906101000a900460ff161561315e576131598484848461343e565b6131a3565b60008251146131a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319990615753565b60405180910390fd5b5b50505050565b6000806131b461233f565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146131f5576131f4868285612627565b5b6131ff868461351d565b82915050949350505050565b6000600160008861ffff1661ffff16815260200190815260200160002080546132339061456f565b80601f016020809104026020016040519081016040528092919081815260200182805461325f9061456f565b80156132ac5780601f10613281576101008083540402835291602001916132ac565b820191906000526020600020905b81548152906001019060200180831161328f57829003601f168201915b5050505050905060008151036132f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ee906157e5565b60405180910390fd5b61330287875161359f565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6273ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b815260040161336696959493929190615814565b6000604051808303818588803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050505050505050505050565b600080828060200190518101906133b8919061589f565b925092505060006133d360008461361590919063ffffffff16565b90506133e087828461368b565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8460405161342d9190613b9e565b60405180910390a350505050505050565b6000613449836136a1565b9050600082600260008861ffff1661ffff16815260200190815260200160002060008761ffff1661ffff1681526020019081526020016000205461348d91906147cf565b9050600081116134d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c99061595a565b60405180910390fd5b80821015613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c906159c6565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361358f5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016135869190614290565b60405180910390fd5b61359b82600083612f10565b5050565b6000600360008461ffff1661ffff168152602001908152602001600020549050600081036135cd5761271090505b80821115613610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360790615a32565b60405180910390fd5b505050565b600060148261362491906147cf565b83511015613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e90615a9e565b60405180910390fd5b60006c01000000000000000000000000836020860101510490508091505092915050565b60006136978383612e8e565b8190509392505050565b60006022825110156136e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136df90615b0a565b60405180910390fd5b60228201519050919050565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b61371f81613708565b811461372a57600080fd5b50565b60008135905061373c81613716565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261376757613766613742565b5b8235905067ffffffffffffffff81111561378457613783613747565b5b6020830191508360018202830111156137a05761379f61374c565b5b9250929050565b600067ffffffffffffffff82169050919050565b6137c4816137a7565b81146137cf57600080fd5b50565b6000813590506137e1816137bb565b92915050565b60008060008060008060808789031215613804576138036136fe565b5b600061381289828a0161372d565b965050602087013567ffffffffffffffff81111561383357613832613703565b5b61383f89828a01613751565b9550955050604061385289828a016137d2565b935050606087013567ffffffffffffffff81111561387357613872613703565b5b61387f89828a01613751565b92509250509295509295509295565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138c38161388e565b81146138ce57600080fd5b50565b6000813590506138e0816138ba565b92915050565b6000602082840312156138fc576138fb6136fe565b5b600061390a848285016138d1565b91505092915050565b60008115159050919050565b61392881613913565b82525050565b6000602082019050613943600083018461391f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613983578082015181840152602081019050613968565b60008484015250505050565b6000601f19601f8301169050919050565b60006139ab82613949565b6139b58185613954565b93506139c5818560208601613965565b6139ce8161398f565b840191505092915050565b600060208201905081810360008301526139f381846139a0565b905092915050565b600060208284031215613a1157613a106136fe565b5b6000613a1f8482850161372d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5382613a28565b9050919050565b613a6381613a48565b8114613a6e57600080fd5b50565b600081359050613a8081613a5a565b92915050565b6000819050919050565b613a9981613a86565b8114613aa457600080fd5b50565b600081359050613ab681613a90565b92915050565b60008060408385031215613ad357613ad26136fe565b5b6000613ae185828601613a71565b9250506020613af285828601613aa7565b9150509250929050565b600080600060608486031215613b1557613b146136fe565b5b6000613b2386828701613a71565b9350506020613b3486828701613aa7565b9250506040613b4586828701613a71565b9150509250925092565b60008060408385031215613b6657613b656136fe565b5b6000613b748582860161372d565b9250506020613b8585828601613aa7565b9150509250929050565b613b9881613a86565b82525050565b6000602082019050613bb36000830184613b8f565b92915050565b600080600060608486031215613bd257613bd16136fe565b5b6000613be086828701613a71565b9350506020613bf186828701613a71565b9250506040613c0286828701613aa7565b9150509250925092565b613c1581613913565b8114613c2057600080fd5b50565b600081359050613c3281613c0c565b92915050565b600080600080600080600060a0888a031215613c5757613c566136fe565b5b6000613c658a828b0161372d565b975050602088013567ffffffffffffffff811115613c8657613c85613703565b5b613c928a828b01613751565b96509650506040613ca58a828b01613aa7565b9450506060613cb68a828b01613c23565b935050608088013567ffffffffffffffff811115613cd757613cd6613703565b5b613ce38a828b01613751565b925092505092959891949750929550565b6000604082019050613d096000830185613b8f565b613d166020830184613b8f565b9392505050565b600060ff82169050919050565b613d3381613d1d565b82525050565b6000602082019050613d4e6000830184613d2a565b92915050565b600080600060408486031215613d6d57613d6c6136fe565b5b6000613d7b8682870161372d565b935050602084013567ffffffffffffffff811115613d9c57613d9b613703565b5b613da886828701613751565b92509250509250925092565b613dbd81613708565b82525050565b6000602082019050613dd86000830184613db4565b92915050565b6000613de982613a28565b9050919050565b613df981613dde565b8114613e0457600080fd5b50565b600081359050613e1681613df0565b92915050565b600080600080600080600080600060e08a8c031215613e3e57613e3d6136fe565b5b6000613e4c8c828d01613a71565b9950506020613e5d8c828d0161372d565b98505060408a013567ffffffffffffffff811115613e7e57613e7d613703565b5b613e8a8c828d01613751565b97509750506060613e9d8c828d01613aa7565b9550506080613eae8c828d01613e07565b94505060a0613ebf8c828d01613a71565b93505060c08a013567ffffffffffffffff811115613ee057613edf613703565b5b613eec8c828d01613751565b92509250509295985092959850929598565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f3b8261398f565b810181811067ffffffffffffffff82111715613f5a57613f59613f03565b5b80604052505050565b6000613f6d6136f4565b9050613f798282613f32565b919050565b600067ffffffffffffffff821115613f9957613f98613f03565b5b613fa28261398f565b9050602081019050919050565b82818337600083830152505050565b6000613fd1613fcc84613f7e565b613f63565b905082815260208101848484011115613fed57613fec613efe565b5b613ff8848285613faf565b509392505050565b600082601f83011261401557614014613742565b5b8135614025848260208601613fbe565b91505092915050565b600080600060608486031215614047576140466136fe565b5b60006140558682870161372d565b935050602084013567ffffffffffffffff81111561407657614075613703565b5b61408286828701614000565b9250506040614093868287016137d2565b9150509250925092565b6000819050919050565b6140b08161409d565b82525050565b60006020820190506140cb60008301846140a7565b92915050565b6000602082840312156140e7576140e66136fe565b5b60006140f584828501613aa7565b91505092915050565b60008060008060808587031215614118576141176136fe565b5b60006141268782880161372d565b945050602085013567ffffffffffffffff81111561414757614146613703565b5b61415387828801614000565b935050604061416487828801613c23565b925050606085013567ffffffffffffffff81111561418557614184613703565b5b61419187828801614000565b91505092959194509250565b6000602082840312156141b3576141b26136fe565b5b60006141c184828501613a71565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006141f1826141ca565b6141fb81856141d5565b935061420b818560208601613965565b6142148161398f565b840191505092915050565b6000602082019050818103600083015261423981846141e6565b905092915050565b60008060408385031215614258576142576136fe565b5b60006142668582860161372d565b92505060206142778582860161372d565b9150509250929050565b61428a81613a48565b82525050565b60006020820190506142a56000830184614281565b92915050565b6000819050919050565b60006142d06142cb6142c684613a28565b6142ab565b613a28565b9050919050565b60006142e2826142b5565b9050919050565b60006142f4826142d7565b9050919050565b614304816142e9565b82525050565b600060208201905061431f60008301846142fb565b92915050565b600080600080600060808688031215614341576143406136fe565b5b600061434f8882890161372d565b95505060206143608882890161372d565b945050604061437188828901613aa7565b935050606086013567ffffffffffffffff81111561439257614391613703565b5b61439e88828901613751565b92509250509295509295909350565b600080604083850312156143c4576143c36136fe565b5b60006143d285828601613a71565b92505060206143e385828601613a71565b9150509250929050565b600080600060608486031215614406576144056136fe565b5b60006144148682870161372d565b93505060206144258682870161372d565b925050604061443686828701613aa7565b9150509250925092565b600060208284031215614456576144556136fe565b5b600061446484828501613c23565b91505092915050565b60008060008060808587031215614487576144866136fe565b5b60006144958782880161372d565b94505060206144a68782880161372d565b93505060406144b787828801613a71565b92505060606144c887828801613aa7565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b600061450a601e83613954565b9150614515826144d4565b602082019050919050565b60006020820190508181036000830152614539816144fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061458757607f821691505b60208210810361459a57614599614540565b5b50919050565b600081905092915050565b60006145b783856145a0565b93506145c4838584613faf565b82840190509392505050565b60006145dd8284866145ab565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614645602683613954565b9150614650826145e9565b604082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b600061468783856141d5565b9350614694838584613faf565b61469d8361398f565b840190509392505050565b60006060820190506146bd6000830187613db4565b81810360208301526146d081858761467b565b90506146df6040830184613b8f565b95945050505050565b600060a0820190506146fd6000830189613db4565b61470a6020830188614281565b818103604083015261471c81876141e6565b905061472b606083018661391f565b818103608083015261473e81848661467b565b9050979650505050505050565b60008151905061475a81613a90565b92915050565b60008060408385031215614777576147766136fe565b5b60006147858582860161474b565b92505060206147968582860161474b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147da82613a86565b91506147e583613a86565b92508282019050808211156147fd576147fc6147a0565b5b92915050565b50565b60006148136000836145a0565b915061481e82614803565b600082019050919050565b600061483482614806565b9150819050919050565b60006040820190506148536000830186613db4565b818103602083015261486681848661467b565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b60006148cc602683613954565b91506148d782614870565b604082019050919050565b600060208201905081810360008301526148fb816148bf565b9050919050565b600060a0820190506149176000830188613db4565b6149246020830187614281565b818103604083015261493681866141e6565b9050614945606083018561391f565b818103608083015261495781846141e6565b90509695505050505050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000614999601d83613954565b91506149a482614963565b602082019050919050565b600060208201905081810360008301526149c88161498c565b9050919050565b60006149da82613a86565b91506149e583613a86565b92508282039050818111156149fd576149fc6147a0565b5b92915050565b6000606082019050614a186000830186614281565b614a256020830185613b8f565b614a326040830184613b8f565b949350505050565b60008160601b9050919050565b6000614a5282614a3a565b9050919050565b6000614a6482614a47565b9050919050565b614a7c614a7782613a48565b614a59565b82525050565b6000614a8f8285876145ab565b9150614a9b8284614a6b565b601482019150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b0e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ad1565b614b188683614ad1565b95508019841693508086168417925050509392505050565b6000614b4b614b46614b4184613a86565b6142ab565b613a86565b9050919050565b6000819050919050565b614b6583614b30565b614b79614b7182614b52565b848454614ade565b825550505050565b600090565b614b8e614b81565b614b99818484614b5c565b505050565b5b81811015614bbd57614bb2600082614b86565b600181019050614b9f565b5050565b601f821115614c0257614bd381614aac565b614bdc84614ac1565b81016020851015614beb578190505b614bff614bf785614ac1565b830182614b9e565b50505b505050565b600082821c905092915050565b6000614c2560001984600802614c07565b1980831691505092915050565b6000614c3e8383614c14565b9150826002028217905092915050565b614c57826141ca565b67ffffffffffffffff811115614c7057614c6f613f03565b5b614c7a825461456f565b614c85828285614bc1565b600060209050601f831160018114614cb85760008415614ca6578287015190505b614cb08582614c32565b865550614d18565b601f198416614cc686614aac565b60005b82811015614cee57848901518255600182019150602085019450602081019050614cc9565b86831015614d0b5784890151614d07601f891682614c14565b8355505b6001600288020188555050505b505050505050565b6000608082019050614d356000830188613db4565b614d426020830187613db4565b614d4f6040830186613b8f565b8181036060830152614d6281848661467b565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b6000614dca602383613954565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e5c602183613954565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b614e9b816137a7565b82525050565b6000608082019050614eb66000830188613db4565b8181036020830152614ec981868861467b565b9050614ed86040830185614e92565b614ee560608301846140a7565b9695505050505050565b7f4c7a4170703a20696e76616c6964206d696e4761730000000000000000000000600082015250565b6000614f25601583613954565b9150614f3082614eef565b602082019050919050565b60006020820190508181036000830152614f5481614f18565b9050919050565b6000606082019050614f706000830186613db4565b614f7d6020830185613db4565b614f8a6040830184613b8f565b949350505050565b600082905092915050565b614fa78383614f92565b67ffffffffffffffff811115614fc057614fbf613f03565b5b614fca825461456f565b614fd5828285614bc1565b6000601f8311600181146150045760008415614ff2578287013590505b614ffc8582614c32565b865550615064565b601f19841661501286614aac565b60005b8281101561503a57848901358255600182019150602085019450602081019050615015565b868310156150575784890135615053601f891682614c14565b8355505b6001600288020188555050505b50505050505050565b60006080820190506150826000830187613db4565b61508f6020830186613db4565b61509c6040830185614281565b6150a96060830184613b8f565b95945050505050565b60006150c56150c084613f7e565b613f63565b9050828152602081018484840111156150e1576150e0613efe565b5b6150ec848285613965565b509392505050565b600082601f83011261510957615108613742565b5b81516151198482602086016150b2565b91505092915050565b600060208284031215615138576151376136fe565b5b600082015167ffffffffffffffff81111561515657615155613703565b5b615162848285016150f4565b91505092915050565b60006080820190506151806000830187613db4565b818103602083015261519281866141e6565b90506151a16040830185614e92565b81810360608301526151b381846141e6565b905095945050505050565b60006151c982613a86565b91506151d483613a86565b92508282026151e281613a86565b915082820484148315176151f9576151f86147a0565b5b5092915050565b7f496e73756666696369656e742065746865720000000000000000000000000000600082015250565b6000615236601283613954565b915061524182615200565b602082019050919050565b6000602082019050818103600083015261526581615229565b9050919050565b60006040820190506152816000830185613b8f565b61528e6020830184614281565b9392505050565b60008160011c9050919050565b6000808291508390505b60018511156152ec578086048111156152c8576152c76147a0565b5b60018516156152d75780820291505b80810290506152e585615295565b94506152ac565b94509492505050565b60008261530557600190506153c1565b8161531357600090506153c1565b8160018114615329576002811461533357615362565b60019150506153c1565b60ff841115615345576153446147a0565b5b8360020a91508482111561535c5761535b6147a0565b5b506153c1565b5060208310610133831016604e8410600b84101617156153975782820a905083811115615392576153916147a0565b5b6153c1565b6153a484848460016152a2565b925090508184048111156153bb576153ba6147a0565b5b81810290505b9392505050565b60006153d382613a86565b91506153de83613d1d565b925061540b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846152f5565b905092915050565b60006060820190506154286000830186613db4565b818103602083015261543a81856141e6565b90506154496040830184613b8f565b949350505050565b7f4e6f7420656e6f7567682067617320746f2073656e6400000000000000000000600082015250565b6000615487601683613954565b915061549282615451565b602082019050919050565b600060208201905081810360008301526154b68161547a565b9050919050565b600060408201905081810360008301526154d781856141e6565b90506154e66020830184613b8f565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000600082015250565b6000615523601c83613954565b915061552e826154ed565b602082019050919050565b6000602082019050818103600083015261555281615516565b9050919050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b600061558f600e83613954565b915061559a82615559565b602082019050919050565b600060208201905081810360008301526155be81615582565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b60006155fb601183613954565b9150615606826155c5565b602082019050919050565b6000602082019050818103600083015261562a816155ee565b9050919050565b600061563c826141ca565b61564681856145a0565b9350615656818560208601613965565b80840191505092915050565b600061566e8284615631565b915081905092915050565b600060a08201905061568e6000830188613db4565b81810360208301526156a081876141e6565b90506156af6040830186614e92565b81810360608301526156c181856141e6565b905081810360808301526156d581846141e6565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060008201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b600061573d602683613954565b9150615748826156e1565b604082019050919050565b6000602082019050818103600083015261576c81615730565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b60006157cf603083613954565b91506157da82615773565b604082019050919050565b600060208201905081810360008301526157fe816157c2565b9050919050565b61580e81613dde565b82525050565b600060c0820190506158296000830189613db4565b818103602083015261583b81886141e6565b9050818103604083015261584f81876141e6565b905061585e6060830186615805565b61586b6080830185614281565b81810360a083015261587d81846141e6565b9050979650505050505050565b60008151905061589981613716565b92915050565b6000806000606084860312156158b8576158b76136fe565b5b60006158c68682870161588a565b935050602084015167ffffffffffffffff8111156158e7576158e6613703565b5b6158f3868287016150f4565b92505060406159048682870161474b565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000600082015250565b6000615944601a83613954565b915061594f8261590e565b602082019050919050565b6000602082019050818103600083015261597381615937565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000600082015250565b60006159b0601b83613954565b91506159bb8261597a565b602082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000615a1c602083613954565b9150615a27826159e6565b602082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f746f416464726573735f6f75744f66426f756e64730000000000000000000000600082015250565b6000615a88601583613954565b9150615a9382615a52565b602082019050919050565b60006020820190508181036000830152615ab781615a7b565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000600082015250565b6000615af4601c83613954565b9150615aff82615abe565b602082019050919050565b60006020820190508181036000830152615b2381615ae7565b905091905056fea264697066735822122098e6f1e610ac931f7cb4937864df670a8147fa158b18ca51367241bd85371b5564736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0x3c2269811836af69497E5F486A85D7316753cf62
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Deployed Bytecode Sourcemap
2827:1464:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1237:762:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;375:255:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2458:91:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4535:123:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4751:190:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3815:153:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6460:142:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4666:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3560:99:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5519:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;700:427:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3411:84:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6177:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4096:192:18;;;:::i;:::-;;6700:250:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;759:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3648:123:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4803:178:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;252:37:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;318:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1423:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;628:85:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3995:75:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1135:280:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3722:118:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2254:103:19;;;;;;;;;;;;;:::i;:::-;;629:51:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;687:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1579:87:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;749:112:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;819:23:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2668:95:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5632:330:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7103:504:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5343:281:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4045:182:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;576:46:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5970:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;512:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2894:41:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4323:204:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2382:767:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4290:142:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2855:32:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6114:284:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1765:223:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5128:207:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;361:34:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2512:220:19;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4050:211:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;638:103:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1237:762:14;1477:10;1453:35;;:12;:10;:12::i;:::-;:35;;;1445:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1536:26;1565:19;:32;1585:11;1565:32;;;;;;;;;;;;;;;1536:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1771:13;:20;1749:11;;:18;;:42;:70;;;;;1818:1;1795:13;:20;:24;1749:70;:124;;;;;1859:13;1849:24;;;;;;1833:11;;1823:22;;;;;;;:::i;:::-;;;;;;;;:50;1749:124;1741:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;1929:62;1948:11;1961;;1929:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1974:6;1982:8;;1929:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:62::i;:::-;1368:631;1237:762;;;;;;:::o;375:255:16:-;478:4;517:22;502:37;;;:11;:37;;;;:80;;;;558:24;543:39;;;:11;:39;;;;502:80;:120;;;;586:36;610:11;586:23;:36::i;:::-;502:120;495:127;;375:255;;;:::o;2458:91:3:-;2503:13;2536:5;2529:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2458:91;:::o;4535:123:14:-;1465:13:19;:11;:13::i;:::-;4615:10:14::1;:25;;;4641:8;4615:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4535:123:::0;:::o;4751:190:3:-;4824:4;4841:13;4857:12;:10;:12::i;:::-;4841:28;;4880:31;4889:5;4896:7;4905:5;4880:8;:31::i;:::-;4929:4;4922:11;;;4751:190;;;;:::o;3815:153:18:-;3912:48;3930:3;3935:7;3944:15;3912:17;:48::i;:::-;3815:153;;;:::o;6460:142:14:-;1465:13:19;:11;:13::i;:::-;6589:5:14::1;6551:22;:35;6574:11;6551:35;;;;;;;;;;;;;;;:43;;;;6460:142:::0;;:::o;4666:129::-;1465:13:19;:11;:13::i;:::-;4749:10:14::1;:28;;;4778:8;4749:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4666:129:::0;:::o;3560:99:3:-;3612:7;3639:12;;3632:19;;3560:99;:::o;5519:249::-;5606:4;5623:15;5641:12;:10;:12::i;:::-;5623:30;;5664:37;5680:4;5686:7;5695:5;5664:15;:37::i;:::-;5712:26;5722:4;5728:2;5732:5;5712:9;:26::i;:::-;5756:4;5749:11;;;5519:249;;;;;:::o;700:427:17:-;869:14;885:11;953:20;351:1;996:10;;1008:7;976:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;953:63;;1034:10;:23;;;1058:11;1079:4;1086:7;1095;1104:14;;1034:85;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1027:92;;;;;700:427;;;;;;;;;;:::o;3411:84:3:-;3460:5;3485:2;3478:9;;3411:84;:::o;6177:238::-;6265:4;6282:13;6298:12;:10;:12::i;:::-;6282:28;;6321:64;6330:5;6337:7;6374:10;6346:25;6356:5;6363:7;6346:9;:25::i;:::-;:38;;;;:::i;:::-;6321:8;:64::i;:::-;6403:4;6396:11;;;6177:238;;;;:::o;4096:192:18:-;1465:13:19;:11;:13::i;:::-;4153:12:18::1;4179:10;4171:24;;4217:21;4171:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4152:101;;;4272:7;4264:16;;;::::0;::::1;;4141:147;4096:192::o:0;6700:250:14:-;6796:4;6813:26;6842:19;:32;6862:11;6842:32;;;;;;;;;;;;;;;6813:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6930:11;;6920:22;;;;;;;:::i;:::-;;;;;;;;6902:13;6892:24;;;;;;:50;6885:57;;;6700:250;;;;;:::o;759:53::-;;;;;;;;;;;;;;;;;:::o;3648:123:18:-;3720:43;3738:3;3743:7;3760:1;3720:17;:43::i;:::-;3648:123;;:::o;4803:178:14:-;1465:13:19;:11;:13::i;:::-;4918:10:14::1;:29;;;4948:11;4961;;4918:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4803:178:::0;;;:::o;252:37:17:-;288:1;252:37;:::o;318:34::-;351:1;318:34;:::o;1423:334::-;1651:98;1657:5;1664:11;1677:10;;1651:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1689:7;1698:14;1714:18;1734:14;;1651:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:98::i;:::-;1423:334;;;;;;;;;:::o;628:85:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1850:346::-;2064:4;2040:29;;:12;:10;:12::i;:::-;:29;;;2032:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;2123:65;2145:11;2158;;2123:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2171:6;2179:8;;2123:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;1850:346;;;;;;:::o;3995:75:18:-;1465:13:19;:11;:13::i;:::-;4058:4:18::1;4052:3;:10;;;;3995:75:::0;:::o;1135:280:17:-;1275:14;1291:11;1322:10;:23;;;1346:11;1367:4;1374:7;1383;1392:14;1322:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1315:92;;;;1135:280;;;;;;;:::o;3722:118:3:-;3787:7;3814:9;:18;3824:7;3814:18;;;;;;;;;;;;;;;;3807:25;;3722:118;;;:::o;2254:103:19:-;1465:13;:11;:13::i;:::-;2319:30:::1;2346:1;2319:18;:30::i;:::-;2254:103::o:0;629:51:14:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;687:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1579:87:19:-;1625:7;1652:6;;;;;;;;;;;1645:13;;1579:87;:::o;749:112:16:-;816:4;840:13;:11;:13::i;:::-;833:20;;749:112;:::o;819:23:14:-;;;;;;;;;;;;;:::o;2668:95:3:-;2715:13;2748:7;2741:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2668:95;:::o;5632:330:14:-;5711:12;5736:17;5756:19;:35;5776:14;5756:35;;;;;;;;;;;;;;;5736:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5825:1;5810:4;:11;:16;5802:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;5878:31;5889:1;5906:2;5892:4;:11;:16;;;;:::i;:::-;5878:4;:10;;:31;;;;;:::i;:::-;5871:38;;;5632:330;;;:::o;7103:504:3:-;7198:4;7215:13;7231:12;:10;:12::i;:::-;7215:28;;7254:24;7281:25;7291:5;7298:7;7281:9;:25::i;:::-;7254:52;;7340:17;7321:16;:36;7317:150;;;7410:7;7419:16;7437:17;7381:74;;;;;;;;;;;;;:::i;:::-;;;;;;;;7317:150;7502:62;7511:5;7518:7;7546:17;7527:16;:36;7502:8;:62::i;:::-;7595:4;7588:11;;;;7103:504;;;;:::o;5343:281:14:-;1465:13:19;:11;:13::i;:::-;5515:14:14::1;;5539:4;5498:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5460:19;:35;5480:14;5460:35;;;;;;;;;;;;;;;:85;;;;;;:::i;:::-;;5561:55;5585:14;5601;;5561:55;;;;;;;;:::i;:::-;;;;;;;;5343:281:::0;;;:::o;4045:182:3:-;4114:4;4131:13;4147:12;:10;:12::i;:::-;4131:28;;4170:27;4180:5;4187:2;4191:5;4170:9;:27::i;:::-;4215:4;4208:11;;;4045:182;;;;:::o;576:46:14:-;;;:::o;5970:136::-;1465:13:19;:11;:13::i;:::-;6051:9:14::1;6040:8;;:20;;;;;;;;;;;;;;;;;;6076:22;6088:9;6076:22;;;;;;:::i;:::-;;;;;;;;5970:136:::0;:::o;512:55::-;562:5;512:55;:::o;2894:41:18:-;;;;:::o;4323:204:14:-;1465:13:19;:11;:13::i;:::-;4457:10:14::1;:20;;;4478:8;4488;4498:11;4511:7;;4457:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4323:204:::0;;;;;:::o;2382:767:15:-;2571:19;2593:14;:27;2608:11;2593:27;;;;;;;;;;;;;;;2621:11;;2593:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2634:6;2593:48;;;;;;;;;;;;;;;;2571:70;;2683:1;2675:10;;2660:11;:25;2652:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2767:11;2754:8;;2744:19;;;;;;;:::i;:::-;;;;;;;;:34;2736:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:1;2915:10;;2864:14;:27;2879:11;2864:27;;;;;;;;;;;;;;;2892:11;;2864:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2905:6;2864:48;;;;;;;;;;;;;;;:61;;;;2994:65;3016:11;3029;;2994:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3042:6;3050:8;;2994:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;3075:66;3095:11;3108;;3121:6;3129:11;3075:66;;;;;;;;;;:::i;:::-;;;;;;;;2515:634;2382:767;;;;;;:::o;4290:142:3:-;4370:7;4397:11;:18;4409:5;4397:18;;;;;;;;;;;;;;;:27;4416:7;4397:27;;;;;;;;;;;;;;;;4390:34;;4290:142;;;;:::o;2855:32:18:-;;;;:::o;6114:284:14:-;1465:13:19;:11;:13::i;:::-;6238:1:14::1;6228:7;:11;6220:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;6320:7;6276:15;:28;6292:11;6276:28;;;;;;;;;;;;;;;:41;6305:11;6276:41;;;;;;;;;;;;;;;:51;;;;6343:47;6356:11;6369;6382:7;6343:47;;;;;;;;:::i;:::-;;;;;;;;6114:284:::0;;;:::o;1765:223:17:-;1465:13:19;:11;:13::i;:::-;1891:23:17::1;1866:22;;:48;;;;;;;;;;;;;;;;;;1930:50;1956:23;1930:50;;;;;;:::i;:::-;;;;;;;;1765:223:::0;:::o;5128:207:14:-;1465:13:19;:11;:13::i;:::-;5267:5:14::1;;5229:19;:35;5249:14;5229:35;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;5288:39;5305:14;5321:5;;5288:39;;;;;;;;:::i;:::-;;;;;;;;5128:207:::0;;;:::o;361:34:17:-;;;;;;;;;;;;;:::o;2512:220:19:-;1465:13;:11;:13::i;:::-;2617:1:::1;2597:22;;:8;:22;;::::0;2593:93:::1;;2671:1;2643:31;;;;;;;;;;;:::i;:::-;;;;;;;;2593:93;2696:28;2715:8;2696:18;:28::i;:::-;2512:220:::0;:::o;4050:211:14:-;4153:12;4185:10;:20;;;4206:8;4216;4234:4;4241:11;4185:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4178:75;;4050:211;;;;;;:::o;638:103:16:-;693:7;728:4;713:20;;638:103;:::o;657:98:1:-;710:7;737:10;730:17;;657:98;:::o;997:514:15:-;1147:12;1161:19;1184:153;1218:9;1229:3;1257:34;;;1293:11;1306;1319:6;1327:8;1234:102;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1192:4;1184:33;;;;:153;;;;;;:::i;:::-;1146:191;;;;1397:7;1392:112;;1421:71;1441:11;1454;1467:6;1475:8;1485:6;1421:19;:71::i;:::-;1392:112;1135:376;;997:514;;;;:::o;477:215:17:-;579:4;618:26;603:41;;;:11;:41;;;;:81;;;;648:36;672:11;648:23;:36::i;:::-;603:81;596:88;;477:215;;;:::o;1744:166:19:-;1815:12;:10;:12::i;:::-;1804:23;;:7;:5;:7::i;:::-;:23;;;1800:103;;1878:12;:10;:12::i;:::-;1851:40;;;;;;;;;;;:::i;:::-;;;;;;;;1800:103;1744:166::o;11300:138:3:-;11393:37;11402:5;11409:7;11418:5;11425:4;11393:8;:37::i;:::-;11300:138;;;:::o;3189:412:18:-;3316:9;3309:3;;3299:7;:13;;;;:::i;:::-;:26;;3291:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3464:1;3437:29;;:15;:29;;;3433:110;;3501:3;3488:43;;;3506:7;3515:15;3488:43;;;;;;;:::i;:::-;;;;;;;;3433:110;3555:38;3561:3;3582:10;:8;:10::i;:::-;3576:2;:16;;;;:::i;:::-;3566:7;:26;;;;:::i;:::-;3555:5;:38::i;:::-;3189:412;;;:::o;13037:487:3:-;13137:24;13164:25;13174:5;13181:7;13164:9;:25::i;:::-;13137:52;;13224:17;13204:16;:37;13200:317;;13281:5;13262:16;:24;13258:132;;;13341:7;13350:16;13368:5;13314:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;13258:132;13433:57;13442:5;13449:7;13477:5;13458:16;:24;13484:5;13433:8;:57::i;:::-;13200:317;13126:398;13037:487;;;:::o;7992:308::-;8092:1;8076:18;;:4;:18;;;8072:88;;8145:1;8118:30;;;;;;;;;;;:::i;:::-;;;;;;;;8072:88;8188:1;8174:16;;:2;:16;;;8170:88;;8243:1;8214:32;;;;;;;;;;;:::i;:::-;;;;;;;;8170:88;8268:24;8276:4;8282:2;8286:5;8268:7;:24::i;:::-;7992:308;;;:::o;2453:789:17:-;2659:71;2679:11;351:1;2701:14;288:1;2659:19;:71::i;:::-;2743:11;2757:51;2768:5;2775:11;2788:10;2800:7;2757:10;:51::i;:::-;2743:65;;2821:22;351:1;2866:10;2878:6;2846:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2821:64;;2899:14;2919:63;2936:11;2949:9;2960:5;2967:14;2919:16;:63::i;:::-;2898:84;;;3014:9;3001;:22;;2993:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3071:94;3079:11;3092:9;3103:14;3119:18;3139:14;3155:9;3071:7;:94::i;:::-;3208:5;3183:51;;3195:11;3183:51;;;3215:10;3227:6;3183:51;;;;;;;:::i;:::-;;;;;;;;2648:594;;;2453:789;;;;;;;:::o;1996:449::-;2148:17;2234:2;2224:8;2220:17;2214:24;2200:38;;351:1;2265:21;;:10;:21;;;2261:177;;2303:52;2312:11;2325;2338:6;2346:8;2303;:52::i;:::-;2261:177;;;2388:38;;;;;;;;;;:::i;:::-;;;;;;;;2261:177;2137:308;1996:449;;;;:::o;2892:191:19:-;2966:16;2985:6;;;;;;;;;;;2966:25;;3011:8;3002:6;;:17;;;;;;;;;;;;;;;;;;3066:8;3035:40;;3056:8;3035:40;;;;;;;;;;;;2955:128;2892:191;:::o;9092:2779:0:-;9233:12;9287:7;9281:2;9271:7;:12;;;;:::i;:::-;:23;;9263:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9358:7;9349:6;:16;;;;:::i;:::-;9332:6;:13;:33;;9324:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9400:22;9473:7;9466:15;9500:1;9495:1933;;;;11572:4;11566:11;11553:24;;11753:1;11742:9;11735:20;11803:4;11792:9;11788:20;11782:4;11775:34;9459:2365;;9495:1933;9672:4;9666:11;9653:24;;10309:2;10300:7;10296:16;10681:9;10674:17;10668:4;10664:28;10652:9;10641;10637:25;10633:60;10730:7;10726:2;10722:16;10979:6;10965:9;10958:17;10952:4;10948:28;10936:9;10928:6;10924:22;10920:57;10916:70;10758:426;11013:3;11009:2;11006:11;10758:426;;;11161:2;11155:9;11151:2;11144:21;11055:4;11051:2;11047:13;11041:19;;11096:4;11092:2;11088:13;11082:19;;10758:426;;;10762:243;11222:7;11211:9;11204:26;11408:2;11404:7;11399:2;11395;11391:11;11387:25;11381:4;11374:39;9502:1926;;;9459:2365;;11854:9;11847:16;;;9092:2779;;;;;:::o;1140:1275:4:-;1302:4;1308:12;1370:15;1396:13;1420:24;1457:8;1447:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1420:46;;1948:1;1922;1888:9;1882:16;1853:4;1842:9;1838:20;1807:1;1772:7;1746:4;1727:247;1715:259;;2039:16;2028:27;;2084:8;2075:7;2072:21;2069:78;;;2124:8;2113:19;;2069:78;2230:7;2217:11;2210:28;2348:7;2345:1;2338:4;2325:11;2321:22;2306:50;2385:8;2395:11;2377:30;;;;;;;1140:1275;;;;;;;:::o;1519:323:15:-;1743:8;1733:19;;;;;;1682:14;:27;1697:11;1682:27;;;;;;;;;;;;;;;1710:11;1682:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;1723:6;1682:48;;;;;;;;;;;;;;;:70;;;;1768:66;1782:11;1795;1808:6;1816:8;1826:7;1768:66;;;;;;;;;;:::i;:::-;;;;;;;;1519:323;;;;;:::o;770:148:2:-;846:4;885:25;870:40;;;:11;:40;;;;863:47;;770:148;;;:::o;12305:443:3:-;12435:1;12418:19;;:5;:19;;;12414:91;;12490:1;12461:32;;;;;;;;;;;:::i;:::-;;;;;;;;12414:91;12538:1;12519:21;;:7;:21;;;12515:92;;12592:1;12564:31;;;;;;;;;;;:::i;:::-;;;;;;;;12515:92;12647:5;12617:11;:18;12629:5;12617:18;;;;;;;;;;;;;;;:27;12636:7;12617:27;;;;;;;;;;;;;;;:35;;;;12667:9;12663:78;;;12714:7;12698:31;;12707:5;12698:31;;;12723:5;12698:31;;;;;;:::i;:::-;;;;;;;;12663:78;12305:443;;;;:::o;10104:213::-;10194:1;10175:21;;:7;:21;;;10171:93;;10249:1;10220:32;;;;;;;;;;;:::i;:::-;;;;;;;;10171:93;10274:35;10290:1;10294:7;10303:5;10274:7;:35::i;:::-;10104:213;;:::o;8616:1135::-;8722:1;8706:18;;:4;:18;;;8702:552;;8860:5;8844:12;;:21;;;;;;;:::i;:::-;;;;;;;;8702:552;;;8898:19;8920:9;:15;8930:4;8920:15;;;;;;;;;;;;;;;;8898:37;;8968:5;8954:11;:19;8950:117;;;9026:4;9032:11;9045:5;9001:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;8950:117;9222:5;9208:11;:19;9190:9;:15;9200:4;9190:15;;;;;;;;;;;;;;;:37;;;;8883:371;8702:552;9284:1;9270:16;;:2;:16;;;9266:435;;9452:5;9436:12;;:21;;;;;;;;;;;9266:435;;;9669:5;9652:9;:13;9662:2;9652:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;9266:435;9733:2;9718:25;;9727:4;9718:25;;;9737:5;9718:25;;;;;;:::i;:::-;;;;;;;;8616:1135;;;:::o;3633:373:17:-;3775:22;;;;;;;;;;;3771:228;;;3814:63;3829:11;3842:7;3851:14;3867:9;3814:14;:63::i;:::-;3771:228;;;3943:1;3918:14;:21;:26;3910:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:228;3633:373;;;;:::o;869:290:16:-;974:4;991:15;1009:12;:10;:12::i;:::-;991:30;;1045:7;1036:16;;:5;:16;;;1032:62;;1054:40;1070:5;1077:7;1086;1054:15;:40::i;:::-;1032:62;1105:21;1111:5;1118:7;1105:5;:21::i;:::-;1144:7;1137:14;;;869:290;;;;;;:::o;2288:553:14:-;2482:26;2511:19;:32;2531:11;2511:32;;;;;;;;;;;;;;;2482:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2586:1;2562:13;:20;:25;2554:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;2651:47;2669:11;2682:8;:15;2651:17;:47::i;:::-;2709:10;:15;;;2732:10;2744:11;2757:13;2772:8;2782:14;2798:18;2818:14;2709:124;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2471:370;2288:553;;;;;;:::o;3250:375:17:-;3364:27;3393:11;3419:8;3408:43;;;;;;;;;;;;:::i;:::-;3361:90;;;;;3464:10;3477:27;3502:1;3477:14;:24;;:27;;;;:::i;:::-;3464:40;;3526:34;3536:11;3549:2;3553:6;3526:9;:34::i;:::-;3517:43;;3606:2;3576:41;;3593:11;3576:41;;;3610:6;3576:41;;;;;;:::i;:::-;;;;;;;;3350:275;;;3250:375;;;;:::o;2849:420:14:-;2985:21;3009:28;3022:14;3009:12;:28::i;:::-;2985:52;;3048:16;3105:9;3067:15;:28;3083:11;3067:28;;;;;;;;;;;;;;;:35;3096:5;3067:35;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;3048:66;;3147:1;3133:11;:15;3125:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3218:11;3198:16;:31;;3190:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2974:295;;2849:420;;;;:::o;10652:211:3:-;10742:1;10723:21;;:7;:21;;;10719:91;;10795:1;10768:30;;;;;;;;;;;:::i;:::-;;;;;;;;10719:91;10820:35;10828:7;10845:1;10849:5;10820:7;:35::i;:::-;10652:211;;:::o;3556:389:14:-;3655:21;3679:22;:35;3702:11;3679:35;;;;;;;;;;;;;;;;3655:59;;3749:1;3729:16;:21;3725:125;;562:5;3793:45;;3725:125;3884:16;3868:12;:32;;3860:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3644:301;3556:389;;:::o;11879:363:0:-;11958:7;12012:2;12003:6;:11;;;;:::i;:::-;11986:6;:13;:28;;11978:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;12051:19;12165:27;12155:6;12148:4;12140:6;12136:17;12132:30;12126:37;12122:71;12107:86;;12223:11;12216:18;;;11879:363;;;;:::o;1167:171:16:-;1262:4;1279:26;1285:10;1297:7;1279:5;:26::i;:::-;1323:7;1316:14;;1167:171;;;;;:::o;3277:271:14:-;3359:13;3418:2;3393:14;:21;:27;;3385:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3526:2;3510:14;3506:23;3500:30;3488:42;;3277:271;;;:::o;7:75:21:-;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:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:117;1053:1;1050;1043:12;1080:552;1137:8;1147:6;1197:3;1190:4;1182:6;1178:17;1174:27;1164:122;;1205:79;;:::i;:::-;1164:122;1318:6;1305:20;1295:30;;1348:18;1340:6;1337:30;1334:117;;;1370:79;;:::i;:::-;1334:117;1484:4;1476:6;1472:17;1460:29;;1538:3;1530:4;1522:6;1518:17;1508:8;1504:32;1501:41;1498:128;;;1545:79;;:::i;:::-;1498:128;1080:552;;;;;:::o;1638:101::-;1674:7;1714:18;1707:5;1703:30;1692:41;;1638:101;;;:::o;1745:120::-;1817:23;1834:5;1817:23;:::i;:::-;1810:5;1807:34;1797:62;;1855:1;1852;1845:12;1797:62;1745:120;:::o;1871:137::-;1916:5;1954:6;1941:20;1932:29;;1970:32;1996:5;1970:32;:::i;:::-;1871:137;;;;:::o;2014:1157::-;2120:6;2128;2136;2144;2152;2160;2209:3;2197:9;2188:7;2184:23;2180:33;2177:120;;;2216:79;;:::i;:::-;2177:120;2336:1;2361:52;2405:7;2396:6;2385:9;2381:22;2361:52;:::i;:::-;2351:62;;2307:116;2490:2;2479:9;2475:18;2462:32;2521:18;2513:6;2510:30;2507:117;;;2543:79;;:::i;:::-;2507:117;2656:64;2712:7;2703:6;2692:9;2688:22;2656:64;:::i;:::-;2638:82;;;;2433:297;2769:2;2795:52;2839:7;2830:6;2819:9;2815:22;2795:52;:::i;:::-;2785:62;;2740:117;2924:2;2913:9;2909:18;2896:32;2955:18;2947:6;2944:30;2941:117;;;2977:79;;:::i;:::-;2941:117;3090:64;3146:7;3137:6;3126:9;3122:22;3090:64;:::i;:::-;3072:82;;;;2867:297;2014:1157;;;;;;;;:::o;3177:149::-;3213:7;3253:66;3246:5;3242:78;3231:89;;3177:149;;;:::o;3332:120::-;3404:23;3421:5;3404:23;:::i;:::-;3397:5;3394:34;3384:62;;3442:1;3439;3432:12;3384:62;3332:120;:::o;3458:137::-;3503:5;3541:6;3528:20;3519:29;;3557:32;3583:5;3557:32;:::i;:::-;3458:137;;;;:::o;3601:327::-;3659:6;3708:2;3696:9;3687:7;3683:23;3679:32;3676:119;;;3714:79;;:::i;:::-;3676:119;3834:1;3859:52;3903:7;3894:6;3883:9;3879:22;3859:52;:::i;:::-;3849:62;;3805:116;3601:327;;;;:::o;3934:90::-;3968:7;4011:5;4004:13;3997:21;3986:32;;3934:90;;;:::o;4030:109::-;4111:21;4126:5;4111:21;:::i;:::-;4106:3;4099:34;4030:109;;:::o;4145:210::-;4232:4;4270:2;4259:9;4255:18;4247:26;;4283:65;4345:1;4334:9;4330:17;4321:6;4283:65;:::i;:::-;4145:210;;;;:::o;4361:99::-;4413:6;4447:5;4441:12;4431:22;;4361:99;;;:::o;4466:169::-;4550:11;4584:6;4579:3;4572:19;4624:4;4619:3;4615:14;4600:29;;4466:169;;;;:::o;4641:246::-;4722:1;4732:113;4746:6;4743:1;4740:13;4732:113;;;4831:1;4826:3;4822:11;4816:18;4812:1;4807:3;4803:11;4796:39;4768:2;4765:1;4761:10;4756:15;;4732:113;;;4879:1;4870:6;4865:3;4861:16;4854:27;4703:184;4641:246;;;:::o;4893:102::-;4934:6;4985:2;4981:7;4976:2;4969:5;4965:14;4961:28;4951:38;;4893:102;;;:::o;5001:377::-;5089:3;5117:39;5150:5;5117:39;:::i;:::-;5172:71;5236:6;5231:3;5172:71;:::i;:::-;5165:78;;5252:65;5310:6;5305:3;5298:4;5291:5;5287:16;5252:65;:::i;:::-;5342:29;5364:6;5342:29;:::i;:::-;5337:3;5333:39;5326:46;;5093:285;5001:377;;;;:::o;5384:313::-;5497:4;5535:2;5524:9;5520:18;5512:26;;5584:9;5578:4;5574:20;5570:1;5559:9;5555:17;5548:47;5612:78;5685:4;5676:6;5612:78;:::i;:::-;5604:86;;5384:313;;;;:::o;5703:327::-;5761:6;5810:2;5798:9;5789:7;5785:23;5781:32;5778:119;;;5816:79;;:::i;:::-;5778:119;5936:1;5961:52;6005:7;5996:6;5985:9;5981:22;5961:52;:::i;:::-;5951:62;;5907:116;5703:327;;;;:::o;6036:126::-;6073:7;6113:42;6106:5;6102:54;6091:65;;6036:126;;;:::o;6168:96::-;6205:7;6234:24;6252:5;6234:24;:::i;:::-;6223:35;;6168:96;;;:::o;6270:122::-;6343:24;6361:5;6343:24;:::i;:::-;6336:5;6333:35;6323:63;;6382:1;6379;6372:12;6323:63;6270:122;:::o;6398:139::-;6444:5;6482:6;6469:20;6460:29;;6498:33;6525:5;6498:33;:::i;:::-;6398:139;;;;:::o;6543:77::-;6580:7;6609:5;6598:16;;6543:77;;;:::o;6626:122::-;6699:24;6717:5;6699:24;:::i;:::-;6692:5;6689:35;6679:63;;6738:1;6735;6728:12;6679:63;6626:122;:::o;6754:139::-;6800:5;6838:6;6825:20;6816:29;;6854:33;6881:5;6854:33;:::i;:::-;6754:139;;;;:::o;6899:474::-;6967:6;6975;7024:2;7012:9;7003:7;6999:23;6995:32;6992:119;;;7030:79;;:::i;:::-;6992:119;7150:1;7175:53;7220:7;7211:6;7200:9;7196:22;7175:53;:::i;:::-;7165:63;;7121:117;7277:2;7303:53;7348:7;7339:6;7328:9;7324:22;7303:53;:::i;:::-;7293:63;;7248:118;6899:474;;;;;:::o;7379:619::-;7456:6;7464;7472;7521:2;7509:9;7500:7;7496:23;7492:32;7489:119;;;7527:79;;:::i;:::-;7489:119;7647:1;7672:53;7717:7;7708:6;7697:9;7693:22;7672:53;:::i;:::-;7662:63;;7618:117;7774:2;7800:53;7845:7;7836:6;7825:9;7821:22;7800:53;:::i;:::-;7790:63;;7745:118;7902:2;7928:53;7973:7;7964:6;7953:9;7949:22;7928:53;:::i;:::-;7918:63;;7873:118;7379:619;;;;;:::o;8004:472::-;8071:6;8079;8128:2;8116:9;8107:7;8103:23;8099:32;8096:119;;;8134:79;;:::i;:::-;8096:119;8254:1;8279:52;8323:7;8314:6;8303:9;8299:22;8279:52;:::i;:::-;8269:62;;8225:116;8380:2;8406:53;8451:7;8442:6;8431:9;8427:22;8406:53;:::i;:::-;8396:63;;8351:118;8004:472;;;;;:::o;8482:118::-;8569:24;8587:5;8569:24;:::i;:::-;8564:3;8557:37;8482:118;;:::o;8606:222::-;8699:4;8737:2;8726:9;8722:18;8714:26;;8750:71;8818:1;8807:9;8803:17;8794:6;8750:71;:::i;:::-;8606:222;;;;:::o;8834:619::-;8911:6;8919;8927;8976:2;8964:9;8955:7;8951:23;8947:32;8944:119;;;8982:79;;:::i;:::-;8944:119;9102:1;9127:53;9172:7;9163:6;9152:9;9148:22;9127:53;:::i;:::-;9117:63;;9073:117;9229:2;9255:53;9300:7;9291:6;9280:9;9276:22;9255:53;:::i;:::-;9245:63;;9200:118;9357:2;9383:53;9428:7;9419:6;9408:9;9404:22;9383:53;:::i;:::-;9373:63;;9328:118;8834:619;;;;;:::o;9459:116::-;9529:21;9544:5;9529:21;:::i;:::-;9522:5;9519:32;9509:60;;9565:1;9562;9555:12;9509:60;9459:116;:::o;9581:133::-;9624:5;9662:6;9649:20;9640:29;;9678:30;9702:5;9678:30;:::i;:::-;9581:133;;;;:::o;9720:1299::-;9833:6;9841;9849;9857;9865;9873;9881;9930:3;9918:9;9909:7;9905:23;9901:33;9898:120;;;9937:79;;:::i;:::-;9898:120;10057:1;10082:52;10126:7;10117:6;10106:9;10102:22;10082:52;:::i;:::-;10072:62;;10028:116;10211:2;10200:9;10196:18;10183:32;10242:18;10234:6;10231:30;10228:117;;;10264:79;;:::i;:::-;10228:117;10377:64;10433:7;10424:6;10413:9;10409:22;10377:64;:::i;:::-;10359:82;;;;10154:297;10490:2;10516:53;10561:7;10552:6;10541:9;10537:22;10516:53;:::i;:::-;10506:63;;10461:118;10618:2;10644:50;10686:7;10677:6;10666:9;10662:22;10644:50;:::i;:::-;10634:60;;10589:115;10771:3;10760:9;10756:19;10743:33;10803:18;10795:6;10792:30;10789:117;;;10825:79;;:::i;:::-;10789:117;10938:64;10994:7;10985:6;10974:9;10970:22;10938:64;:::i;:::-;10920:82;;;;10714:298;9720:1299;;;;;;;;;;:::o;11025:332::-;11146:4;11184:2;11173:9;11169:18;11161:26;;11197:71;11265:1;11254:9;11250:17;11241:6;11197:71;:::i;:::-;11278:72;11346:2;11335:9;11331:18;11322:6;11278:72;:::i;:::-;11025:332;;;;;:::o;11363:86::-;11398:7;11438:4;11431:5;11427:16;11416:27;;11363:86;;;:::o;11455:112::-;11538:22;11554:5;11538:22;:::i;:::-;11533:3;11526:35;11455:112;;:::o;11573:214::-;11662:4;11700:2;11689:9;11685:18;11677:26;;11713:67;11777:1;11766:9;11762:17;11753:6;11713:67;:::i;:::-;11573:214;;;;:::o;11793:670::-;11871:6;11879;11887;11936:2;11924:9;11915:7;11911:23;11907:32;11904:119;;;11942:79;;:::i;:::-;11904:119;12062:1;12087:52;12131:7;12122:6;12111:9;12107:22;12087:52;:::i;:::-;12077:62;;12033:116;12216:2;12205:9;12201:18;12188:32;12247:18;12239:6;12236:30;12233:117;;;12269:79;;:::i;:::-;12233:117;12382:64;12438:7;12429:6;12418:9;12414:22;12382:64;:::i;:::-;12364:82;;;;12159:297;11793:670;;;;;:::o;12469:115::-;12554:23;12571:5;12554:23;:::i;:::-;12549:3;12542:36;12469:115;;:::o;12590:218::-;12681:4;12719:2;12708:9;12704:18;12696:26;;12732:69;12798:1;12787:9;12783:17;12774:6;12732:69;:::i;:::-;12590:218;;;;:::o;12814:104::-;12859:7;12888:24;12906:5;12888:24;:::i;:::-;12877:35;;12814:104;;;:::o;12924:138::-;13005:32;13031:5;13005:32;:::i;:::-;12998:5;12995:43;12985:71;;13052:1;13049;13042:12;12985:71;12924:138;:::o;13068:155::-;13122:5;13160:6;13147:20;13138:29;;13176:41;13211:5;13176:41;:::i;:::-;13068:155;;;;:::o;13229:1613::-;13371:6;13379;13387;13395;13403;13411;13419;13427;13435;13484:3;13472:9;13463:7;13459:23;13455:33;13452:120;;;13491:79;;:::i;:::-;13452:120;13611:1;13636:53;13681:7;13672:6;13661:9;13657:22;13636:53;:::i;:::-;13626:63;;13582:117;13738:2;13764:52;13808:7;13799:6;13788:9;13784:22;13764:52;:::i;:::-;13754:62;;13709:117;13893:2;13882:9;13878:18;13865:32;13924:18;13916:6;13913:30;13910:117;;;13946:79;;:::i;:::-;13910:117;14059:64;14115:7;14106:6;14095:9;14091:22;14059:64;:::i;:::-;14041:82;;;;13836:297;14172:2;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14143:118;14300:3;14327:61;14380:7;14371:6;14360:9;14356:22;14327:61;:::i;:::-;14317:71;;14271:127;14437:3;14464:53;14509:7;14500:6;14489:9;14485:22;14464:53;:::i;:::-;14454:63;;14408:119;14594:3;14583:9;14579:19;14566:33;14626:18;14618:6;14615:30;14612:117;;;14648:79;;:::i;:::-;14612:117;14761:64;14817:7;14808:6;14797:9;14793:22;14761:64;:::i;:::-;14743:82;;;;14537:298;13229:1613;;;;;;;;;;;:::o;14848:117::-;14957:1;14954;14947:12;14971:180;15019:77;15016:1;15009:88;15116:4;15113:1;15106:15;15140:4;15137:1;15130:15;15157:281;15240:27;15262:4;15240:27;:::i;:::-;15232:6;15228:40;15370:6;15358:10;15355:22;15334:18;15322:10;15319:34;15316:62;15313:88;;;15381:18;;:::i;:::-;15313:88;15421:10;15417:2;15410:22;15200:238;15157:281;;:::o;15444:129::-;15478:6;15505:20;;:::i;:::-;15495:30;;15534:33;15562:4;15554:6;15534:33;:::i;:::-;15444:129;;;:::o;15579:307::-;15640:4;15730:18;15722:6;15719:30;15716:56;;;15752:18;;:::i;:::-;15716:56;15790:29;15812:6;15790:29;:::i;:::-;15782:37;;15874:4;15868;15864:15;15856:23;;15579:307;;;:::o;15892:146::-;15989:6;15984:3;15979;15966:30;16030:1;16021:6;16016:3;16012:16;16005:27;15892:146;;;:::o;16044:423::-;16121:5;16146:65;16162:48;16203:6;16162:48;:::i;:::-;16146:65;:::i;:::-;16137:74;;16234:6;16227:5;16220:21;16272:4;16265:5;16261:16;16310:3;16301:6;16296:3;16292:16;16289:25;16286:112;;;16317:79;;:::i;:::-;16286:112;16407:54;16454:6;16449:3;16444;16407:54;:::i;:::-;16127:340;16044:423;;;;;:::o;16486:338::-;16541:5;16590:3;16583:4;16575:6;16571:17;16567:27;16557:122;;16598:79;;:::i;:::-;16557:122;16715:6;16702:20;16740:78;16814:3;16806:6;16799:4;16791:6;16787:17;16740:78;:::i;:::-;16731:87;;16547:277;16486:338;;;;:::o;16830:793::-;16914:6;16922;16930;16979:2;16967:9;16958:7;16954:23;16950:32;16947:119;;;16985:79;;:::i;:::-;16947:119;17105:1;17130:52;17174:7;17165:6;17154:9;17150:22;17130:52;:::i;:::-;17120:62;;17076:116;17259:2;17248:9;17244:18;17231:32;17290:18;17282:6;17279:30;17276:117;;;17312:79;;:::i;:::-;17276:117;17417:62;17471:7;17462:6;17451:9;17447:22;17417:62;:::i;:::-;17407:72;;17202:287;17528:2;17554:52;17598:7;17589:6;17578:9;17574:22;17554:52;:::i;:::-;17544:62;;17499:117;16830:793;;;;;:::o;17629:77::-;17666:7;17695:5;17684:16;;17629:77;;;:::o;17712:118::-;17799:24;17817:5;17799:24;:::i;:::-;17794:3;17787:37;17712:118;;:::o;17836:222::-;17929:4;17967:2;17956:9;17952:18;17944:26;;17980:71;18048:1;18037:9;18033:17;18024:6;17980:71;:::i;:::-;17836:222;;;;:::o;18064:329::-;18123:6;18172:2;18160:9;18151:7;18147:23;18143:32;18140:119;;;18178:79;;:::i;:::-;18140:119;18298:1;18323:53;18368:7;18359:6;18348:9;18344:22;18323:53;:::i;:::-;18313:63;;18269:117;18064:329;;;;:::o;18399:1113::-;18499:6;18507;18515;18523;18572:3;18560:9;18551:7;18547:23;18543:33;18540:120;;;18579:79;;:::i;:::-;18540:120;18699:1;18724:52;18768:7;18759:6;18748:9;18744:22;18724:52;:::i;:::-;18714:62;;18670:116;18853:2;18842:9;18838:18;18825:32;18884:18;18876:6;18873:30;18870:117;;;18906:79;;:::i;:::-;18870:117;19011:62;19065:7;19056:6;19045:9;19041:22;19011:62;:::i;:::-;19001:72;;18796:287;19122:2;19148:50;19190:7;19181:6;19170:9;19166:22;19148:50;:::i;:::-;19138:60;;19093:115;19275:2;19264:9;19260:18;19247:32;19306:18;19298:6;19295:30;19292:117;;;19328:79;;:::i;:::-;19292:117;19433:62;19487:7;19478:6;19467:9;19463:22;19433:62;:::i;:::-;19423:72;;19218:287;18399:1113;;;;;;;:::o;19518:329::-;19577:6;19626:2;19614:9;19605:7;19601:23;19597:32;19594:119;;;19632:79;;:::i;:::-;19594:119;19752:1;19777:53;19822:7;19813:6;19802:9;19798:22;19777:53;:::i;:::-;19767:63;;19723:117;19518:329;;;;:::o;19853:98::-;19904:6;19938:5;19932:12;19922:22;;19853:98;;;:::o;19957:168::-;20040:11;20074:6;20069:3;20062:19;20114:4;20109:3;20105:14;20090:29;;19957:168;;;;:::o;20131:373::-;20217:3;20245:38;20277:5;20245:38;:::i;:::-;20299:70;20362:6;20357:3;20299:70;:::i;:::-;20292:77;;20378:65;20436:6;20431:3;20424:4;20417:5;20413:16;20378:65;:::i;:::-;20468:29;20490:6;20468:29;:::i;:::-;20463:3;20459:39;20452:46;;20221:283;20131:373;;;;:::o;20510:309::-;20621:4;20659:2;20648:9;20644:18;20636:26;;20708:9;20702:4;20698:20;20694:1;20683:9;20679:17;20672:47;20736:76;20807:4;20798:6;20736:76;:::i;:::-;20728:84;;20510:309;;;;:::o;20825:470::-;20891:6;20899;20948:2;20936:9;20927:7;20923:23;20919:32;20916:119;;;20954:79;;:::i;:::-;20916:119;21074:1;21099:52;21143:7;21134:6;21123:9;21119:22;21099:52;:::i;:::-;21089:62;;21045:116;21200:2;21226:52;21270:7;21261:6;21250:9;21246:22;21226:52;:::i;:::-;21216:62;;21171:117;20825:470;;;;;:::o;21301:118::-;21388:24;21406:5;21388:24;:::i;:::-;21383:3;21376:37;21301:118;;:::o;21425:222::-;21518:4;21556:2;21545:9;21541:18;21533:26;;21569:71;21637:1;21626:9;21622:17;21613:6;21569:71;:::i;:::-;21425:222;;;;:::o;21653:60::-;21681:3;21702:5;21695:12;;21653:60;;;:::o;21719:142::-;21769:9;21802:53;21820:34;21829:24;21847:5;21829:24;:::i;:::-;21820:34;:::i;:::-;21802:53;:::i;:::-;21789:66;;21719:142;;;:::o;21867:126::-;21917:9;21950:37;21981:5;21950:37;:::i;:::-;21937:50;;21867:126;;;:::o;21999:153::-;22076:9;22109:37;22140:5;22109:37;:::i;:::-;22096:50;;21999:153;;;:::o;22158:185::-;22272:64;22330:5;22272:64;:::i;:::-;22267:3;22260:77;22158:185;;:::o;22349:276::-;22469:4;22507:2;22496:9;22492:18;22484:26;;22520:98;22615:1;22604:9;22600:17;22591:6;22520:98;:::i;:::-;22349:276;;;;:::o;22631:959::-;22726:6;22734;22742;22750;22758;22807:3;22795:9;22786:7;22782:23;22778:33;22775:120;;;22814:79;;:::i;:::-;22775:120;22934:1;22959:52;23003:7;22994:6;22983:9;22979:22;22959:52;:::i;:::-;22949:62;;22905:116;23060:2;23086:52;23130:7;23121:6;23110:9;23106:22;23086:52;:::i;:::-;23076:62;;23031:117;23187:2;23213:53;23258:7;23249:6;23238:9;23234:22;23213:53;:::i;:::-;23203:63;;23158:118;23343:2;23332:9;23328:18;23315:32;23374:18;23366:6;23363:30;23360:117;;;23396:79;;:::i;:::-;23360:117;23509:64;23565:7;23556:6;23545:9;23541:22;23509:64;:::i;:::-;23491:82;;;;23286:297;22631:959;;;;;;;;:::o;23596:474::-;23664:6;23672;23721:2;23709:9;23700:7;23696:23;23692:32;23689:119;;;23727:79;;:::i;:::-;23689:119;23847:1;23872:53;23917:7;23908:6;23897:9;23893:22;23872:53;:::i;:::-;23862:63;;23818:117;23974:2;24000:53;24045:7;24036:6;24025:9;24021:22;24000:53;:::i;:::-;23990:63;;23945:118;23596:474;;;;;:::o;24076:615::-;24151:6;24159;24167;24216:2;24204:9;24195:7;24191:23;24187:32;24184:119;;;24222:79;;:::i;:::-;24184:119;24342:1;24367:52;24411:7;24402:6;24391:9;24387:22;24367:52;:::i;:::-;24357:62;;24313:116;24468:2;24494:52;24538:7;24529:6;24518:9;24514:22;24494:52;:::i;:::-;24484:62;;24439:117;24595:2;24621:53;24666:7;24657:6;24646:9;24642:22;24621:53;:::i;:::-;24611:63;;24566:118;24076:615;;;;;:::o;24697:323::-;24753:6;24802:2;24790:9;24781:7;24777:23;24773:32;24770:119;;;24808:79;;:::i;:::-;24770:119;24928:1;24953:50;24995:7;24986:6;24975:9;24971:22;24953:50;:::i;:::-;24943:60;;24899:114;24697:323;;;;:::o;25026:761::-;25110:6;25118;25126;25134;25183:3;25171:9;25162:7;25158:23;25154:33;25151:120;;;25190:79;;:::i;:::-;25151:120;25310:1;25335:52;25379:7;25370:6;25359:9;25355:22;25335:52;:::i;:::-;25325:62;;25281:116;25436:2;25462:52;25506:7;25497:6;25486:9;25482:22;25462:52;:::i;:::-;25452:62;;25407:117;25563:2;25589:53;25634:7;25625:6;25614:9;25610:22;25589:53;:::i;:::-;25579:63;;25534:118;25691:2;25717:53;25762:7;25753:6;25742:9;25738:22;25717:53;:::i;:::-;25707:63;;25662:118;25026:761;;;;;;;:::o;25793:180::-;25933:32;25929:1;25921:6;25917:14;25910:56;25793:180;:::o;25979:366::-;26121:3;26142:67;26206:2;26201:3;26142:67;:::i;:::-;26135:74;;26218:93;26307:3;26218:93;:::i;:::-;26336:2;26331:3;26327:12;26320:19;;25979:366;;;:::o;26351:419::-;26517:4;26555:2;26544:9;26540:18;26532:26;;26604:9;26598:4;26594:20;26590:1;26579:9;26575:17;26568:47;26632:131;26758:4;26632:131;:::i;:::-;26624:139;;26351:419;;;:::o;26776:180::-;26824:77;26821:1;26814:88;26921:4;26918:1;26911:15;26945:4;26942:1;26935:15;26962:320;27006:6;27043:1;27037:4;27033:12;27023:22;;27090:1;27084:4;27080:12;27111:18;27101:81;;27167:4;27159:6;27155:17;27145:27;;27101:81;27229:2;27221:6;27218:14;27198:18;27195:38;27192:84;;27248:18;;:::i;:::-;27192:84;27013:269;26962:320;;;:::o;27288:147::-;27389:11;27426:3;27411:18;;27288:147;;;;:::o;27463:327::-;27577:3;27598:88;27679:6;27674:3;27598:88;:::i;:::-;27591:95;;27696:56;27745:6;27740:3;27733:5;27696:56;:::i;:::-;27777:6;27772:3;27768:16;27761:23;;27463:327;;;;;:::o;27796:291::-;27936:3;27958:103;28057:3;28048:6;28040;27958:103;:::i;:::-;27951:110;;28078:3;28071:10;;27796:291;;;;;:::o;28093:225::-;28233:34;28229:1;28221:6;28217:14;28210:58;28302:8;28297:2;28289:6;28285:15;28278:33;28093:225;:::o;28324:366::-;28466:3;28487:67;28551:2;28546:3;28487:67;:::i;:::-;28480:74;;28563:93;28652:3;28563:93;:::i;:::-;28681:2;28676:3;28672:12;28665:19;;28324:366;;;:::o;28696:419::-;28862:4;28900:2;28889:9;28885:18;28877:26;;28949:9;28943:4;28939:20;28935:1;28924:9;28920:17;28913:47;28977:131;29103:4;28977:131;:::i;:::-;28969:139;;28696:419;;;:::o;29143:314::-;29239:3;29260:70;29323:6;29318:3;29260:70;:::i;:::-;29253:77;;29340:56;29389:6;29384:3;29377:5;29340:56;:::i;:::-;29421:29;29443:6;29421:29;:::i;:::-;29416:3;29412:39;29405:46;;29143:314;;;;;:::o;29463:545::-;29638:4;29676:2;29665:9;29661:18;29653:26;;29689:69;29755:1;29744:9;29740:17;29731:6;29689:69;:::i;:::-;29805:9;29799:4;29795:20;29790:2;29779:9;29775:18;29768:48;29833:86;29914:4;29905:6;29897;29833:86;:::i;:::-;29825:94;;29929:72;29997:2;29986:9;29982:18;29973:6;29929:72;:::i;:::-;29463:545;;;;;;;:::o;30014:842::-;30257:4;30295:3;30284:9;30280:19;30272:27;;30309:69;30375:1;30364:9;30360:17;30351:6;30309:69;:::i;:::-;30388:72;30456:2;30445:9;30441:18;30432:6;30388:72;:::i;:::-;30507:9;30501:4;30497:20;30492:2;30481:9;30477:18;30470:48;30535:76;30606:4;30597:6;30535:76;:::i;:::-;30527:84;;30621:66;30683:2;30672:9;30668:18;30659:6;30621:66;:::i;:::-;30735:9;30729:4;30725:20;30719:3;30708:9;30704:19;30697:49;30763:86;30844:4;30835:6;30827;30763:86;:::i;:::-;30755:94;;30014:842;;;;;;;;;:::o;30862:143::-;30919:5;30950:6;30944:13;30935:22;;30966:33;30993:5;30966:33;:::i;:::-;30862:143;;;;:::o;31011:507::-;31090:6;31098;31147:2;31135:9;31126:7;31122:23;31118:32;31115:119;;;31153:79;;:::i;:::-;31115:119;31273:1;31298:64;31354:7;31345:6;31334:9;31330:22;31298:64;:::i;:::-;31288:74;;31244:128;31411:2;31437:64;31493:7;31484:6;31473:9;31469:22;31437:64;:::i;:::-;31427:74;;31382:129;31011:507;;;;;:::o;31524:180::-;31572:77;31569:1;31562:88;31669:4;31666:1;31659:15;31693:4;31690:1;31683:15;31710:191;31750:3;31769:20;31787:1;31769:20;:::i;:::-;31764:25;;31803:20;31821:1;31803:20;:::i;:::-;31798:25;;31846:1;31843;31839:9;31832:16;;31867:3;31864:1;31861:10;31858:36;;;31874:18;;:::i;:::-;31858:36;31710:191;;;;:::o;31907:114::-;;:::o;32027:398::-;32186:3;32207:83;32288:1;32283:3;32207:83;:::i;:::-;32200:90;;32299:93;32388:3;32299:93;:::i;:::-;32417:1;32412:3;32408:11;32401:18;;32027:398;;;:::o;32431:379::-;32615:3;32637:147;32780:3;32637:147;:::i;:::-;32630:154;;32801:3;32794:10;;32431:379;;;:::o;32816:435::-;32963:4;33001:2;32990:9;32986:18;32978:26;;33014:69;33080:1;33069:9;33065:17;33056:6;33014:69;:::i;:::-;33130:9;33124:4;33120:20;33115:2;33104:9;33100:18;33093:48;33158:86;33239:4;33230:6;33222;33158:86;:::i;:::-;33150:94;;32816:435;;;;;;:::o;33257:225::-;33397:34;33393:1;33385:6;33381:14;33374:58;33466:8;33461:2;33453:6;33449:15;33442:33;33257:225;:::o;33488:366::-;33630:3;33651:67;33715:2;33710:3;33651:67;:::i;:::-;33644:74;;33727:93;33816:3;33727:93;:::i;:::-;33845:2;33840:3;33836:12;33829:19;;33488:366;;;:::o;33860:419::-;34026:4;34064:2;34053:9;34049:18;34041:26;;34113:9;34107:4;34103:20;34099:1;34088:9;34084:17;34077:47;34141:131;34267:4;34141:131;:::i;:::-;34133:139;;33860:419;;;:::o;34285:822::-;34518:4;34556:3;34545:9;34541:19;34533:27;;34570:69;34636:1;34625:9;34621:17;34612:6;34570:69;:::i;:::-;34649:72;34717:2;34706:9;34702:18;34693:6;34649:72;:::i;:::-;34768:9;34762:4;34758:20;34753:2;34742:9;34738:18;34731:48;34796:76;34867:4;34858:6;34796:76;:::i;:::-;34788:84;;34882:66;34944:2;34933:9;34929:18;34920:6;34882:66;:::i;:::-;34996:9;34990:4;34986:20;34980:3;34969:9;34965:19;34958:49;35024:76;35095:4;35086:6;35024:76;:::i;:::-;35016:84;;34285:822;;;;;;;;:::o;35113:179::-;35253:31;35249:1;35241:6;35237:14;35230:55;35113:179;:::o;35298:366::-;35440:3;35461:67;35525:2;35520:3;35461:67;:::i;:::-;35454:74;;35537:93;35626:3;35537:93;:::i;:::-;35655:2;35650:3;35646:12;35639:19;;35298:366;;;:::o;35670:419::-;35836:4;35874:2;35863:9;35859:18;35851:26;;35923:9;35917:4;35913:20;35909:1;35898:9;35894:17;35887:47;35951:131;36077:4;35951:131;:::i;:::-;35943:139;;35670:419;;;:::o;36095:194::-;36135:4;36155:20;36173:1;36155:20;:::i;:::-;36150:25;;36189:20;36207:1;36189:20;:::i;:::-;36184:25;;36233:1;36230;36226:9;36218:17;;36257:1;36251:4;36248:11;36245:37;;;36262:18;;:::i;:::-;36245:37;36095:194;;;;:::o;36295:442::-;36444:4;36482:2;36471:9;36467:18;36459:26;;36495:71;36563:1;36552:9;36548:17;36539:6;36495:71;:::i;:::-;36576:72;36644:2;36633:9;36629:18;36620:6;36576:72;:::i;:::-;36658;36726:2;36715:9;36711:18;36702:6;36658:72;:::i;:::-;36295:442;;;;;;:::o;36743:94::-;36776:8;36824:5;36820:2;36816:14;36795:35;;36743:94;;;:::o;36843:::-;36882:7;36911:20;36925:5;36911:20;:::i;:::-;36900:31;;36843:94;;;:::o;36943:100::-;36982:7;37011:26;37031:5;37011:26;:::i;:::-;37000:37;;36943:100;;;:::o;37049:157::-;37154:45;37174:24;37192:5;37174:24;:::i;:::-;37154:45;:::i;:::-;37149:3;37142:58;37049:157;;:::o;37212:432::-;37380:3;37402:103;37501:3;37492:6;37484;37402:103;:::i;:::-;37395:110;;37515:75;37586:3;37577:6;37515:75;:::i;:::-;37615:2;37610:3;37606:12;37599:19;;37635:3;37628:10;;37212:432;;;;;;:::o;37650:140::-;37698:4;37721:3;37713:11;;37744:3;37741:1;37734:14;37778:4;37775:1;37765:18;37757:26;;37650:140;;;:::o;37796:93::-;37833:6;37880:2;37875;37868:5;37864:14;37860:23;37850:33;;37796:93;;;:::o;37895:107::-;37939:8;37989:5;37983:4;37979:16;37958:37;;37895:107;;;;:::o;38008:393::-;38077:6;38127:1;38115:10;38111:18;38150:97;38180:66;38169:9;38150:97;:::i;:::-;38268:39;38298:8;38287:9;38268:39;:::i;:::-;38256:51;;38340:4;38336:9;38329:5;38325:21;38316:30;;38389:4;38379:8;38375:19;38368:5;38365:30;38355:40;;38084:317;;38008:393;;;;;:::o;38407:142::-;38457:9;38490:53;38508:34;38517:24;38535:5;38517:24;:::i;:::-;38508:34;:::i;:::-;38490:53;:::i;:::-;38477:66;;38407:142;;;:::o;38555:75::-;38598:3;38619:5;38612:12;;38555:75;;;:::o;38636:269::-;38746:39;38777:7;38746:39;:::i;:::-;38807:91;38856:41;38880:16;38856:41;:::i;:::-;38848:6;38841:4;38835:11;38807:91;:::i;:::-;38801:4;38794:105;38712:193;38636:269;;;:::o;38911:73::-;38956:3;38911:73;:::o;38990:189::-;39067:32;;:::i;:::-;39108:65;39166:6;39158;39152:4;39108:65;:::i;:::-;39043:136;38990:189;;:::o;39185:186::-;39245:120;39262:3;39255:5;39252:14;39245:120;;;39316:39;39353:1;39346:5;39316:39;:::i;:::-;39289:1;39282:5;39278:13;39269:22;;39245:120;;;39185:186;;:::o;39377:541::-;39477:2;39472:3;39469:11;39466:445;;;39511:37;39542:5;39511:37;:::i;:::-;39594:29;39612:10;39594:29;:::i;:::-;39584:8;39580:44;39777:2;39765:10;39762:18;39759:49;;;39798:8;39783:23;;39759:49;39821:80;39877:22;39895:3;39877:22;:::i;:::-;39867:8;39863:37;39850:11;39821:80;:::i;:::-;39481:430;;39466:445;39377:541;;;:::o;39924:117::-;39978:8;40028:5;40022:4;40018:16;39997:37;;39924:117;;;;:::o;40047:169::-;40091:6;40124:51;40172:1;40168:6;40160:5;40157:1;40153:13;40124:51;:::i;:::-;40120:56;40205:4;40199;40195:15;40185:25;;40098:118;40047:169;;;;:::o;40221:295::-;40297:4;40443:29;40468:3;40462:4;40443:29;:::i;:::-;40435:37;;40505:3;40502:1;40498:11;40492:4;40489:21;40481:29;;40221:295;;;;:::o;40521:1390::-;40636:36;40668:3;40636:36;:::i;:::-;40737:18;40729:6;40726:30;40723:56;;;40759:18;;:::i;:::-;40723:56;40803:38;40835:4;40829:11;40803:38;:::i;:::-;40888:66;40947:6;40939;40933:4;40888:66;:::i;:::-;40981:1;41005:4;40992:17;;41037:2;41029:6;41026:14;41054:1;41049:617;;;;41710:1;41727:6;41724:77;;;41776:9;41771:3;41767:19;41761:26;41752:35;;41724:77;41827:67;41887:6;41880:5;41827:67;:::i;:::-;41821:4;41814:81;41683:222;41019:886;;41049:617;41101:4;41097:9;41089:6;41085:22;41135:36;41166:4;41135:36;:::i;:::-;41193:1;41207:208;41221:7;41218:1;41215:14;41207:208;;;41300:9;41295:3;41291:19;41285:26;41277:6;41270:42;41351:1;41343:6;41339:14;41329:24;;41398:2;41387:9;41383:18;41370:31;;41244:4;41241:1;41237:12;41232:17;;41207:208;;;41443:6;41434:7;41431:19;41428:179;;;41501:9;41496:3;41492:19;41486:26;41544:48;41586:4;41578:6;41574:17;41563:9;41544:48;:::i;:::-;41536:6;41529:64;41451:156;41428:179;41653:1;41649;41641:6;41637:14;41633:22;41627:4;41620:36;41056:610;;;41019:886;;40611:1300;;;40521:1390;;:::o;41917:652::-;42118:4;42156:3;42145:9;42141:19;42133:27;;42170:69;42236:1;42225:9;42221:17;42212:6;42170:69;:::i;:::-;42249:70;42315:2;42304:9;42300:18;42291:6;42249:70;:::i;:::-;42329:72;42397:2;42386:9;42382:18;42373:6;42329:72;:::i;:::-;42448:9;42442:4;42438:20;42433:2;42422:9;42418:18;42411:48;42476:86;42557:4;42548:6;42540;42476:86;:::i;:::-;42468:94;;41917:652;;;;;;;;:::o;42575:222::-;42715:34;42711:1;42703:6;42699:14;42692:58;42784:5;42779:2;42771:6;42767:15;42760:30;42575:222;:::o;42803:366::-;42945:3;42966:67;43030:2;43025:3;42966:67;:::i;:::-;42959:74;;43042:93;43131:3;43042:93;:::i;:::-;43160:2;43155:3;43151:12;43144:19;;42803:366;;;:::o;43175:419::-;43341:4;43379:2;43368:9;43364:18;43356:26;;43428:9;43422:4;43418:20;43414:1;43403:9;43399:17;43392:47;43456:131;43582:4;43456:131;:::i;:::-;43448:139;;43175:419;;;:::o;43600:220::-;43740:34;43736:1;43728:6;43724:14;43717:58;43809:3;43804:2;43796:6;43792:15;43785:28;43600:220;:::o;43826:366::-;43968:3;43989:67;44053:2;44048:3;43989:67;:::i;:::-;43982:74;;44065:93;44154:3;44065:93;:::i;:::-;44183:2;44178:3;44174:12;44167:19;;43826:366;;;:::o;44198:419::-;44364:4;44402:2;44391:9;44387:18;44379:26;;44451:9;44445:4;44441:20;44437:1;44426:9;44422:17;44415:47;44479:131;44605:4;44479:131;:::i;:::-;44471:139;;44198:419;;;:::o;44623:115::-;44708:23;44725:5;44708:23;:::i;:::-;44703:3;44696:36;44623:115;;:::o;44744:652::-;44945:4;44983:3;44972:9;44968:19;44960:27;;44997:69;45063:1;45052:9;45048:17;45039:6;44997:69;:::i;:::-;45113:9;45107:4;45103:20;45098:2;45087:9;45083:18;45076:48;45141:86;45222:4;45213:6;45205;45141:86;:::i;:::-;45133:94;;45237:70;45303:2;45292:9;45288:18;45279:6;45237:70;:::i;:::-;45317:72;45385:2;45374:9;45370:18;45361:6;45317:72;:::i;:::-;44744:652;;;;;;;;:::o;45402:171::-;45542:23;45538:1;45530:6;45526:14;45519:47;45402:171;:::o;45579:366::-;45721:3;45742:67;45806:2;45801:3;45742:67;:::i;:::-;45735:74;;45818:93;45907:3;45818:93;:::i;:::-;45936:2;45931:3;45927:12;45920:19;;45579:366;;;:::o;45951:419::-;46117:4;46155:2;46144:9;46140:18;46132:26;;46204:9;46198:4;46194:20;46190:1;46179:9;46175:17;46168:47;46232:131;46358:4;46232:131;:::i;:::-;46224:139;;45951:419;;;:::o;46376:434::-;46521:4;46559:2;46548:9;46544:18;46536:26;;46572:69;46638:1;46627:9;46623:17;46614:6;46572:69;:::i;:::-;46651:70;46717:2;46706:9;46702:18;46693:6;46651:70;:::i;:::-;46731:72;46799:2;46788:9;46784:18;46775:6;46731:72;:::i;:::-;46376:434;;;;;;:::o;46816:96::-;46874:6;46902:3;46892:13;;46816:96;;;;:::o;46918:1398::-;47040:43;47079:3;47074;47040:43;:::i;:::-;47148:18;47140:6;47137:30;47134:56;;;47170:18;;:::i;:::-;47134:56;47214:38;47246:4;47240:11;47214:38;:::i;:::-;47299:66;47358:6;47350;47344:4;47299:66;:::i;:::-;47392:1;47421:2;47413:6;47410:14;47438:1;47433:631;;;;48108:1;48125:6;48122:84;;;48181:9;48176:3;48172:19;48159:33;48150:42;;48122:84;48232:67;48292:6;48285:5;48232:67;:::i;:::-;48226:4;48219:81;48081:229;47403:907;;47433:631;47485:4;47481:9;47473:6;47469:22;47519:36;47550:4;47519:36;:::i;:::-;47577:1;47591:215;47605:7;47602:1;47599:14;47591:215;;;47691:9;47686:3;47682:19;47669:33;47661:6;47654:49;47742:1;47734:6;47730:14;47720:24;;47789:2;47778:9;47774:18;47761:31;;47628:4;47625:1;47621:12;47616:17;;47591:215;;;47834:6;47825:7;47822:19;47819:186;;;47899:9;47894:3;47890:19;47877:33;47942:48;47984:4;47976:6;47972:17;47961:9;47942:48;:::i;:::-;47934:6;47927:64;47842:163;47819:186;48051:1;48047;48039:6;48035:14;48031:22;48025:4;48018:36;47440:624;;;47403:907;;47015:1301;;;46918:1398;;;:::o;48322:545::-;48495:4;48533:3;48522:9;48518:19;48510:27;;48547:69;48613:1;48602:9;48598:17;48589:6;48547:69;:::i;:::-;48626:70;48692:2;48681:9;48677:18;48668:6;48626:70;:::i;:::-;48706:72;48774:2;48763:9;48759:18;48750:6;48706:72;:::i;:::-;48788;48856:2;48845:9;48841:18;48832:6;48788:72;:::i;:::-;48322:545;;;;;;;:::o;48873:432::-;48961:5;48986:65;49002:48;49043:6;49002:48;:::i;:::-;48986:65;:::i;:::-;48977:74;;49074:6;49067:5;49060:21;49112:4;49105:5;49101:16;49150:3;49141:6;49136:3;49132:16;49129:25;49126:112;;;49157:79;;:::i;:::-;49126:112;49247:52;49292:6;49287:3;49282;49247:52;:::i;:::-;48967:338;48873:432;;;;;:::o;49324:353::-;49390:5;49439:3;49432:4;49424:6;49420:17;49416:27;49406:122;;49447:79;;:::i;:::-;49406:122;49557:6;49551:13;49582:89;49667:3;49659:6;49652:4;49644:6;49640:17;49582:89;:::i;:::-;49573:98;;49396:281;49324:353;;;;:::o;49683:522::-;49762:6;49811:2;49799:9;49790:7;49786:23;49782:32;49779:119;;;49817:79;;:::i;:::-;49779:119;49958:1;49947:9;49943:17;49937:24;49988:18;49980:6;49977:30;49974:117;;;50010:79;;:::i;:::-;49974:117;50115:73;50180:7;50171:6;50160:9;50156:22;50115:73;:::i;:::-;50105:83;;49908:290;49683:522;;;;:::o;50211:719::-;50420:4;50458:3;50447:9;50443:19;50435:27;;50472:69;50538:1;50527:9;50523:17;50514:6;50472:69;:::i;:::-;50588:9;50582:4;50578:20;50573:2;50562:9;50558:18;50551:48;50616:76;50687:4;50678:6;50616:76;:::i;:::-;50608:84;;50702:70;50768:2;50757:9;50753:18;50744:6;50702:70;:::i;:::-;50819:9;50813:4;50809:20;50804:2;50793:9;50789:18;50782:48;50847:76;50918:4;50909:6;50847:76;:::i;:::-;50839:84;;50211:719;;;;;;;:::o;50936:410::-;50976:7;50999:20;51017:1;50999:20;:::i;:::-;50994:25;;51033:20;51051:1;51033:20;:::i;:::-;51028:25;;51088:1;51085;51081:9;51110:30;51128:11;51110:30;:::i;:::-;51099:41;;51289:1;51280:7;51276:15;51273:1;51270:22;51250:1;51243:9;51223:83;51200:139;;51319:18;;:::i;:::-;51200:139;50984:362;50936:410;;;;:::o;51352:168::-;51492:20;51488:1;51480:6;51476:14;51469:44;51352:168;:::o;51526:366::-;51668:3;51689:67;51753:2;51748:3;51689:67;:::i;:::-;51682:74;;51765:93;51854:3;51765:93;:::i;:::-;51883:2;51878:3;51874:12;51867:19;;51526:366;;;:::o;51898:419::-;52064:4;52102:2;52091:9;52087:18;52079:26;;52151:9;52145:4;52141:20;52137:1;52126:9;52122:17;52115:47;52179:131;52305:4;52179:131;:::i;:::-;52171:139;;51898:419;;;:::o;52323:332::-;52444:4;52482:2;52471:9;52467:18;52459:26;;52495:71;52563:1;52552:9;52548:17;52539:6;52495:71;:::i;:::-;52576:72;52644:2;52633:9;52629:18;52620:6;52576:72;:::i;:::-;52323:332;;;;;:::o;52661:102::-;52703:8;52750:5;52747:1;52743:13;52722:34;;52661:102;;;:::o;52769:848::-;52830:5;52837:4;52861:6;52852:15;;52885:5;52876:14;;52899:712;52920:1;52910:8;52907:15;52899:712;;;53015:4;53010:3;53006:14;53000:4;52997:24;52994:50;;;53024:18;;:::i;:::-;52994:50;53074:1;53064:8;53060:16;53057:451;;;53489:4;53482:5;53478:16;53469:25;;53057:451;53539:4;53533;53529:15;53521:23;;53569:32;53592:8;53569:32;:::i;:::-;53557:44;;52899:712;;;52769:848;;;;;;;:::o;53623:1073::-;53677:5;53868:8;53858:40;;53889:1;53880:10;;53891:5;;53858:40;53917:4;53907:36;;53934:1;53925:10;;53936:5;;53907:36;54003:4;54051:1;54046:27;;;;54087:1;54082:191;;;;53996:277;;54046:27;54064:1;54055:10;;54066:5;;;54082:191;54127:3;54117:8;54114:17;54111:43;;;54134:18;;:::i;:::-;54111:43;54183:8;54180:1;54176:16;54167:25;;54218:3;54211:5;54208:14;54205:40;;;54225:18;;:::i;:::-;54205:40;54258:5;;;53996:277;;54382:2;54372:8;54369:16;54363:3;54357:4;54354:13;54350:36;54332:2;54322:8;54319:16;54314:2;54308:4;54305:12;54301:35;54285:111;54282:246;;;54438:8;54432:4;54428:19;54419:28;;54473:3;54466:5;54463:14;54460:40;;;54480:18;;:::i;:::-;54460:40;54513:5;;54282:246;54553:42;54591:3;54581:8;54575:4;54572:1;54553:42;:::i;:::-;54538:57;;;;54627:4;54622:3;54618:14;54611:5;54608:25;54605:51;;;54636:18;;:::i;:::-;54605:51;54685:4;54678:5;54674:16;54665:25;;53623:1073;;;;;;:::o;54702:281::-;54760:5;54784:23;54802:4;54784:23;:::i;:::-;54776:31;;54828:25;54844:8;54828:25;:::i;:::-;54816:37;;54872:104;54909:66;54899:8;54893:4;54872:104;:::i;:::-;54863:113;;54702:281;;;;:::o;54989:525::-;55154:4;55192:2;55181:9;55177:18;55169:26;;55205:69;55271:1;55260:9;55256:17;55247:6;55205:69;:::i;:::-;55321:9;55315:4;55311:20;55306:2;55295:9;55291:18;55284:48;55349:76;55420:4;55411:6;55349:76;:::i;:::-;55341:84;;55435:72;55503:2;55492:9;55488:18;55479:6;55435:72;:::i;:::-;54989:525;;;;;;:::o;55520:172::-;55660:24;55656:1;55648:6;55644:14;55637:48;55520:172;:::o;55698:366::-;55840:3;55861:67;55925:2;55920:3;55861:67;:::i;:::-;55854:74;;55937:93;56026:3;55937:93;:::i;:::-;56055:2;56050:3;56046:12;56039:19;;55698:366;;;:::o;56070:419::-;56236:4;56274:2;56263:9;56259:18;56251:26;;56323:9;56317:4;56313:20;56309:1;56298:9;56294:17;56287:47;56351:131;56477:4;56351:131;:::i;:::-;56343:139;;56070:419;;;:::o;56495:::-;56634:4;56672:2;56661:9;56657:18;56649:26;;56721:9;56715:4;56711:20;56707:1;56696:9;56692:17;56685:47;56749:76;56820:4;56811:6;56749:76;:::i;:::-;56741:84;;56835:72;56903:2;56892:9;56888:18;56879:6;56835:72;:::i;:::-;56495:419;;;;;:::o;56920:178::-;57060:30;57056:1;57048:6;57044:14;57037:54;56920:178;:::o;57104:366::-;57246:3;57267:67;57331:2;57326:3;57267:67;:::i;:::-;57260:74;;57343:93;57432:3;57343:93;:::i;:::-;57461:2;57456:3;57452:12;57445:19;;57104:366;;;:::o;57476:419::-;57642:4;57680:2;57669:9;57665:18;57657:26;;57729:9;57723:4;57719:20;57715:1;57704:9;57700:17;57693:47;57757:131;57883:4;57757:131;:::i;:::-;57749:139;;57476:419;;;:::o;57901:164::-;58041:16;58037:1;58029:6;58025:14;58018:40;57901:164;:::o;58071:366::-;58213:3;58234:67;58298:2;58293:3;58234:67;:::i;:::-;58227:74;;58310:93;58399:3;58310:93;:::i;:::-;58428:2;58423:3;58419:12;58412:19;;58071:366;;;:::o;58443:419::-;58609:4;58647:2;58636:9;58632:18;58624:26;;58696:9;58690:4;58686:20;58682:1;58671:9;58667:17;58660:47;58724:131;58850:4;58724:131;:::i;:::-;58716:139;;58443:419;;;:::o;58868:167::-;59008:19;59004:1;58996:6;58992:14;58985:43;58868:167;:::o;59041:366::-;59183:3;59204:67;59268:2;59263:3;59204:67;:::i;:::-;59197:74;;59280:93;59369:3;59280:93;:::i;:::-;59398:2;59393:3;59389:12;59382:19;;59041:366;;;:::o;59413:419::-;59579:4;59617:2;59606:9;59602:18;59594:26;;59666:9;59660:4;59656:20;59652:1;59641:9;59637:17;59630:47;59694:131;59820:4;59694:131;:::i;:::-;59686:139;;59413:419;;;:::o;59838:386::-;59942:3;59970:38;60002:5;59970:38;:::i;:::-;60024:88;60105:6;60100:3;60024:88;:::i;:::-;60017:95;;60121:65;60179:6;60174:3;60167:4;60160:5;60156:16;60121:65;:::i;:::-;60211:6;60206:3;60202:16;60195:23;;59946:278;59838:386;;;;:::o;60230:271::-;60360:3;60382:93;60471:3;60462:6;60382:93;:::i;:::-;60375:100;;60492:3;60485:10;;60230:271;;;;:::o;60507:917::-;60762:4;60800:3;60789:9;60785:19;60777:27;;60814:69;60880:1;60869:9;60865:17;60856:6;60814:69;:::i;:::-;60930:9;60924:4;60920:20;60915:2;60904:9;60900:18;60893:48;60958:76;61029:4;61020:6;60958:76;:::i;:::-;60950:84;;61044:70;61110:2;61099:9;61095:18;61086:6;61044:70;:::i;:::-;61161:9;61155:4;61151:20;61146:2;61135:9;61131:18;61124:48;61189:76;61260:4;61251:6;61189:76;:::i;:::-;61181:84;;61313:9;61307:4;61303:20;61297:3;61286:9;61282:19;61275:49;61341:76;61412:4;61403:6;61341:76;:::i;:::-;61333:84;;60507:917;;;;;;;;:::o;61430:225::-;61570:34;61566:1;61558:6;61554:14;61547:58;61639:8;61634:2;61626:6;61622:15;61615:33;61430:225;:::o;61661:366::-;61803:3;61824:67;61888:2;61883:3;61824:67;:::i;:::-;61817:74;;61900:93;61989:3;61900:93;:::i;:::-;62018:2;62013:3;62009:12;62002:19;;61661:366;;;:::o;62033:419::-;62199:4;62237:2;62226:9;62222:18;62214:26;;62286:9;62280:4;62276:20;62272:1;62261:9;62257:17;62250:47;62314:131;62440:4;62314:131;:::i;:::-;62306:139;;62033:419;;;:::o;62458:235::-;62598:34;62594:1;62586:6;62582:14;62575:58;62667:18;62662:2;62654:6;62650:15;62643:43;62458:235;:::o;62699:366::-;62841:3;62862:67;62926:2;62921:3;62862:67;:::i;:::-;62855:74;;62938:93;63027:3;62938:93;:::i;:::-;63056:2;63051:3;63047:12;63040:19;;62699:366;;;:::o;63071:419::-;63237:4;63275:2;63264:9;63260:18;63252:26;;63324:9;63318:4;63314:20;63310:1;63299:9;63295:17;63288:47;63352:131;63478:4;63352:131;:::i;:::-;63344:139;;63071:419;;;:::o;63496:142::-;63599:32;63625:5;63599:32;:::i;:::-;63594:3;63587:45;63496:142;;:::o;63644:1064::-;63945:4;63983:3;63972:9;63968:19;63960:27;;63997:69;64063:1;64052:9;64048:17;64039:6;63997:69;:::i;:::-;64113:9;64107:4;64103:20;64098:2;64087:9;64083:18;64076:48;64141:76;64212:4;64203:6;64141:76;:::i;:::-;64133:84;;64264:9;64258:4;64254:20;64249:2;64238:9;64234:18;64227:48;64292:76;64363:4;64354:6;64292:76;:::i;:::-;64284:84;;64378:88;64462:2;64451:9;64447:18;64438:6;64378:88;:::i;:::-;64476:73;64544:3;64533:9;64529:19;64520:6;64476:73;:::i;:::-;64597:9;64591:4;64587:20;64581:3;64570:9;64566:19;64559:49;64625:76;64696:4;64687:6;64625:76;:::i;:::-;64617:84;;63644:1064;;;;;;;;;:::o;64714:141::-;64770:5;64801:6;64795:13;64786:22;;64817:32;64843:5;64817:32;:::i;:::-;64714:141;;;;:::o;64861:832::-;64957:6;64965;64973;65022:2;65010:9;65001:7;64997:23;64993:32;64990:119;;;65028:79;;:::i;:::-;64990:119;65148:1;65173:63;65228:7;65219:6;65208:9;65204:22;65173:63;:::i;:::-;65163:73;;65119:127;65306:2;65295:9;65291:18;65285:25;65337:18;65329:6;65326:30;65323:117;;;65359:79;;:::i;:::-;65323:117;65464:73;65529:7;65520:6;65509:9;65505:22;65464:73;:::i;:::-;65454:83;;65256:291;65586:2;65612:64;65668:7;65659:6;65648:9;65644:22;65612:64;:::i;:::-;65602:74;;65557:129;64861:832;;;;;:::o;65699:176::-;65839:28;65835:1;65827:6;65823:14;65816:52;65699:176;:::o;65881:366::-;66023:3;66044:67;66108:2;66103:3;66044:67;:::i;:::-;66037:74;;66120:93;66209:3;66120:93;:::i;:::-;66238:2;66233:3;66229:12;66222:19;;65881:366;;;:::o;66253:419::-;66419:4;66457:2;66446:9;66442:18;66434:26;;66506:9;66500:4;66496:20;66492:1;66481:9;66477:17;66470:47;66534:131;66660:4;66534:131;:::i;:::-;66526:139;;66253:419;;;:::o;66678:177::-;66818:29;66814:1;66806:6;66802:14;66795:53;66678:177;:::o;66861:366::-;67003:3;67024:67;67088:2;67083:3;67024:67;:::i;:::-;67017:74;;67100:93;67189:3;67100:93;:::i;:::-;67218:2;67213:3;67209:12;67202:19;;66861:366;;;:::o;67233:419::-;67399:4;67437:2;67426:9;67422:18;67414:26;;67486:9;67480:4;67476:20;67472:1;67461:9;67457:17;67450:47;67514:131;67640:4;67514:131;:::i;:::-;67506:139;;67233:419;;;:::o;67658:182::-;67798:34;67794:1;67786:6;67782:14;67775:58;67658:182;:::o;67846:366::-;67988:3;68009:67;68073:2;68068:3;68009:67;:::i;:::-;68002:74;;68085:93;68174:3;68085:93;:::i;:::-;68203:2;68198:3;68194:12;68187:19;;67846:366;;;:::o;68218:419::-;68384:4;68422:2;68411:9;68407:18;68399:26;;68471:9;68465:4;68461:20;68457:1;68446:9;68442:17;68435:47;68499:131;68625:4;68499:131;:::i;:::-;68491:139;;68218:419;;;:::o;68643:171::-;68783:23;68779:1;68771:6;68767:14;68760:47;68643:171;:::o;68820:366::-;68962:3;68983:67;69047:2;69042:3;68983:67;:::i;:::-;68976:74;;69059:93;69148:3;69059:93;:::i;:::-;69177:2;69172:3;69168:12;69161:19;;68820:366;;;:::o;69192:419::-;69358:4;69396:2;69385:9;69381:18;69373:26;;69445:9;69439:4;69435:20;69431:1;69420:9;69416:17;69409:47;69473:131;69599:4;69473:131;:::i;:::-;69465:139;;69192:419;;;:::o;69617:178::-;69757:30;69753:1;69745:6;69741:14;69734:54;69617:178;:::o;69801:366::-;69943:3;69964:67;70028:2;70023:3;69964:67;:::i;:::-;69957:74;;70040:93;70129:3;70040:93;:::i;:::-;70158:2;70153:3;70149:12;70142:19;;69801:366;;;:::o;70173:419::-;70339:4;70377:2;70366:9;70362:18;70354:26;;70426:9;70420:4;70416:20;70412:1;70401:9;70397:17;70390:47;70454:131;70580:4;70454:131;:::i;:::-;70446:139;;70173:419;;;:::o
Swarm Source
ipfs://98e6f1e610ac931f7cb4937864df670a8147fa158b18ca51367241bd85371b55
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.