More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Trusted Remo... | 107695577 | 493 days ago | IN | 0 ETH | 0.000097407244 |
Loading...
Loading
Contract Name:
BAL
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at optimistic.etherscan.io on 2023-08-02 */ // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/IOFTReceiverV2.sol pragma solidity >=0.5.0; interface IOFTReceiverV2 { /** * @dev Called by the OFT contract when tokens are received from source chain. * @param _srcChainId The chain id of the source chain. * @param _srcAddress The address of the OFT token contract on the source chain. * @param _nonce The nonce of the transaction on the source chain. * @param _from The address of the account who calls the sendAndCall() on the source chain. * @param _amount The amount of tokens to transfer. * @param _payload Additional data with no specified format. */ function onOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/ICommonOFT.sol pragma solidity >=0.5.0; /** * @dev Interface of the IOFT core standard */ interface ICommonOFT is IERC165 { struct LzCallParams { address payable refundAddress; address zroPaymentAddress; bytes adapterParams; } /** * @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, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @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); } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/fee/IOFTWithFee.sol pragma solidity >=0.5.0; /** * @dev Interface of the IOFT core standard */ interface IOFTWithFee is ICommonOFT { /** * @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 * `_minAmount` the minimum amount of tokens to receive on dstChain * `_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, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) external payable; function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable; } // File: @layerzerolabs/solidity-examples/contracts/util/ExcessivelySafeCall.sol 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) } } } // File: @layerzerolabs/solidity-examples/contracts/util/BytesLib.sol /* * @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; } } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroUserApplicationConfig.sol 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; } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; 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); } // File: @layerzerolabs/solidity-examples/contracts/interfaces/ILayerZeroReceiver.sol 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; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/fee/Fee.sol pragma solidity ^0.8.0; abstract contract Fee is Ownable { uint public constant BP_DENOMINATOR = 10000; mapping(uint16 => FeeConfig) public chainIdToFeeBps; uint16 public defaultFeeBp; address public feeOwner; // defaults to owner struct FeeConfig { uint16 feeBP; bool enabled; } event SetFeeBp(uint16 dstchainId, bool enabled, uint16 feeBp); event SetDefaultFeeBp(uint16 feeBp); event SetFeeOwner(address feeOwner); constructor(){ feeOwner = owner(); } function setDefaultFeeBp(uint16 _feeBp) public virtual onlyOwner { require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); defaultFeeBp = _feeBp; emit SetDefaultFeeBp(defaultFeeBp); } function setFeeBp(uint16 _dstChainId, bool _enabled, uint16 _feeBp) public virtual onlyOwner { require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); chainIdToFeeBps[_dstChainId] = FeeConfig(_feeBp, _enabled); emit SetFeeBp(_dstChainId, _enabled, _feeBp); } function setFeeOwner(address _feeOwner) public virtual onlyOwner { require(_feeOwner != address(0x0), "Fee: feeOwner cannot be 0x"); feeOwner = _feeOwner; emit SetFeeOwner(_feeOwner); } function quoteOFTFee(uint16 _dstChainId, uint _amount) public virtual view returns (uint fee) { FeeConfig memory config = chainIdToFeeBps[_dstChainId]; if (config.enabled) { fee = _amount * config.feeBP / BP_DENOMINATOR; } else if (defaultFeeBp > 0) { fee = _amount * defaultFeeBp / BP_DENOMINATOR; } else { fee = 0; } } function _payOFTFee(address _from, uint16 _dstChainId, uint _amount) internal virtual returns (uint amount, uint fee) { fee = quoteOFTFee(_dstChainId, _amount); amount = _amount - fee; if (fee > 0) { _transferFrom(_from, feeOwner, fee); } } function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint); } // File: @layerzerolabs/solidity-examples/contracts/lzApp/LzApp.sol pragma solidity ^0.8.0; /* * 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) { 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); } } // File: @layerzerolabs/solidity-examples/contracts/lzApp/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * 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); } } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/OFTCoreV2.sol pragma solidity ^0.8.0; abstract contract OFTCoreV2 is NonblockingLzApp { using BytesLib for bytes; using ExcessivelySafeCall for address; uint public constant NO_EXTRA_GAS = 0; // packet type uint8 public constant PT_SEND = 0; uint8 public constant PT_SEND_AND_CALL = 1; uint8 public immutable sharedDecimals; bool public useCustomAdapterParams; mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets; /** * @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, bytes32 indexed _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); event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash); event NonContractAddress(address _address); // _sharedDecimals should be the minimum decimals on all chains constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) { sharedDecimals = _sharedDecimals; } /************************************************************************ * public functions ************************************************************************/ function callOnOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, address _to, uint _amount, bytes calldata _payload, uint _gasForCall) public virtual { require(_msgSender() == address(this), "OFTCore: caller must be OFTCore"); // send _amount = _transferFrom(address(this), _to, _amount); emit ReceiveFromChain(_srcChainId, _to, _amount); // call IOFTReceiverV2(_to).onOFTReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } /************************************************************************ * internal functions ************************************************************************/ function _estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes memory _adapterParams) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount)); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, bool _useZro, bytes memory _adapterParams) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendAndCall() bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { uint8 packetType = _payload.toUint8(0); if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else if (packetType == PT_SEND_AND_CALL) { _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("OFTCore: unknown packet type"); } } function _send(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual returns (uint amount) { _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); (amount,) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust require(amount > 0, "OFTCore: amount too small"); bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAck(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual { (address to, uint64 amountSD) = _decodeSendPayload(_payload); if (to == address(0)) { to = address(0xdead); } uint amount = _sd2ld(amountSD); amount = _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, to, amount); } function _sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual returns (uint amount) { _checkAdapterParams(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); (amount,) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); require(amount > 0, "OFTCore: amount too small"); // encode the msg.sender into the payload instead of _from bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAndCallAck(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual { (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload); bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce]; uint amount = _sd2ld(amountSD); // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds if (!credited) { amount = _creditTo(_srcChainId, address(this), amount); creditedPackets[_srcChainId][_srcAddress][_nonce] = true; } if (!_isContract(to)) { emit NonContractAddress(to); return; } // workaround for stack too deep uint16 srcChainId = _srcChainId; bytes memory srcAddress = _srcAddress; uint64 nonce = _nonce; bytes memory payload = _payload; bytes32 from_ = from; address to_ = to; uint amount_ = amount; bytes memory payloadForCall_ = payloadForCall; // no gas limit for the call if retry uint gas = credited ? gasleft() : gasForCall; (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.callOnOFTReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas)); if (success) { bytes32 hash = keccak256(payload); emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash); } else { // store the failed message into the nonblockingLzApp _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason); } } function _isContract(address _account) internal view returns (bool) { return _account.code.length > 0; } 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 _ld2sd(uint _amount) internal virtual view returns (uint64) { uint amountSD = _amount / _ld2sdRate(); require(amountSD <= type(uint64).max, "OFTCore: amountSD overflow"); return uint64(amountSD); } function _sd2ld(uint64 _amountSD) internal virtual view returns (uint) { return _amountSD * _ld2sdRate(); } function _removeDust(uint _amount) internal virtual view returns (uint amountAfter, uint dust) { dust = _amount % _ld2sdRate(); amountAfter = _amount - dust; } function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal virtual view returns (bytes memory) { return abi.encodePacked(PT_SEND, _toAddress, _amountSD); } function _decodeSendPayload(bytes memory _payload) internal virtual view returns (address to, uint64 amountSD) { require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "OFTCore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); } function _encodeSendAndCallPayload(address _from, bytes32 _toAddress, uint64 _amountSD, bytes memory _payload, uint64 _dstGasForCall) internal virtual view returns (bytes memory) { return abi.encodePacked( PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload ); } function _decodeSendAndCallPayload(bytes memory _payload) internal virtual view returns (bytes32 from, address to, uint64 amountSD, bytes memory payload, uint64 dstGasForCall) { require(_payload.toUint8(0) == PT_SEND_AND_CALL, "OFTCore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); from = _payload.toBytes32(41); dstGasForCall = _payload.toUint64(73); payload = _payload.slice(81, _payload.length - 81); } function _addressToBytes32(address _address) internal pure virtual returns (bytes32) { return bytes32(uint(uint160(_address))); } function _debitFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount) internal virtual returns (uint); function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual returns (uint); function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint); function _ld2sdRate() internal view virtual returns (uint); } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/fee/BaseOFTWithFee.sol pragma solidity ^0.8.0; abstract contract BaseOFTWithFee is OFTCoreV2, Fee, ERC165, IOFTWithFee { constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) { } /************************************************************************ * public functions ************************************************************************/ function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) public payable virtual override { (_amount,) = _payOFTFee(_from, _dstChainId, _amount); _amount = _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); } function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) public payable virtual override { (_amount,) = _payOFTFee(_from, _dstChainId, _amount); _amount = _sendAndCall(_from, _dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); } /************************************************************************ * public view functions ************************************************************************/ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IOFTWithFee).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams); } function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams); } function circulatingSupply() public view virtual override returns (uint); function token() public view virtual override returns (address); function _transferFrom(address _from, address _to, uint _amount) internal virtual override (Fee, OFTCoreV2) returns (uint); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * 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}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @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 override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override 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 `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` 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 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); 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 `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); 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 * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `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. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` 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 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: @layerzerolabs/solidity-examples/contracts/token/oft/v2/fee/OFTWithFee.sol pragma solidity ^0.8.0; contract OFTWithFee is BaseOFTWithFee, ERC20 { uint internal immutable ld2sdRate; constructor(string memory _name, string memory _symbol, uint8 _sharedDecimals, address _lzEndpoint) ERC20(_name, _symbol) BaseOFTWithFee(_sharedDecimals, _lzEndpoint) { uint8 decimals = decimals(); require(_sharedDecimals <= decimals, "OFTWithFee: sharedDecimals must be <= decimals"); ld2sdRate = 10 ** (decimals - _sharedDecimals); } /************************************************************************ * public functions ************************************************************************/ function circulatingSupply() public view virtual override returns (uint) { return totalSupply(); } function token() public view virtual override returns (address) { return address(this); } /************************************************************************ * internal functions ************************************************************************/ function _debitFrom(address _from, uint16, bytes32, 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; } function _transferFrom(address _from, address _to, uint _amount) internal virtual override returns (uint) { address spender = _msgSender(); // if transfer from this contract, no need to check allowance if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount); _transfer(_from, _to, _amount); return _amount; } function _ld2sdRate() internal view virtual override returns (uint) { return ld2sdRate; } } // File: Avax/Copy_0xE15bCB9E0EA69e6aB9FA080c4c4A5632896298C3/contracts/BAL.sol pragma solidity ^0.8.0; contract BAL is OFTWithFee { constructor(address _layerZeroEndpoint) OFTWithFee("Balancer", "BAL", 6, _layerZeroEndpoint) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"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":"_hash","type":"bytes32"}],"name":"CallOFTReceivedSuccess","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":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","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":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":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"feeBp","type":"uint16"}],"name":"SetDefaultFeeBp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"dstchainId","type":"uint16"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint16","name":"feeBp","type":"uint16"}],"name":"SetFeeBp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeOwner","type":"address"}],"name":"SetFeeOwner","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":"BP_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"amount","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":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnOFTReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToFeeBps","outputs":[{"internalType":"uint16","name":"feeBP","type":"uint16"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"creditedPackets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultFeeBp","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","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":"bytes32","name":"_toAddress","type":"bytes32"},{"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":"","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":"feeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"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":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"quoteOFTFee","outputs":[{"internalType":"uint256","name":"fee","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":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"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":"uint16","name":"_feeBp","type":"uint16"}],"name":"setDefaultFeeBp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint16","name":"_feeBp","type":"uint16"}],"name":"setFeeBp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeOwner","type":"address"}],"name":"setFeeOwner","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":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"amount","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":"amount","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"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162004eaa38038062004eaa833981016040819052620000349162000211565b604051806040016040528060088152602001672130b630b731b2b960c11b8152506040518060400160405280600381526020016210905360ea1b81525060068383838383818180806200009662000090620001b860201b60201c565b620001bc565b6001600160a01b0316608052505060ff1660a052620000bd6000546001600160a01b031690565b600980546001600160a01b0392909216620100000262010000600160b01b031990921691909117905550600d9050620000f78382620002e8565b50600e620001068282620002e8565b50505060006200011b6200020c60201b60201c565b90508060ff168360ff1611156200018f5760405162461bcd60e51b815260206004820152602e60248201527f4f4654576974684665653a20736861726564446563696d616c73206d7573742060448201526d6265203c3d20646563696d616c7360901b606482015260840160405180910390fd5b6200019b8382620003ca565b620001a890600a620004e9565b60c05250620004fa945050505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b6000602082840312156200022457600080fd5b81516001600160a01b03811681146200023c57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200026e57607f821691505b6020821081036200028f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e357600081815260208120601f850160051c81016020861015620002be5750805b601f850160051c820191505b81811015620002df57828155600101620002ca565b5050505b505050565b81516001600160401b0381111562000304576200030462000243565b6200031c8162000315845462000259565b8462000295565b602080601f8311600181146200035457600084156200033b5750858301515b600019600386901b1c1916600185901b178555620002df565b600085815260208120601f198616915b82811015620003855788860151825594840194600190910190840162000364565b5085821015620003a45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115620003e657620003e6620003b4565b92915050565b600181815b808511156200042d578160001904821115620004115762000411620003b4565b808516156200041f57918102915b93841c9390800290620003f1565b509250929050565b6000826200044657506001620003e6565b816200045557506000620003e6565b81600181146200046e5760028114620004795762000499565b6001915050620003e6565b60ff8411156200048d576200048d620003b4565b50506001821b620003e6565b5060208310610133831016604e8410600b8410161715620004be575081810a620003e6565b620004ca8383620003ec565b8060001904821115620004e157620004e1620003b4565b029392505050565b60006200023c60ff84168362000435565b60805160a05160c0516149336200057760003960008181612c7f01528181612cf1015261355f0152600061074801526000818161093801528181610b9c01528181610eb401528181610f74015281816111d4015281816119c70152818161202301528181612658015281816129f10152612e9801526149336000f3fe60806040526004361061038b5760003560e01c80638da5cb5b116101dc578063c83330ce11610102578063eab45d9c116100a0578063ed629c5c1161006f578063ed629c5c14610b2c578063f2fde38b14610b46578063f5ecbdbc14610b66578063fc0c546a14610b8657600080fd5b8063eab45d9c14610aac578063eaffd49a14610acc578063eb8d72b714610aec578063ecd8f21214610b0c57600080fd5b8063d8882968116100dc578063d888296814610a29578063dd62ed3e14610a57578063df2a5b3b14610a77578063e6a20ae614610a9757600080fd5b8063c83330ce146109a0578063cbed8b9c146109f6578063d1deba1f14610a1657600080fd5b8063a4c51df51161017a578063b353aaa711610149578063b353aaa714610926578063b9818be11461095a578063baf3292d14610980578063c44618341461091057600080fd5b8063a4c51df5146108b0578063a6c3d165146108d0578063a9059cbb146108f0578063abe685cd1461091057600080fd5b806395d89b41116101b657806395d89b41146108095780639bdb98121461081e5780639f38369a14610870578063a457c2d71461089057600080fd5b80638da5cb5b146107a25780639358928b146107d4578063950c8a74146107e957600080fd5b80633f1f4fa4116102c15780635b8c41e61161025f5780637533d7881161022e5780637533d788146106f657806379c0ad4b14610716578063857749b0146107365780638cfd8f5c1461076a57600080fd5b80635b8c41e61461063c57806366ad5c8a1461068b57806370a08231146106ab578063715018a6146106e157600080fd5b8063455ba27d1161029b578063455ba27d146105d45780634b104eff146105e75780634c42899a146106075780635a359dc51461061c57600080fd5b80633f1f4fa41461057257806342d65a8d1461059f57806344770515146105bf57600080fd5b806318160ddd1161032e578063313ce56711610308578063313ce567146104db578063365260b4146104fd57806339509351146105325780633d8b38f61461055257600080fd5b806318160ddd1461048957806323b872dd146104a85780632cdf0b95146104c857600080fd5b806307e0db171161036a57806307e0db1714610409578063095ea7b3146104295780630df374831461044957806310ddb1371461046957600080fd5b80621d35671461039057806301ffc9a7146103b257806306fdde03146103e7575b600080fd5b34801561039c57600080fd5b506103b06103ab366004613903565b610b99565b005b3480156103be57600080fd5b506103d26103cd366004613996565b610dca565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc610e01565b6040516103de9190613a10565b34801561041557600080fd5b506103b0610424366004613a23565b610e93565b34801561043557600080fd5b506103d2610444366004613a53565b610f1c565b34801561045557600080fd5b506103b0610464366004613a7f565b610f34565b34801561047557600080fd5b506103b0610484366004613a23565b610f53565b34801561049557600080fd5b50600c545b6040519081526020016103de565b3480156104b457600080fd5b506103d26104c3366004613a9b565b610fab565b6103b06104d6366004613af4565b610fcf565b3480156104e757600080fd5b5060125b60405160ff90911681526020016103de565b34801561050957600080fd5b5061051d610518366004613b7f565b611072565b604080519283526020830191909152016103de565b34801561053e57600080fd5b506103d261054d366004613a53565b6110c7565b34801561055e57600080fd5b506103d261056d366004613be4565b6110e9565b34801561057e57600080fd5b5061049a61058d366004613a23565b60036020526000908152604090205481565b3480156105ab57600080fd5b506103b06105ba366004613be4565b6111b5565b3480156105cb57600080fd5b5061049a600081565b6103b06105e2366004613c36565b61123b565b3480156105f357600080fd5b506103b0610602366004613cf2565b61131c565b34801561061357600080fd5b506104eb600081565b34801561062857600080fd5b506103b0610637366004613a23565b6113d9565b34801561064857600080fd5b5061049a610657366004613d7c565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561069757600080fd5b506103b06106a6366004613903565b61144b565b3480156106b757600080fd5b5061049a6106c6366004613cf2565b6001600160a01b03166000908152600a602052604090205490565b3480156106ed57600080fd5b506103b061151f565b34801561070257600080fd5b506103fc610711366004613a23565b611533565b34801561072257600080fd5b506103b0610731366004613e1c565b6115cd565b34801561074257600080fd5b506104eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561077657600080fd5b5061049a610785366004613e56565b600260209081526000928352604080842090915290825290205481565b3480156107ae57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103de565b3480156107e057600080fd5b5061049a611689565b3480156107f557600080fd5b506004546107bc906001600160a01b031681565b34801561081557600080fd5b506103fc611699565b34801561082a57600080fd5b506103d2610839366004613d7c565b6007602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561087c57600080fd5b506103fc61088b366004613a23565b6116a8565b34801561089c57600080fd5b506103d26108ab366004613a53565b6117be565b3480156108bc57600080fd5b5061051d6108cb366004613e89565b611839565b3480156108dc57600080fd5b506103b06108eb366004613be4565b6118c8565b3480156108fc57600080fd5b506103d261090b366004613a53565b611944565b34801561091c57600080fd5b5061049a61271081565b34801561093257600080fd5b506107bc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561096657600080fd5b506009546107bc906201000090046001600160a01b031681565b34801561098c57600080fd5b506103b061099b366004613cf2565b611952565b3480156109ac57600080fd5b506109dc6109bb366004613a23565b60086020526000908152604090205461ffff81169062010000900460ff1682565b6040805161ffff90931683529015156020830152016103de565b348015610a0257600080fd5b506103b0610a11366004613f42565b6119a8565b6103b0610a24366004613903565b611a32565b348015610a3557600080fd5b50600954610a449061ffff1681565b60405161ffff90911681526020016103de565b348015610a6357600080fd5b5061049a610a72366004613fb0565b611c48565b348015610a8357600080fd5b506103b0610a92366004613fe9565b611c73565b348015610aa357600080fd5b506104eb600181565b348015610ab857600080fd5b506103b0610ac7366004614025565b611d25565b348015610ad857600080fd5b506103b0610ae7366004614040565b611d6e565b348015610af857600080fd5b506103b0610b07366004613be4565b611e8d565b348015610b1857600080fd5b5061049a610b27366004613a7f565b611ee7565b348015610b3857600080fd5b506006546103d29060ff1681565b348015610b5257600080fd5b506103b0610b61366004613cf2565b611f79565b348015610b7257600080fd5b506103fc610b81366004614108565b611ff2565b348015610b9257600080fd5b50306107bc565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610c165760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610c3490614155565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6090614155565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b50505050509050805186869050148015610cc8575060008151115b8015610cf0575080516020820120604051610ce69088908890614189565b6040518091039020145b610d4b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610c0d565b610dc18787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506120a392505050565b50505050505050565b60006001600160e01b03198216630d30953d60e31b1480610dfb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600d8054610e1090614155565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614155565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b610e9b61211c565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610f0157600080fd5b505af1158015610f15573d6000803e3d6000fd5b5050505050565b600033610f2a818585612176565b5060019392505050565b610f3c61211c565b61ffff909116600090815260036020526040902055565b610f5b61211c565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610ee7565b600033610fb985828561229a565b610fc4858585612314565b506001949350505050565b610fda8686856124bf565b50925061104886868686610ff16020870187613cf2565b6110016040880160208901613cf2565b61100e6040890189614199565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061250892505050565b92508183101561106a5760405162461bcd60e51b8152600401610c0d906141df565b505050505050565b6000806110b88888888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061262c92505050565b91509150965096945050505050565b600033610f2a8185856110da8383611c48565b6110e49190614242565b612176565b61ffff83166000908152600160205260408120805482919061110a90614155565b80601f016020809104026020016040519081016040528092919081815260200182805461113690614155565b80156111835780601f1061115857610100808354040283529160200191611183565b820191906000526020600020905b81548152906001019060200180831161116657829003601f168201915b50505050509050838360405161119a929190614189565b60405180910390208180519060200120149150509392505050565b6111bd61211c565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061120d9086908690869060040161427e565b600060405180830381600087803b15801561122757600080fd5b505af1158015610dc1573d6000803e3d6000fd5b6112468989886124bf565b50809650506112ef8989898988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506112989150506020890189613cf2565b6112a860408a0160208b01613cf2565b6112b560408b018b614199565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126e492505050565b9550848610156113115760405162461bcd60e51b8152600401610c0d906141df565b505050505050505050565b61132461211c565b6001600160a01b03811661137a5760405162461bcd60e51b815260206004820152601a60248201527f4665653a206665654f776e65722063616e6e6f742062652030780000000000006044820152606401610c0d565b6009805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f047912631afa564eebd3db2efe191a0dec62da1fede6bbbc1ffc89d87845b1b5906020015b60405180910390a150565b6113e161211c565b6127108161ffff1611156114075760405162461bcd60e51b8152600401610c0d9061429c565b6009805461ffff191661ffff83169081179091556040519081527fd26030ef4a8c225ee12b646eb4466acb41fb96b6cd4660b22d0ba0124e7bdc74906020016113ce565b3330146114a95760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610c0d565b61106a8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284376000920191909152506127e092505050565b61152761211c565b6115316000612867565b565b6001602052600090815260409020805461154c90614155565b80601f016020809104026020016040519081016040528092919081815260200182805461157890614155565b80156115c55780601f1061159a576101008083540402835291602001916115c5565b820191906000526020600020905b8154815290600101906020018083116115a857829003601f168201915b505050505081565b6115d561211c565b6127108161ffff1611156115fb5760405162461bcd60e51b8152600401610c0d9061429c565b60408051808201825261ffff83811680835285151560208085018281528985166000818152600884528890209651875492511515620100000262ffffff1990931696169590951717909455845192835292820192909252918201527fdd9c9685af3e6dcb56d8f4b88d2595d4add6837a150034e7781c46b6dcf8aaab906060015b60405180910390a1505050565b6000611694600c5490565b905090565b6060600e8054610e1090614155565b61ffff81166000908152600160205260408120805460609291906116cb90614155565b80601f01602080910402602001604051908101604052809291908181526020018280546116f790614155565b80156117445780601f1061171957610100808354040283529160200191611744565b820191906000526020600020905b81548152906001019060200180831161172757829003601f168201915b50505050509050805160000361179c5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610c0d565b6117b76000601483516117af91906142e1565b8391906128b7565b9392505050565b600033816117cc8286611c48565b90508381101561182c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c0d565b610fc48286868403612176565b6000806118b68b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152506129c492505050565b91509150995099975050505050505050565b6118d061211c565b8181306040516020016118e5939291906142f4565b60408051601f1981840301815291815261ffff85166000908152600160205220906119109082614360565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161167c9392919061427e565b600033610f2a818585612314565b61195a61211c565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b906020016113ce565b6119b061211c565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611a04908890889088908890889060040161441f565b600060405180830381600087803b158015611a1e57600080fd5b505af1158015611311573d6000803e3d6000fd5b61ffff86166000908152600560205260408082209051611a559088908890614189565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611ad55760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610c0d565b808383604051611ae6929190614189565b604051809103902014611b455760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610c0d565b61ffff87166000908152600560205260408082209051611b689089908990614189565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611c00918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506127e092505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611c37959493929190614458565b60405180910390a150505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b611c7b61211c565b60008111611cc35760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610c0d565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161167c565b611d2d61211c565b6006805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a4906020016113ce565b333014611dbd5760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610c0d565b611dc8308686612a7f565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e0a91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611e4e908e908e908e908e908e908d908d908d90600401614493565b600060405180830381600088803b158015611e6857600080fd5b5087f1158015611e7c573d6000803e3d6000fd5b505050505050505050505050505050565b611e9561211c565b61ffff83166000908152600160205260409020611eb38284836144ee565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161167c9392919061427e565b61ffff828116600090815260086020908152604080832081518083019092525493841681526201000090930460ff1615801591840191909152909190611f4c57805161271090611f3b9061ffff16856145ad565b611f4591906145da565b9150611f72565b60095461ffff1615611f6d5760095461271090611f3b9061ffff16856145ad565b600091505b5092915050565b611f8161211c565b6001600160a01b038116611fe65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b611fef81612867565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612072573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261209a91908101906145ee565b95945050505050565b6000806121065a60966366ad5c8a60e01b898989896040516024016120cb949392919061465b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612ad1565b915091508161106a5761106a8686868685612b5b565b6000546001600160a01b031633146115315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b6001600160a01b0383166121d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c0d565b6001600160a01b0382166122395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c0d565b6001600160a01b038381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006122a68484611c48565b9050600019811461230e57818110156123015760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c0d565b61230e8484848403612176565b50505050565b6001600160a01b0383166123785760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c0d565b6001600160a01b0382166123da5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c0d565b6001600160a01b0383166000908152600a6020526040902054818110156124525760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c0d565b6001600160a01b038085166000818152600a602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124b29086815260200190565b60405180910390a361230e565b6000806124cc8484611ee7565b90506124d881846142e1565b91508015612500576009546124fe9086906201000090046001600160a01b031683612a7f565b505b935093915050565b600061251687828481612bfd565b61251f85612c77565b50905061252e88888884612cb7565b90506000811161257c5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610c0d565b60006125c78761258b84612ce9565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b90506125d7888287878734612d6f565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161261891815260200190565b60405180910390a450979650505050505050565b600080600061263e8761258b88612ce9565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612695908b90309086908b908b90600401614699565b6040805180830381865afa1580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d591906146ed565b92509250509550959350505050565b60006126fc896001846001600160401b038916612bfd565b61270587612c77565b5090506127148a8a8a84612cb7565b9050600081116127625760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610c0d565b6000612779338a61277285612ce9565b8a8a612f14565b90506127898a8287878734612d6f565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a856040516127ca91815260200190565b60405180910390a4509998505050505050505050565b60006127ec8282612f55565b905060ff81166128075761280285858585612fb1565b610f15565b60001960ff82160161281f5761280285858585613041565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610c0d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816128c581601f614242565b10156129045760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610c0d565b61290e8284614242565b845110156129525760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610c0d565b60608215801561297157604051915060008252602082016040526129bb565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156129aa578051835260209283019201612992565b5050858452601f01601f1916604052505b50949350505050565b60008060006129d7338a6127728b612ce9565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612a2e908d90309086908b908b90600401614699565b6040805180830381865afa158015612a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6e91906146ed565b925092505097509795505050505050565b600033306001600160a01b03861614801590612aad5750806001600160a01b0316856001600160a01b031614155b15612abd57612abd85828561229a565b612ac8858585612314565b50909392505050565b6000606060008060008661ffff166001600160401b03811115612af657612af6613d0f565b6040519080825280601f01601f191660200182016040528015612b20576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115612b42578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612b8c9190614711565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612be9908790879087908790879061472d565b60405180910390a15050505050565b505050565b60065460ff1615612c1957612c148484848461324f565b61230e565b81511561230e5760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608401610c0d565b600080612ca47f00000000000000000000000000000000000000000000000000000000000000008461477f565b9050612cb081846142e1565b9150915091565b6000336001600160a01b0386168114612cd557612cd586828561229a565b612cdf868461332e565b5090949350505050565b600080612d167f0000000000000000000000000000000000000000000000000000000000000000846145da565b90506001600160401b03811115610dfb5760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610c0d565b61ffff861660009081526001602052604081208054612d8d90614155565b80601f0160208091040260200160405190810160405280929190818152602001828054612db990614155565b8015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b505050505090508051600003612e775760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610c0d565b612e82878751613462565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490612ed9908b9086908c908c908c908c90600401614793565b6000604051808303818588803b158015612ef257600080fd5b505af1158015612f06573d6000803e3d6000fd5b505050505050505050505050565b6060600185856001600160a01b0389168587604051602001612f3b969594939291906147fa565b604051602081830303815290604052905095945050505050565b6000612f62826001614242565b83511015612fa85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610c0d565b50016001015190565b600080612fbd836134d3565b90925090506001600160a01b038216612fd65761dead91505b6000612fe182613558565b9050612fee87848361358d565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161303091815260200190565b60405180910390a350505050505050565b600080600080600061305286613599565b945094509450945094506000600760008b61ffff1661ffff168152602001908152602001600020896040516130879190614711565b90815260408051602092819003830190206001600160401b038b166000908152925281205460ff1691506130ba85613558565b905081613128576130cc8b308361358d565b61ffff8c166000908152600760205260409081902090519192506001916130f4908d90614711565b90815260408051602092819003830190206001600160401b038d16600090815292529020805460ff19169115159190911790555b6001600160a01b0386163b61317f576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a15050505050505061230e565b8a8a8a8a8a8a868a60008a61319d578b6001600160401b031661319f565b5a5b90506000806131d15a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120cb98979695949392919061485b565b91509150811561322a578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd8849061321c908e908e9086906148cf565b60405180910390a250613237565b6132378b8b8b8b85612b5b565b50505050505050505050505050505050505050505050565b600061325a83613650565b61ffff80871660009081526002602090815260408083209389168352929052908120549192509061328c908490614242565b9050600081116132de5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610c0d565b8082101561106a5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610c0d565b6001600160a01b03821661338e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c0d565b6001600160a01b0382166000908152600a6020526040902054818110156134025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c0d565b6001600160a01b0383166000818152600a602090815260408083208686039055600c80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82166000908152600360205260408120549081900361348357506127105b80821115612bf85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610c0d565b600080806134e18482612f55565b60ff161480156134f2575082516029145b6135395760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610c0d565b61354483600d6136ac565b9150613551836021613711565b9050915091565b6000610dfb7f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166145ad565b6000611f72838361376e565b6000808060608160016135ac8783612f55565b60ff16146135f75760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610c0d565b61360286600d6136ac565b935061360f866021613711565b925061361c86602961382f565b9450613629866049613711565b9050613645605180885161363d91906142e1565b8891906128b7565b915091939590929450565b60006022825110156136a45760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610c0d565b506022015190565b60006136b9826014614242565b835110156137015760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610c0d565b500160200151600160601b900490565b600061371e826008614242565b835110156137655760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610c0d565b50016008015190565b6001600160a01b0382166137c45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c0d565b80600c60008282546137d69190614242565b90915550506001600160a01b0382166000818152600a60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600061383c826020614242565b835110156138845760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610c0d565b50016020015190565b803561ffff8116811461389f57600080fd5b919050565b60008083601f8401126138b657600080fd5b5081356001600160401b038111156138cd57600080fd5b6020830191508360208285010111156138e557600080fd5b9250929050565b80356001600160401b038116811461389f57600080fd5b6000806000806000806080878903121561391c57600080fd5b6139258761388d565b955060208701356001600160401b038082111561394157600080fd5b61394d8a838b016138a4565b909750955085915061396160408a016138ec565b9450606089013591508082111561397757600080fd5b5061398489828a016138a4565b979a9699509497509295939492505050565b6000602082840312156139a857600080fd5b81356001600160e01b0319811681146117b757600080fd5b60005b838110156139db5781810151838201526020016139c3565b50506000910152565b600081518084526139fc8160208601602086016139c0565b601f01601f19169290920160200192915050565b6020815260006117b760208301846139e4565b600060208284031215613a3557600080fd5b6117b78261388d565b6001600160a01b0381168114611fef57600080fd5b60008060408385031215613a6657600080fd5b8235613a7181613a3e565b946020939093013593505050565b60008060408385031215613a9257600080fd5b613a718361388d565b600080600060608486031215613ab057600080fd5b8335613abb81613a3e565b92506020840135613acb81613a3e565b929592945050506040919091013590565b600060608284031215613aee57600080fd5b50919050565b60008060008060008060c08789031215613b0d57600080fd5b8635613b1881613a3e565b9550613b266020880161388d565b945060408701359350606087013592506080870135915060a08701356001600160401b03811115613b5657600080fd5b613b6289828a01613adc565b9150509295509295509295565b8035801515811461389f57600080fd5b60008060008060008060a08789031215613b9857600080fd5b613ba18761388d565b95506020870135945060408701359350613bbd60608801613b6f565b925060808701356001600160401b03811115613bd857600080fd5b61398489828a016138a4565b600080600060408486031215613bf957600080fd5b613c028461388d565b925060208401356001600160401b03811115613c1d57600080fd5b613c29868287016138a4565b9497909650939450505050565b60008060008060008060008060006101008a8c031215613c5557600080fd5b8935613c6081613a3e565b9850613c6e60208b0161388d565b975060408a0135965060608a0135955060808a0135945060a08a01356001600160401b0380821115613c9f57600080fd5b613cab8d838e016138a4565b9096509450849150613cbf60c08d016138ec565b935060e08c0135915080821115613cd557600080fd5b50613ce28c828d01613adc565b9150509295985092959850929598565b600060208284031215613d0457600080fd5b81356117b781613a3e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4d57613d4d613d0f565b604052919050565b60006001600160401b03821115613d6e57613d6e613d0f565b50601f01601f191660200190565b600080600060608486031215613d9157600080fd5b613d9a8461388d565b925060208401356001600160401b03811115613db557600080fd5b8401601f81018613613dc657600080fd5b8035613dd9613dd482613d55565b613d25565b818152876020838501011115613dee57600080fd5b81602084016020830137600060208383010152809450505050613e13604085016138ec565b90509250925092565b600080600060608486031215613e3157600080fd5b613e3a8461388d565b9250613e4860208501613b6f565b9150613e136040850161388d565b60008060408385031215613e6957600080fd5b613e728361388d565b9150613e806020840161388d565b90509250929050565b600080600080600080600080600060e08a8c031215613ea757600080fd5b613eb08a61388d565b985060208a0135975060408a0135965060608a01356001600160401b0380821115613eda57600080fd5b613ee68d838e016138a4565b9098509650869150613efa60808d016138ec565b9550613f0860a08d01613b6f565b945060c08c0135915080821115613f1e57600080fd5b50613f2b8c828d016138a4565b915080935050809150509295985092959850929598565b600080600080600060808688031215613f5a57600080fd5b613f638661388d565b9450613f716020870161388d565b93506040860135925060608601356001600160401b03811115613f9357600080fd5b613f9f888289016138a4565b969995985093965092949392505050565b60008060408385031215613fc357600080fd5b8235613fce81613a3e565b91506020830135613fde81613a3e565b809150509250929050565b600080600060608486031215613ffe57600080fd5b6140078461388d565b92506140156020850161388d565b9150604084013590509250925092565b60006020828403121561403757600080fd5b6117b782613b6f565b6000806000806000806000806000806101008b8d03121561406057600080fd5b6140698b61388d565b995060208b01356001600160401b038082111561408557600080fd5b6140918e838f016138a4565b909b5099508991506140a560408e016138ec565b985060608d0135975060808d013591506140be82613a3e565b90955060a08c0135945060c08c013590808211156140db57600080fd5b506140e88d828e016138a4565b9150809450508092505060e08b013590509295989b9194979a5092959850565b6000806000806080858703121561411e57600080fd5b6141278561388d565b93506141356020860161388d565b9250604085013561414581613a3e565b9396929550929360600135925050565b600181811c9082168061416957607f821691505b602082108103613aee57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6000808335601e198436030181126141b057600080fd5b8301803591506001600160401b038211156141ca57600080fd5b6020019150368190038213156138e557600080fd5b6020808252602d908201527f426173654f4654576974684665653a20616d6f756e74206973206c657373207460408201526c1a185b881b5a5b905b5bdd5b9d609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610dfb57610dfb61422c565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff8416815260406020820152600061209a604083018486614255565b60208082526025908201527f4665653a20666565206270206d757374206265203c3d2042505f44454e4f4d496040820152642720aa27a960d91b606082015260800190565b81810381811115610dfb57610dfb61422c565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115612bf857600081815260208120601f850160051c810160208610156143415750805b601f850160051c820191505b8181101561106a5782815560010161434d565b81516001600160401b0381111561437957614379613d0f565b61438d816143878454614155565b8461431a565b602080601f8311600181146143c257600084156143aa5750858301515b600019600386901b1c1916600185901b17855561106a565b600085815260208120601f198616915b828110156143f1578886015182559484019460019091019084016143d2565b508582101561440f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff80881683528087166020840152508460408301526080606083015261444d608083018486614255565b979650505050505050565b61ffff86168152608060208201526000614476608083018688614255565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c0602082015260006144b160c08301898b614255565b6001600160401b038816604084015286606084015285608084015282810360a08401526144df818587614255565b9b9a5050505050505050505050565b6001600160401b0383111561450557614505613d0f565b614519836145138354614155565b8361431a565b6000601f84116001811461454d57600085156145355750838201355b600019600387901b1c1916600186901b178355610f15565b600083815260209020601f19861690835b8281101561457e578685013582556020948501946001909201910161455e565b508682101561459b5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8082028115828204841417610dfb57610dfb61422c565b634e487b7160e01b600052601260045260246000fd5b6000826145e9576145e96145c4565b500490565b60006020828403121561460057600080fd5b81516001600160401b0381111561461657600080fd5b8201601f8101841361462757600080fd5b8051614635613dd482613d55565b81815285602083850101111561464a57600080fd5b61209a8260208301602086016139c0565b61ffff8516815260806020820152600061467860808301866139e4565b6001600160401b0385166040840152828103606084015261444d81856139e4565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906146c7908301866139e4565b841515606084015282810360808401526146e181856139e4565b98975050505050505050565b6000806040838503121561470057600080fd5b505080516020909101519092909150565b600082516147238184602087016139c0565b9190910192915050565b61ffff8616815260a06020820152600061474a60a08301876139e4565b6001600160401b0386166040840152828103606084015261476b81866139e4565b905082810360808401526146e181856139e4565b60008261478e5761478e6145c4565b500690565b61ffff8716815260c0602082015260006147b060c08301886139e4565b82810360408401526147c281886139e4565b6001600160a01b0387811660608601528616608085015283810360a085015290506147ed81856139e4565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b1660498401525082516148498160518501602087016139c0565b91909101605101979650505050505050565b600061010061ffff8b1683528060208401526148798184018b6139e4565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c085015290506148b981866139e4565b9150508260e08301529998505050505050505050565b6060815260006148e260608301866139e4565b6001600160401b03949094166020830152506040015291905056fea2646970667358221220ac6a26a757e2c156d6357afcdbf4e76d8c4fd4d85298179f160f212dfb9607c964736f6c634300081100330000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Deployed Bytecode
0x60806040526004361061038b5760003560e01c80638da5cb5b116101dc578063c83330ce11610102578063eab45d9c116100a0578063ed629c5c1161006f578063ed629c5c14610b2c578063f2fde38b14610b46578063f5ecbdbc14610b66578063fc0c546a14610b8657600080fd5b8063eab45d9c14610aac578063eaffd49a14610acc578063eb8d72b714610aec578063ecd8f21214610b0c57600080fd5b8063d8882968116100dc578063d888296814610a29578063dd62ed3e14610a57578063df2a5b3b14610a77578063e6a20ae614610a9757600080fd5b8063c83330ce146109a0578063cbed8b9c146109f6578063d1deba1f14610a1657600080fd5b8063a4c51df51161017a578063b353aaa711610149578063b353aaa714610926578063b9818be11461095a578063baf3292d14610980578063c44618341461091057600080fd5b8063a4c51df5146108b0578063a6c3d165146108d0578063a9059cbb146108f0578063abe685cd1461091057600080fd5b806395d89b41116101b657806395d89b41146108095780639bdb98121461081e5780639f38369a14610870578063a457c2d71461089057600080fd5b80638da5cb5b146107a25780639358928b146107d4578063950c8a74146107e957600080fd5b80633f1f4fa4116102c15780635b8c41e61161025f5780637533d7881161022e5780637533d788146106f657806379c0ad4b14610716578063857749b0146107365780638cfd8f5c1461076a57600080fd5b80635b8c41e61461063c57806366ad5c8a1461068b57806370a08231146106ab578063715018a6146106e157600080fd5b8063455ba27d1161029b578063455ba27d146105d45780634b104eff146105e75780634c42899a146106075780635a359dc51461061c57600080fd5b80633f1f4fa41461057257806342d65a8d1461059f57806344770515146105bf57600080fd5b806318160ddd1161032e578063313ce56711610308578063313ce567146104db578063365260b4146104fd57806339509351146105325780633d8b38f61461055257600080fd5b806318160ddd1461048957806323b872dd146104a85780632cdf0b95146104c857600080fd5b806307e0db171161036a57806307e0db1714610409578063095ea7b3146104295780630df374831461044957806310ddb1371461046957600080fd5b80621d35671461039057806301ffc9a7146103b257806306fdde03146103e7575b600080fd5b34801561039c57600080fd5b506103b06103ab366004613903565b610b99565b005b3480156103be57600080fd5b506103d26103cd366004613996565b610dca565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc610e01565b6040516103de9190613a10565b34801561041557600080fd5b506103b0610424366004613a23565b610e93565b34801561043557600080fd5b506103d2610444366004613a53565b610f1c565b34801561045557600080fd5b506103b0610464366004613a7f565b610f34565b34801561047557600080fd5b506103b0610484366004613a23565b610f53565b34801561049557600080fd5b50600c545b6040519081526020016103de565b3480156104b457600080fd5b506103d26104c3366004613a9b565b610fab565b6103b06104d6366004613af4565b610fcf565b3480156104e757600080fd5b5060125b60405160ff90911681526020016103de565b34801561050957600080fd5b5061051d610518366004613b7f565b611072565b604080519283526020830191909152016103de565b34801561053e57600080fd5b506103d261054d366004613a53565b6110c7565b34801561055e57600080fd5b506103d261056d366004613be4565b6110e9565b34801561057e57600080fd5b5061049a61058d366004613a23565b60036020526000908152604090205481565b3480156105ab57600080fd5b506103b06105ba366004613be4565b6111b5565b3480156105cb57600080fd5b5061049a600081565b6103b06105e2366004613c36565b61123b565b3480156105f357600080fd5b506103b0610602366004613cf2565b61131c565b34801561061357600080fd5b506104eb600081565b34801561062857600080fd5b506103b0610637366004613a23565b6113d9565b34801561064857600080fd5b5061049a610657366004613d7c565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561069757600080fd5b506103b06106a6366004613903565b61144b565b3480156106b757600080fd5b5061049a6106c6366004613cf2565b6001600160a01b03166000908152600a602052604090205490565b3480156106ed57600080fd5b506103b061151f565b34801561070257600080fd5b506103fc610711366004613a23565b611533565b34801561072257600080fd5b506103b0610731366004613e1c565b6115cd565b34801561074257600080fd5b506104eb7f000000000000000000000000000000000000000000000000000000000000000681565b34801561077657600080fd5b5061049a610785366004613e56565b600260209081526000928352604080842090915290825290205481565b3480156107ae57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103de565b3480156107e057600080fd5b5061049a611689565b3480156107f557600080fd5b506004546107bc906001600160a01b031681565b34801561081557600080fd5b506103fc611699565b34801561082a57600080fd5b506103d2610839366004613d7c565b6007602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561087c57600080fd5b506103fc61088b366004613a23565b6116a8565b34801561089c57600080fd5b506103d26108ab366004613a53565b6117be565b3480156108bc57600080fd5b5061051d6108cb366004613e89565b611839565b3480156108dc57600080fd5b506103b06108eb366004613be4565b6118c8565b3480156108fc57600080fd5b506103d261090b366004613a53565b611944565b34801561091c57600080fd5b5061049a61271081565b34801561093257600080fd5b506107bc7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b34801561096657600080fd5b506009546107bc906201000090046001600160a01b031681565b34801561098c57600080fd5b506103b061099b366004613cf2565b611952565b3480156109ac57600080fd5b506109dc6109bb366004613a23565b60086020526000908152604090205461ffff81169062010000900460ff1682565b6040805161ffff90931683529015156020830152016103de565b348015610a0257600080fd5b506103b0610a11366004613f42565b6119a8565b6103b0610a24366004613903565b611a32565b348015610a3557600080fd5b50600954610a449061ffff1681565b60405161ffff90911681526020016103de565b348015610a6357600080fd5b5061049a610a72366004613fb0565b611c48565b348015610a8357600080fd5b506103b0610a92366004613fe9565b611c73565b348015610aa357600080fd5b506104eb600181565b348015610ab857600080fd5b506103b0610ac7366004614025565b611d25565b348015610ad857600080fd5b506103b0610ae7366004614040565b611d6e565b348015610af857600080fd5b506103b0610b07366004613be4565b611e8d565b348015610b1857600080fd5b5061049a610b27366004613a7f565b611ee7565b348015610b3857600080fd5b506006546103d29060ff1681565b348015610b5257600080fd5b506103b0610b61366004613cf2565b611f79565b348015610b7257600080fd5b506103fc610b81366004614108565b611ff2565b348015610b9257600080fd5b50306107bc565b337f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b031614610c165760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610c3490614155565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6090614155565b8015610cad5780601f10610c8257610100808354040283529160200191610cad565b820191906000526020600020905b815481529060010190602001808311610c9057829003601f168201915b50505050509050805186869050148015610cc8575060008151115b8015610cf0575080516020820120604051610ce69088908890614189565b6040518091039020145b610d4b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610c0d565b610dc18787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506120a392505050565b50505050505050565b60006001600160e01b03198216630d30953d60e31b1480610dfb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600d8054610e1090614155565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614155565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b610e9b61211c565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610f0157600080fd5b505af1158015610f15573d6000803e3d6000fd5b5050505050565b600033610f2a818585612176565b5060019392505050565b610f3c61211c565b61ffff909116600090815260036020526040902055565b610f5b61211c565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906310ddb13790602401610ee7565b600033610fb985828561229a565b610fc4858585612314565b506001949350505050565b610fda8686856124bf565b50925061104886868686610ff16020870187613cf2565b6110016040880160208901613cf2565b61100e6040890189614199565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061250892505050565b92508183101561106a5760405162461bcd60e51b8152600401610c0d906141df565b505050505050565b6000806110b88888888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061262c92505050565b91509150965096945050505050565b600033610f2a8185856110da8383611c48565b6110e49190614242565b612176565b61ffff83166000908152600160205260408120805482919061110a90614155565b80601f016020809104026020016040519081016040528092919081815260200182805461113690614155565b80156111835780601f1061115857610100808354040283529160200191611183565b820191906000526020600020905b81548152906001019060200180831161116657829003601f168201915b50505050509050838360405161119a929190614189565b60405180910390208180519060200120149150509392505050565b6111bd61211c565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906342d65a8d9061120d9086908690869060040161427e565b600060405180830381600087803b15801561122757600080fd5b505af1158015610dc1573d6000803e3d6000fd5b6112468989886124bf565b50809650506112ef8989898988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506112989150506020890189613cf2565b6112a860408a0160208b01613cf2565b6112b560408b018b614199565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126e492505050565b9550848610156113115760405162461bcd60e51b8152600401610c0d906141df565b505050505050505050565b61132461211c565b6001600160a01b03811661137a5760405162461bcd60e51b815260206004820152601a60248201527f4665653a206665654f776e65722063616e6e6f742062652030780000000000006044820152606401610c0d565b6009805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f047912631afa564eebd3db2efe191a0dec62da1fede6bbbc1ffc89d87845b1b5906020015b60405180910390a150565b6113e161211c565b6127108161ffff1611156114075760405162461bcd60e51b8152600401610c0d9061429c565b6009805461ffff191661ffff83169081179091556040519081527fd26030ef4a8c225ee12b646eb4466acb41fb96b6cd4660b22d0ba0124e7bdc74906020016113ce565b3330146114a95760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610c0d565b61106a8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284376000920191909152506127e092505050565b61152761211c565b6115316000612867565b565b6001602052600090815260409020805461154c90614155565b80601f016020809104026020016040519081016040528092919081815260200182805461157890614155565b80156115c55780601f1061159a576101008083540402835291602001916115c5565b820191906000526020600020905b8154815290600101906020018083116115a857829003601f168201915b505050505081565b6115d561211c565b6127108161ffff1611156115fb5760405162461bcd60e51b8152600401610c0d9061429c565b60408051808201825261ffff83811680835285151560208085018281528985166000818152600884528890209651875492511515620100000262ffffff1990931696169590951717909455845192835292820192909252918201527fdd9c9685af3e6dcb56d8f4b88d2595d4add6837a150034e7781c46b6dcf8aaab906060015b60405180910390a1505050565b6000611694600c5490565b905090565b6060600e8054610e1090614155565b61ffff81166000908152600160205260408120805460609291906116cb90614155565b80601f01602080910402602001604051908101604052809291908181526020018280546116f790614155565b80156117445780601f1061171957610100808354040283529160200191611744565b820191906000526020600020905b81548152906001019060200180831161172757829003601f168201915b50505050509050805160000361179c5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610c0d565b6117b76000601483516117af91906142e1565b8391906128b7565b9392505050565b600033816117cc8286611c48565b90508381101561182c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c0d565b610fc48286868403612176565b6000806118b68b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152506129c492505050565b91509150995099975050505050505050565b6118d061211c565b8181306040516020016118e5939291906142f4565b60408051601f1981840301815291815261ffff85166000908152600160205220906119109082614360565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161167c9392919061427e565b600033610f2a818585612314565b61195a61211c565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b906020016113ce565b6119b061211c565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063cbed8b9c90611a04908890889088908890889060040161441f565b600060405180830381600087803b158015611a1e57600080fd5b505af1158015611311573d6000803e3d6000fd5b61ffff86166000908152600560205260408082209051611a559088908890614189565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611ad55760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610c0d565b808383604051611ae6929190614189565b604051809103902014611b455760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610c0d565b61ffff87166000908152600560205260408082209051611b689089908990614189565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611c00918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506127e092505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611c37959493929190614458565b60405180910390a150505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b611c7b61211c565b60008111611cc35760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610c0d565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161167c565b611d2d61211c565b6006805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a4906020016113ce565b333014611dbd5760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610c0d565b611dc8308686612a7f565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e0a91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611e4e908e908e908e908e908e908d908d908d90600401614493565b600060405180830381600088803b158015611e6857600080fd5b5087f1158015611e7c573d6000803e3d6000fd5b505050505050505050505050505050565b611e9561211c565b61ffff83166000908152600160205260409020611eb38284836144ee565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161167c9392919061427e565b61ffff828116600090815260086020908152604080832081518083019092525493841681526201000090930460ff1615801591840191909152909190611f4c57805161271090611f3b9061ffff16856145ad565b611f4591906145da565b9150611f72565b60095461ffff1615611f6d5760095461271090611f3b9061ffff16856145ad565b600091505b5092915050565b611f8161211c565b6001600160a01b038116611fe65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b611fef81612867565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612072573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261209a91908101906145ee565b95945050505050565b6000806121065a60966366ad5c8a60e01b898989896040516024016120cb949392919061465b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612ad1565b915091508161106a5761106a8686868685612b5b565b6000546001600160a01b031633146115315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c0d565b6001600160a01b0383166121d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c0d565b6001600160a01b0382166122395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c0d565b6001600160a01b038381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006122a68484611c48565b9050600019811461230e57818110156123015760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c0d565b61230e8484848403612176565b50505050565b6001600160a01b0383166123785760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c0d565b6001600160a01b0382166123da5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c0d565b6001600160a01b0383166000908152600a6020526040902054818110156124525760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c0d565b6001600160a01b038085166000818152600a602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124b29086815260200190565b60405180910390a361230e565b6000806124cc8484611ee7565b90506124d881846142e1565b91508015612500576009546124fe9086906201000090046001600160a01b031683612a7f565b505b935093915050565b600061251687828481612bfd565b61251f85612c77565b50905061252e88888884612cb7565b90506000811161257c5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610c0d565b60006125c78761258b84612ce9565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b90506125d7888287878734612d6f565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161261891815260200190565b60405180910390a450979650505050505050565b600080600061263e8761258b88612ce9565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906340a7bb1090612695908b90309086908b908b90600401614699565b6040805180830381865afa1580156126b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d591906146ed565b92509250509550959350505050565b60006126fc896001846001600160401b038916612bfd565b61270587612c77565b5090506127148a8a8a84612cb7565b9050600081116127625760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610c0d565b6000612779338a61277285612ce9565b8a8a612f14565b90506127898a8287878734612d6f565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a856040516127ca91815260200190565b60405180910390a4509998505050505050505050565b60006127ec8282612f55565b905060ff81166128075761280285858585612fb1565b610f15565b60001960ff82160161281f5761280285858585613041565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610c0d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816128c581601f614242565b10156129045760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610c0d565b61290e8284614242565b845110156129525760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610c0d565b60608215801561297157604051915060008252602082016040526129bb565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156129aa578051835260209283019201612992565b5050858452601f01601f1916604052505b50949350505050565b60008060006129d7338a6127728b612ce9565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906340a7bb1090612a2e908d90309086908b908b90600401614699565b6040805180830381865afa158015612a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6e91906146ed565b925092505097509795505050505050565b600033306001600160a01b03861614801590612aad5750806001600160a01b0316856001600160a01b031614155b15612abd57612abd85828561229a565b612ac8858585612314565b50909392505050565b6000606060008060008661ffff166001600160401b03811115612af657612af6613d0f565b6040519080825280601f01601f191660200182016040528015612b20576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115612b42578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612b8c9190614711565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612be9908790879087908790879061472d565b60405180910390a15050505050565b505050565b60065460ff1615612c1957612c148484848461324f565b61230e565b81511561230e5760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608401610c0d565b600080612ca47f000000000000000000000000000000000000000000000000000000e8d4a510008461477f565b9050612cb081846142e1565b9150915091565b6000336001600160a01b0386168114612cd557612cd586828561229a565b612cdf868461332e565b5090949350505050565b600080612d167f000000000000000000000000000000000000000000000000000000e8d4a51000846145da565b90506001600160401b03811115610dfb5760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610c0d565b61ffff861660009081526001602052604081208054612d8d90614155565b80601f0160208091040260200160405190810160405280929190818152602001828054612db990614155565b8015612e065780601f10612ddb57610100808354040283529160200191612e06565b820191906000526020600020905b815481529060010190602001808311612de957829003601f168201915b505050505090508051600003612e775760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610c0d565b612e82878751613462565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063c5803100908490612ed9908b9086908c908c908c908c90600401614793565b6000604051808303818588803b158015612ef257600080fd5b505af1158015612f06573d6000803e3d6000fd5b505050505050505050505050565b6060600185856001600160a01b0389168587604051602001612f3b969594939291906147fa565b604051602081830303815290604052905095945050505050565b6000612f62826001614242565b83511015612fa85760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610c0d565b50016001015190565b600080612fbd836134d3565b90925090506001600160a01b038216612fd65761dead91505b6000612fe182613558565b9050612fee87848361358d565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161303091815260200190565b60405180910390a350505050505050565b600080600080600061305286613599565b945094509450945094506000600760008b61ffff1661ffff168152602001908152602001600020896040516130879190614711565b90815260408051602092819003830190206001600160401b038b166000908152925281205460ff1691506130ba85613558565b905081613128576130cc8b308361358d565b61ffff8c166000908152600760205260409081902090519192506001916130f4908d90614711565b90815260408051602092819003830190206001600160401b038d16600090815292529020805460ff19169115159190911790555b6001600160a01b0386163b61317f576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a15050505050505061230e565b8a8a8a8a8a8a868a60008a61319d578b6001600160401b031661319f565b5a5b90506000806131d15a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120cb98979695949392919061485b565b91509150811561322a578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd8849061321c908e908e9086906148cf565b60405180910390a250613237565b6132378b8b8b8b85612b5b565b50505050505050505050505050505050505050505050565b600061325a83613650565b61ffff80871660009081526002602090815260408083209389168352929052908120549192509061328c908490614242565b9050600081116132de5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610c0d565b8082101561106a5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610c0d565b6001600160a01b03821661338e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c0d565b6001600160a01b0382166000908152600a6020526040902054818110156134025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c0d565b6001600160a01b0383166000818152600a602090815260408083208686039055600c80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82166000908152600360205260408120549081900361348357506127105b80821115612bf85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610c0d565b600080806134e18482612f55565b60ff161480156134f2575082516029145b6135395760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610c0d565b61354483600d6136ac565b9150613551836021613711565b9050915091565b6000610dfb7f000000000000000000000000000000000000000000000000000000e8d4a510006001600160401b0384166145ad565b6000611f72838361376e565b6000808060608160016135ac8783612f55565b60ff16146135f75760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610c0d565b61360286600d6136ac565b935061360f866021613711565b925061361c86602961382f565b9450613629866049613711565b9050613645605180885161363d91906142e1565b8891906128b7565b915091939590929450565b60006022825110156136a45760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610c0d565b506022015190565b60006136b9826014614242565b835110156137015760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610c0d565b500160200151600160601b900490565b600061371e826008614242565b835110156137655760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610c0d565b50016008015190565b6001600160a01b0382166137c45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c0d565b80600c60008282546137d69190614242565b90915550506001600160a01b0382166000818152600a60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600061383c826020614242565b835110156138845760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610c0d565b50016020015190565b803561ffff8116811461389f57600080fd5b919050565b60008083601f8401126138b657600080fd5b5081356001600160401b038111156138cd57600080fd5b6020830191508360208285010111156138e557600080fd5b9250929050565b80356001600160401b038116811461389f57600080fd5b6000806000806000806080878903121561391c57600080fd5b6139258761388d565b955060208701356001600160401b038082111561394157600080fd5b61394d8a838b016138a4565b909750955085915061396160408a016138ec565b9450606089013591508082111561397757600080fd5b5061398489828a016138a4565b979a9699509497509295939492505050565b6000602082840312156139a857600080fd5b81356001600160e01b0319811681146117b757600080fd5b60005b838110156139db5781810151838201526020016139c3565b50506000910152565b600081518084526139fc8160208601602086016139c0565b601f01601f19169290920160200192915050565b6020815260006117b760208301846139e4565b600060208284031215613a3557600080fd5b6117b78261388d565b6001600160a01b0381168114611fef57600080fd5b60008060408385031215613a6657600080fd5b8235613a7181613a3e565b946020939093013593505050565b60008060408385031215613a9257600080fd5b613a718361388d565b600080600060608486031215613ab057600080fd5b8335613abb81613a3e565b92506020840135613acb81613a3e565b929592945050506040919091013590565b600060608284031215613aee57600080fd5b50919050565b60008060008060008060c08789031215613b0d57600080fd5b8635613b1881613a3e565b9550613b266020880161388d565b945060408701359350606087013592506080870135915060a08701356001600160401b03811115613b5657600080fd5b613b6289828a01613adc565b9150509295509295509295565b8035801515811461389f57600080fd5b60008060008060008060a08789031215613b9857600080fd5b613ba18761388d565b95506020870135945060408701359350613bbd60608801613b6f565b925060808701356001600160401b03811115613bd857600080fd5b61398489828a016138a4565b600080600060408486031215613bf957600080fd5b613c028461388d565b925060208401356001600160401b03811115613c1d57600080fd5b613c29868287016138a4565b9497909650939450505050565b60008060008060008060008060006101008a8c031215613c5557600080fd5b8935613c6081613a3e565b9850613c6e60208b0161388d565b975060408a0135965060608a0135955060808a0135945060a08a01356001600160401b0380821115613c9f57600080fd5b613cab8d838e016138a4565b9096509450849150613cbf60c08d016138ec565b935060e08c0135915080821115613cd557600080fd5b50613ce28c828d01613adc565b9150509295985092959850929598565b600060208284031215613d0457600080fd5b81356117b781613a3e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d4d57613d4d613d0f565b604052919050565b60006001600160401b03821115613d6e57613d6e613d0f565b50601f01601f191660200190565b600080600060608486031215613d9157600080fd5b613d9a8461388d565b925060208401356001600160401b03811115613db557600080fd5b8401601f81018613613dc657600080fd5b8035613dd9613dd482613d55565b613d25565b818152876020838501011115613dee57600080fd5b81602084016020830137600060208383010152809450505050613e13604085016138ec565b90509250925092565b600080600060608486031215613e3157600080fd5b613e3a8461388d565b9250613e4860208501613b6f565b9150613e136040850161388d565b60008060408385031215613e6957600080fd5b613e728361388d565b9150613e806020840161388d565b90509250929050565b600080600080600080600080600060e08a8c031215613ea757600080fd5b613eb08a61388d565b985060208a0135975060408a0135965060608a01356001600160401b0380821115613eda57600080fd5b613ee68d838e016138a4565b9098509650869150613efa60808d016138ec565b9550613f0860a08d01613b6f565b945060c08c0135915080821115613f1e57600080fd5b50613f2b8c828d016138a4565b915080935050809150509295985092959850929598565b600080600080600060808688031215613f5a57600080fd5b613f638661388d565b9450613f716020870161388d565b93506040860135925060608601356001600160401b03811115613f9357600080fd5b613f9f888289016138a4565b969995985093965092949392505050565b60008060408385031215613fc357600080fd5b8235613fce81613a3e565b91506020830135613fde81613a3e565b809150509250929050565b600080600060608486031215613ffe57600080fd5b6140078461388d565b92506140156020850161388d565b9150604084013590509250925092565b60006020828403121561403757600080fd5b6117b782613b6f565b6000806000806000806000806000806101008b8d03121561406057600080fd5b6140698b61388d565b995060208b01356001600160401b038082111561408557600080fd5b6140918e838f016138a4565b909b5099508991506140a560408e016138ec565b985060608d0135975060808d013591506140be82613a3e565b90955060a08c0135945060c08c013590808211156140db57600080fd5b506140e88d828e016138a4565b9150809450508092505060e08b013590509295989b9194979a5092959850565b6000806000806080858703121561411e57600080fd5b6141278561388d565b93506141356020860161388d565b9250604085013561414581613a3e565b9396929550929360600135925050565b600181811c9082168061416957607f821691505b602082108103613aee57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6000808335601e198436030181126141b057600080fd5b8301803591506001600160401b038211156141ca57600080fd5b6020019150368190038213156138e557600080fd5b6020808252602d908201527f426173654f4654576974684665653a20616d6f756e74206973206c657373207460408201526c1a185b881b5a5b905b5bdd5b9d609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610dfb57610dfb61422c565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff8416815260406020820152600061209a604083018486614255565b60208082526025908201527f4665653a20666565206270206d757374206265203c3d2042505f44454e4f4d496040820152642720aa27a960d91b606082015260800190565b81810381811115610dfb57610dfb61422c565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f821115612bf857600081815260208120601f850160051c810160208610156143415750805b601f850160051c820191505b8181101561106a5782815560010161434d565b81516001600160401b0381111561437957614379613d0f565b61438d816143878454614155565b8461431a565b602080601f8311600181146143c257600084156143aa5750858301515b600019600386901b1c1916600185901b17855561106a565b600085815260208120601f198616915b828110156143f1578886015182559484019460019091019084016143d2565b508582101561440f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff80881683528087166020840152508460408301526080606083015261444d608083018486614255565b979650505050505050565b61ffff86168152608060208201526000614476608083018688614255565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c0602082015260006144b160c08301898b614255565b6001600160401b038816604084015286606084015285608084015282810360a08401526144df818587614255565b9b9a5050505050505050505050565b6001600160401b0383111561450557614505613d0f565b614519836145138354614155565b8361431a565b6000601f84116001811461454d57600085156145355750838201355b600019600387901b1c1916600186901b178355610f15565b600083815260209020601f19861690835b8281101561457e578685013582556020948501946001909201910161455e565b508682101561459b5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8082028115828204841417610dfb57610dfb61422c565b634e487b7160e01b600052601260045260246000fd5b6000826145e9576145e96145c4565b500490565b60006020828403121561460057600080fd5b81516001600160401b0381111561461657600080fd5b8201601f8101841361462757600080fd5b8051614635613dd482613d55565b81815285602083850101111561464a57600080fd5b61209a8260208301602086016139c0565b61ffff8516815260806020820152600061467860808301866139e4565b6001600160401b0385166040840152828103606084015261444d81856139e4565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906146c7908301866139e4565b841515606084015282810360808401526146e181856139e4565b98975050505050505050565b6000806040838503121561470057600080fd5b505080516020909101519092909150565b600082516147238184602087016139c0565b9190910192915050565b61ffff8616815260a06020820152600061474a60a08301876139e4565b6001600160401b0386166040840152828103606084015261476b81866139e4565b905082810360808401526146e181856139e4565b60008261478e5761478e6145c4565b500690565b61ffff8716815260c0602082015260006147b060c08301886139e4565b82810360408401526147c281886139e4565b6001600160a01b0387811660608601528616608085015283810360a085015290506147ed81856139e4565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b1660498401525082516148498160518501602087016139c0565b91909101605101979650505050505050565b600061010061ffff8b1683528060208401526148798184018b6139e4565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c085015290506148b981866139e4565b9150508260e08301529998505050505050505050565b6060815260006148e260608301866139e4565b6001600160401b03949094166020830152506040015291905056fea2646970667358221220ac6a26a757e2c156d6357afcdbf4e76d8c4fd4d85298179f160f212dfb9607c964736f6c63430008110033
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
87173:132:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45023:762;;;;;;;;;;-1:-1:-1;45023:762:0;;;;;:::i;:::-;;:::i;:::-;;66966:218;;;;;;;;;;-1:-1:-1;66966:218:0;;;;;:::i;:::-;;:::i;:::-;;;2029:14:1;;2022:22;2004:41;;1992:2;1977:18;66966:218:0;;;;;;;;73891:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48321:123::-;;;;;;;;;;-1:-1:-1;48321:123:0;;;;;:::i;:::-;;:::i;76251:201::-;;;;;;;;;;-1:-1:-1;76251:201:0;;;;;:::i;:::-;;:::i;50246:142::-;;;;;;;;;;-1:-1:-1;50246:142:0;;;;;:::i;:::-;;:::i;48452:129::-;;;;;;;;;;-1:-1:-1;48452:129:0;;;;;:::i;:::-;;:::i;75020:108::-;;;;;;;;;;-1:-1:-1;75108:12:0;;75020:108;;;3860:25:1;;;3848:2;3833:18;75020:108:0;3714:177:1;77032:261:0;;;;;;;;;;-1:-1:-1;77032:261:0;;;;;:::i;:::-;;:::i;65711:484::-;;;;;;:::i;:::-;;:::i;74862:93::-;;;;;;;;;;-1:-1:-1;74945:2:0;74862:93;;;5477:4:1;5465:17;;;5447:36;;5435:2;5420:18;74862:93:0;5305:184:1;67192:292:0;;;;;;;;;;-1:-1:-1;67192:292:0;;;;;:::i;:::-;;:::i;:::-;;;;6525:25:1;;;6581:2;6566:18;;6559:34;;;;6498:18;67192:292:0;6351:248:1;77702:238:0;;;;;;;;;;-1:-1:-1;77702:238:0;;;;;:::i;:::-;;:::i;50486:250::-;;;;;;;;;;-1:-1:-1;50486:250:0;;;;;:::i;:::-;;:::i;44565:53::-;;;;;;;;;;-1:-1:-1;44565:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;48589:178;;;;;;;;;;-1:-1:-1;48589:178:0;;;;;:::i;:::-;;:::i;54145:37::-;;;;;;;;;;;;54181:1;54145:37;;66203:568;;;;;;:::i;:::-;;:::i;42882:217::-;;;;;;;;;;-1:-1:-1;42882:217:0;;;;;:::i;:::-;;:::i;54211:33::-;;;;;;;;;;;;54243:1;54211:33;;42321:235;;;;;;;;;;-1:-1:-1;42321:235:0;;;;;:::i;:::-;;:::i;51364:85::-;;;;;;;;;;-1:-1:-1;51364:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52586:346;;;;;;;;;;-1:-1:-1;52586:346:0;;;;;:::i;:::-;;:::i;75191:127::-;;;;;;;;;;-1:-1:-1;75191:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;75292:18:0;75265:7;75292:18;;;:9;:18;;;;;;;75191:127;40864:103;;;;;;;;;;;;;:::i;44435:51::-;;;;;;;;;;-1:-1:-1;44435:51:0;;;;;:::i;:::-;;:::i;42564:310::-;;;;;;;;;;-1:-1:-1;42564:310:0;;;;;:::i;:::-;;:::i;54302:37::-;;;;;;;;;;;;;;;44493:65;;;;;;;;;;-1:-1:-1;44493:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40223:87;;;;;;;;;;-1:-1:-1;40269:7:0;40296:6;-1:-1:-1;;;;;40296:6:0;40223:87;;;-1:-1:-1;;;;;11089:32:1;;;11071:51;;11059:2;11044:18;40223:87:0;10925:203:1;85659:112:0;;;;;;;;;;;;;:::i;44625:23::-;;;;;;;;;;-1:-1:-1;44625:23:0;;;;-1:-1:-1;;;;;44625:23:0;;;74110:104;;;;;;;;;;;;;:::i;54389:83::-;;;;;;;;;;-1:-1:-1;54389:83:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49418:330;;;;;;;;;;-1:-1:-1;49418:330:0;;;;;:::i;:::-;;:::i;78443:436::-;;;;;;;;;;-1:-1:-1;78443:436:0;;;;;:::i;:::-;;:::i;67492:380::-;;;;;;;;;;-1:-1:-1;67492:380:0;;;;;:::i;:::-;;:::i;49129:281::-;;;;;;;;;;-1:-1:-1;49129:281:0;;;;;:::i;:::-;;:::i;75524:193::-;;;;;;;;;;-1:-1:-1;75524:193:0;;;;;:::i;:::-;;:::i;41834:43::-;;;;;;;;;;;;41872:5;41834:43;;44382:46;;;;;;;;;;;;;;;41977:23;;;;;;;;;;-1:-1:-1;41977:23:0;;;;;;;-1:-1:-1;;;;;41977:23:0;;;49756:136;;;;;;;;;;-1:-1:-1;49756:136:0;;;;;:::i;:::-;;:::i;41886:51::-;;;;;;;;;;-1:-1:-1;41886:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;12637:6:1;12625:19;;;12607:38;;12688:14;;12681:22;12676:2;12661:18;;12654:50;12580:18;41886:51:0;12441:269:1;48109:204:0;;;;;;;;;;-1:-1:-1;48109:204:0;;;;;:::i;:::-;;:::i;53118:767::-;;;;;;:::i;:::-;;:::i;41944:26::-;;;;;;;;;;-1:-1:-1;41944:26:0;;;;;;;;;;;13516:6:1;13504:19;;;13486:38;;13474:2;13459:18;41944:26:0;13342:188:1;75780:151:0;;;;;;;;;;-1:-1:-1;75780:151:0;;;;;:::i;:::-;;:::i;49900:284::-;;;;;;;;;;-1:-1:-1;49900:284:0;;;;;:::i;:::-;;:::i;54251:42::-;;;;;;;;;;;;54292:1;54251:42;;56233:223;;;;;;;;;;-1:-1:-1;56233:223:0;;;;;:::i;:::-;;:::i;55661:564::-;;;;;;;;;;-1:-1:-1;55661:564:0;;;;;:::i;:::-;;:::i;48914:207::-;;;;;;;;;;-1:-1:-1;48914:207:0;;;;;:::i;:::-;;:::i;43107:409::-;;;;;;;;;;-1:-1:-1;43107:409:0;;;;;:::i;:::-;;:::i;54348:34::-;;;;;;;;;;-1:-1:-1;54348:34:0;;;;;;;;41122:201;;;;;;;;;;-1:-1:-1;41122:201:0;;;;;:::i;:::-;;:::i;47836:211::-;;;;;;;;;;-1:-1:-1;47836:211:0;;;;;:::i;:::-;;:::i;85779:103::-;;;;;;;;;;-1:-1:-1;85869:4:0;85779:103;;45023:762;38854:10;45263;-1:-1:-1;;;;;45239:35:0;;45231:78;;;;-1:-1:-1;;;45231:78:0;;16319:2:1;45231:78:0;;;16301:21:1;16358:2;16338:18;;;16331:30;16397:32;16377:18;;;16370:60;16447:18;;45231:78:0;;;;;;;;;45351:32;;;45322:26;45351:32;;;:19;:32;;;;;45322:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45557:13;:20;45535:11;;:18;;:42;:70;;;;;45604:1;45581:13;:20;:24;45535:70;:124;;;;-1:-1:-1;45635:24:0;;;;;;45609:22;;;;45619:11;;;;45609:22;:::i;:::-;;;;;;;;:50;45535:124;45527:175;;;;-1:-1:-1;;;45527:175:0;;17339:2:1;45527:175:0;;;17321:21:1;17378:2;17358:18;;;17351:30;17417:34;17397:18;;;17390:62;-1:-1:-1;;;17468:18:1;;;17461:36;17514:19;;45527:175:0;17137:402:1;45527:175:0;45715:62;45734:11;45747;;45715:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45715:62:0;;;;;;;;;;;;;;;;;;;;;;45760:6;;-1:-1:-1;45715:62:0;-1:-1:-1;45768:8:0;;;;;;45715:62;;45768:8;;;;45715:62;;;;;;;;;-1:-1:-1;45715:18:0;;-1:-1:-1;;;45715:62:0:i;:::-;45154:631;45023:762;;;;;;:::o;66966:218::-;67068:4;-1:-1:-1;;;;;;67092:44:0;;-1:-1:-1;;;67092:44:0;;:84;;-1:-1:-1;;;;;;;;;;2739:40:0;;;67140:36;67085:91;66966:218;-1:-1:-1;;66966:218:0:o;73891:100::-;73945:13;73978:5;73971:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73891:100;:::o;48321:123::-;40109:13;:11;:13::i;:::-;48401:35:::1;::::0;-1:-1:-1;;;48401:35:0;;13516:6:1;13504:19;;48401:35:0::1;::::0;::::1;13486:38:1::0;48401:10:0::1;-1:-1:-1::0;;;;;48401:25:0::1;::::0;::::1;::::0;13459:18:1;;48401:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48321:123:::0;:::o;76251:201::-;76334:4;38854:10;76390:32;38854:10;76406:7;76415:6;76390:8;:32::i;:::-;-1:-1:-1;76440:4:0;;76251:201;-1:-1:-1;;;76251:201:0:o;50246:142::-;40109:13;:11;:13::i;:::-;50337:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;50246:142::o;48452:129::-;40109:13;:11;:13::i;:::-;48535:38:::1;::::0;-1:-1:-1;;;48535:38:0;;13516:6:1;13504:19;;48535:38:0::1;::::0;::::1;13486::1::0;48535:10:0::1;-1:-1:-1::0;;;;;48535:28:0::1;::::0;::::1;::::0;13459:18:1;;48535:38:0::1;13342:188:1::0;77032:261:0;77129:4;38854:10;77187:38;77203:4;38854:10;77218:6;77187:15;:38::i;:::-;77236:27;77246:4;77252:2;77256:6;77236:9;:27::i;:::-;-1:-1:-1;77281:4:0;;77032:261;-1:-1:-1;;;;77032:261:0:o;65711:484::-;65906:39;65917:5;65924:11;65937:7;65906:10;:39::i;:::-;-1:-1:-1;65893:52:0;-1:-1:-1;65966:131:0;65972:5;65979:11;65992:10;65893:52;66013:25;;;;:11;:25;:::i;:::-;66040:29;;;;;;;;:::i;:::-;66071:25;;;;:11;:25;:::i;:::-;65966:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65966:5:0;;-1:-1:-1;;;65966:131:0:i;:::-;65956:141;;66127:10;66116:7;:21;;66108:79;;;;-1:-1:-1;;;66108:79:0;;;;;;;:::i;:::-;65711:484;;;;;;:::o;67192:292::-;67354:14;67370:11;67401:75;67418:11;67431:10;67443:7;67452;67461:14;;67401:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67401:16:0;;-1:-1:-1;;;67401:75:0:i;:::-;67394:82;;;;67192:292;;;;;;;;;:::o;77702:238::-;77790:4;38854:10;77846:64;38854:10;77862:7;77899:10;77871:25;38854:10;77862:7;77871:9;:25::i;:::-;:38;;;;:::i;:::-;77846:8;:64::i;50486:250::-;50628:32;;;50582:4;50628:32;;;:19;:32;;;;;50599:61;;50582:4;;50628:32;50599:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50716:11;;50706:22;;;;;;;:::i;:::-;;;;;;;;50688:13;50678:24;;;;;;:50;50671:57;;;50486:250;;;;;:::o;48589:178::-;40109:13;:11;:13::i;:::-;48704:55:::1;::::0;-1:-1:-1;;;48704:55:0;;-1:-1:-1;;;;;48704:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;48734:11;;48747;;;;48704:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;66203:568:::0;66449:39;66460:5;66467:11;66480:7;66449:10;:39::i;:::-;66436:52;;;;;66509:164;66522:5;66529:11;66542:10;66554:7;66563:8;;66509:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66573:14:0;;-1:-1:-1;66589:25:0;;-1:-1:-1;;66589:25:0;;;:11;:25;:::i;:::-;66616:29;;;;;;;;:::i;:::-;66647:25;;;;:11;:25;:::i;:::-;66509:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66509:12:0;;-1:-1:-1;;;66509:164:0:i;:::-;66499:174;;66703:10;66692:7;:21;;66684:79;;;;-1:-1:-1;;;66684:79:0;;;;;;;:::i;:::-;66203:568;;;;;;;;;:::o;42882:217::-;40109:13;:11;:13::i;:::-;-1:-1:-1;;;;;42966:25:0;::::1;42958:64;;;::::0;-1:-1:-1;;;42958:64:0;;19810:2:1;42958:64:0::1;::::0;::::1;19792:21:1::0;19849:2;19829:18;;;19822:30;19888:28;19868:18;;;19861:56;19934:18;;42958:64:0::1;19608:350:1::0;42958:64:0::1;43033:8;:20:::0;;-1:-1:-1;;;;;;43033:20:0::1;::::0;-1:-1:-1;;;;;43033:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;43069:22:::1;::::0;11071:51:1;;;43069:22:0::1;::::0;11059:2:1;11044:18;43069:22:0::1;;;;;;;;42882:217:::0;:::o;42321:235::-;40109:13;:11;:13::i;:::-;41872:5:::1;42405:6;:24;;;;42397:74;;;;-1:-1:-1::0;;;42397:74:0::1;;;;;;;:::i;:::-;42482:12;:21:::0;;-1:-1:-1;;42482:21:0::1;;::::0;::::1;::::0;;::::1;::::0;;;42519:29:::1;::::0;13486:38:1;;;42519:29:0::1;::::0;13474:2:1;13459:18;42519:29:0::1;13342:188:1::0;52586:346:0;38854:10;52800:4;52776:29;52768:80;;;;-1:-1:-1;;;52768:80:0;;20571:2:1;52768:80:0;;;20553:21:1;20610:2;20590:18;;;20583:30;20649:34;20629:18;;;20622:62;-1:-1:-1;;;20700:18:1;;;20693:36;20746:19;;52768:80:0;20369:402:1;52768:80:0;52859:65;52881:11;52894;;52859:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52859:65:0;;;;;;;;;;;;;;;;;;;;;;52907:6;;-1:-1:-1;52859:65:0;-1:-1:-1;52915:8:0;;;;;;52859:65;;52915:8;;;;52859:65;;;;;;;;;-1:-1:-1;52859:21:0;;-1:-1:-1;;;52859:65:0:i;40864:103::-;40109:13;:11;:13::i;:::-;40929:30:::1;40956:1;40929:18;:30::i;:::-;40864:103::o:0;44435:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42564:310::-;40109:13;:11;:13::i;:::-;41872:5:::1;42676:6;:24;;;;42668:74;;;;-1:-1:-1::0;;;42668:74:0::1;;;;;;;:::i;:::-;42784:27;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;;::::0;;::::1;::::0;;;42753:28;;::::1;-1:-1:-1::0;42753:28:0;;;:15:::1;:28:::0;;;;;:58;;;;;;::::1;;::::0;::::1;-1:-1:-1::0;;42753:58:0;;;;::::1;::::0;;;;::::1;::::0;;;42827:39;;20993:34:1;;;21043:18;;;21036:50;;;;21102:18;;;21095:43;42827:39:0::1;::::0;20956:2:1;20941:18;42827:39:0::1;;;;;;;;42564:310:::0;;;:::o;85659:112::-;85726:4;85750:13;75108:12;;;75020:108;85750:13;85743:20;;85659:112;:::o;74110:104::-;74166:13;74199:7;74192:14;;;;;:::i;49418:330::-;49542:35;;;49522:17;49542:35;;;:19;:35;;;;;49522:55;;49497:12;;49522:17;49542:35;49522:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49596:4;:11;49611:1;49596:16;49588:58;;;;-1:-1:-1;;;49588:58:0;;21351:2:1;49588:58:0;;;21333:21:1;21390:2;21370:18;;;21363:30;21429:31;21409:18;;;21402:59;21478:18;;49588:58:0;21149:353:1;49588:58:0;49664:31;49675:1;49692:2;49678:4;:11;:16;;;;:::i;:::-;49664:4;;:31;:10;:31::i;:::-;49657:38;49418:330;-1:-1:-1;;;49418:330:0:o;78443:436::-;78536:4;38854:10;78536:4;78619:25;38854:10;78636:7;78619:9;:25::i;:::-;78592:52;;78683:15;78663:16;:35;;78655:85;;;;-1:-1:-1;;;78655:85:0;;21842:2:1;78655:85:0;;;21824:21:1;21881:2;21861:18;;;21854:30;21920:34;21900:18;;;21893:62;-1:-1:-1;;;21971:18:1;;;21964:35;22016:19;;78655:85:0;21640:401:1;78655:85:0;78776:60;78785:5;78792:7;78820:15;78801:16;:34;78776:8;:60::i;67492:380::-;67709:14;67725:11;67756:108;67780:11;67793:10;67805:7;67814:8;;67756:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67756:108:0;;;;;;;;;;;;;;;;;;;;;;67824:14;;-1:-1:-1;67840:7:0;;-1:-1:-1;67756:108:0;67849:14;;;;;;67756:108;;67849:14;;;;67756:108;;;;;;;;;-1:-1:-1;67756:23:0;;-1:-1:-1;;;67756:108:0:i;:::-;67749:115;;;;67492:380;;;;;;;;;;;;:::o;49129:281::-;40109:13;:11;:13::i;:::-;49301:14:::1;;49325:4;49284:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;49284:47:0;;::::1;::::0;;;;;;49246:35:::1;::::0;::::1;;::::0;;;:19:::1;49284:47;49246:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;49347:55;49371:14;49387;;49347:55;;;;;;;;:::i;75524:193::-:0;75603:4;38854:10;75659:28;38854:10;75676:2;75680:6;75659:9;:28::i;49756:136::-;40109:13;:11;:13::i;:::-;49826:8:::1;:20:::0;;-1:-1:-1;;;;;;49826:20:0::1;-1:-1:-1::0;;;;;49826:20:0;::::1;::::0;;::::1;::::0;;;49862:22:::1;::::0;11071:51:1;;;49862:22:0::1;::::0;11059:2:1;11044:18;49862:22:0::1;10925:203:1::0;48109:204:0;40109:13;:11;:13::i;:::-;48243:62:::1;::::0;-1:-1:-1;;;48243:62:0;;-1:-1:-1;;;;;48243:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;48264:8;;48274;;48284:11;;48297:7;;;;48243:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;53118:767:::0;53329:27;;;53307:19;53329:27;;;:14;:27;;;;;;:40;;;;53357:11;;;;53329:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53329:48:0;;;;;;;;;;;;-1:-1:-1;53329:48:0;53388:73;;;;-1:-1:-1;;;53388:73:0;;25314:2:1;53388:73:0;;;25296:21:1;25353:2;25333:18;;;25326:30;25392:34;25372:18;;;25365:62;-1:-1:-1;;;25443:18:1;;;25436:33;25486:19;;53388:73:0;25112:399:1;53388:73:0;53503:11;53490:8;;53480:19;;;;;;;:::i;:::-;;;;;;;;:34;53472:80;;;;-1:-1:-1;;;53472:80:0;;25718:2:1;53472:80:0;;;25700:21:1;25757:2;25737:18;;;25730:30;25796:34;25776:18;;;25769:62;-1:-1:-1;;;25847:18:1;;;25840:31;25888:19;;53472:80:0;25516:397:1;53472:80:0;53600:27;;;53659:1;53600:27;;;:14;:27;;;;;;:40;;;;53628:11;;;;53600:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53600:48:0;;;;;;;;;;;;:61;;;;53730:65;;;;;;;;;;;;;;;;;;;53752:11;;53765;;53730:65;;;;;;53765:11;53730:65;;53765:11;53730:65;;;;;;;;;-1:-1:-1;;53730:65:0;;;;;;;;;;;;;;;;;;;;;;53778:6;;-1:-1:-1;53730:65:0;-1:-1:-1;53786:8:0;;;;;;53730:65;;53786:8;;;;53730:65;;;;;;;;;-1:-1:-1;53730:21:0;;-1:-1:-1;;;53730:65:0:i;:::-;53811:66;53831:11;53844;;53857:6;53865:11;53811:66;;;;;;;;;;:::i;:::-;;;;;;;;53251:634;53118:767;;;;;;:::o;75780:151::-;-1:-1:-1;;;;;75896:18:0;;;75869:7;75896:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;75780:151::o;49900:284::-;40109:13;:11;:13::i;:::-;50024:1:::1;50014:7;:11;50006:45;;;::::0;-1:-1:-1;;;50006:45:0;;26618:2:1;50006:45:0::1;::::0;::::1;26600:21:1::0;26657:2;26637:18;;;26630:30;-1:-1:-1;;;26676:18:1;;;26669:51;26737:18;;50006:45:0::1;26416:345:1::0;50006:45:0::1;50062:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;50129:47;;26989:34:1;;;27039:18;;27032:43;;;;27091:18;;;27084:34;;;50129:47:0::1;::::0;26952:2:1;26937:18;50129:47:0::1;26766:358:1::0;56233:223:0;40109:13;:11;:13::i;:::-;56334:22:::1;:48:::0;;-1:-1:-1;;56334:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;56398:50:::1;::::0;2004:41:1;;;56398:50:0::1;::::0;1992:2:1;1977:18;56398:50:0::1;1864:187:1::0;55661:564:0;38854:10;55894:4;55870:29;55862:73;;;;-1:-1:-1;;;55862:73:0;;27331:2:1;55862:73:0;;;27313:21:1;27370:2;27350:18;;;27343:30;27409:33;27389:18;;;27382:61;27460:18;;55862:73:0;27129:355:1;55862:73:0;55975:42;55997:4;56004:3;56009:7;55975:13;:42::i;:::-;55965:52;;56063:3;-1:-1:-1;;;;;56033:43:0;56050:11;56033:43;;;56068:7;56033:43;;;;3860:25:1;;3848:2;3833:18;;3714:177;56033:43:0;;;;;;;;56106:111;;-1:-1:-1;;;56106:111:0;;-1:-1:-1;;;;;56106:33:0;;;;;56145:11;;56106:111;;56158:11;;56171;;;;56184:6;;56192:5;;56199:7;;56208:8;;;;56106:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55661:564;;;;;;;;;;:::o;48914:207::-;40109:13;:11;:13::i;:::-;49015:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;49053:5:::0;;49015:35;:43:::1;:::i;:::-;;49074:39;49091:14;49107:5;;49074:39;;;;;;;;:::i;43107:409::-:0;43238:28;;;;43191:8;43238:28;;;:15;:28;;;;;;;;43212:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43191:8;;43212:54;43277:232;;43328:12;;41872:5;;43318:22;;;;:7;:22;:::i;:::-;:39;;;;:::i;:::-;43312:45;;43277:232;;;43379:12;;;;:16;43375:134;;43428:12;;41872:5;;43418:22;;43428:12;;43418:7;:22;:::i;43375:134::-;43496:1;43490:7;;43375:134;43201:315;43107:409;;;;:::o;41122:201::-;40109:13;:11;:13::i;:::-;-1:-1:-1;;;;;41211:22:0;::::1;41203:73;;;::::0;-1:-1:-1;;;41203:73:0;;30086:2:1;41203:73:0::1;::::0;::::1;30068:21:1::0;30125:2;30105:18;;;30098:30;30164:34;30144:18;;;30137:62;-1:-1:-1;;;30215:18:1;;;30208:36;30261:19;;41203:73:0::1;29884:402:1::0;41203:73:0::1;41287:28;41306:8;41287:18;:28::i;:::-;41122:201:::0;:::o;47836:211::-;47971:68;;-1:-1:-1;;;47971:68:0;;30528:6:1;30561:15;;;47971:68:0;;;30543:34:1;30613:15;;30593:18;;;30586:43;48020:4:0;30645:18:1;;;30638:60;30714:18;;;30707:34;;;47939:12:0;;47971:10;-1:-1:-1;;;;;47971:20:0;;;;30490:19:1;;47971:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47971:68:0;;;;;;;;;;;;:::i;:::-;47964:75;47836:211;-1:-1:-1;;;;;47836:211:0:o;51733:514::-;51883:12;51897:19;51920:153;51954:9;51965:3;51993:34;;;52029:11;52042;52055:6;52063:8;51970:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51970:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;51970:102:0;-1:-1:-1;;;;;;51970:102:0;;;;;;;;;;51928:4;;51920:153;;:33;:153::i;:::-;51882:191;;;;52133:7;52128:112;;52157:71;52177:11;52190;52203:6;52211:8;52221:6;52157:19;:71::i;40388:132::-;40269:7;40296:6;-1:-1:-1;;;;;40296:6:0;38854:10;40452:23;40444:68;;;;-1:-1:-1;;;40444:68:0;;32168:2:1;40444:68:0;;;32150:21:1;;;32187:18;;;32180:30;32246:34;32226:18;;;32219:62;32298:18;;40444:68:0;31966:356:1;82436:346:0;-1:-1:-1;;;;;82538:19:0;;82530:68;;;;-1:-1:-1;;;82530:68:0;;32529:2:1;82530:68:0;;;32511:21:1;32568:2;32548:18;;;32541:30;32607:34;32587:18;;;32580:62;-1:-1:-1;;;32658:18:1;;;32651:34;32702:19;;82530:68:0;32327:400:1;82530:68:0;-1:-1:-1;;;;;82617:21:0;;82609:68;;;;-1:-1:-1;;;82609:68:0;;32934:2:1;82609:68:0;;;32916:21:1;32973:2;32953:18;;;32946:30;33012:34;32992:18;;;32985:62;-1:-1:-1;;;33063:18:1;;;33056:32;33105:19;;82609:68:0;32732:398:1;82609:68:0;-1:-1:-1;;;;;82690:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;82742:32;;3860:25:1;;;82742:32:0;;3833:18:1;82742:32:0;;;;;;;82436:346;;;:::o;83073:419::-;83174:24;83201:25;83211:5;83218:7;83201:9;:25::i;:::-;83174:52;;-1:-1:-1;;83241:16:0;:37;83237:248;;83323:6;83303:16;:26;;83295:68;;;;-1:-1:-1;;;83295:68:0;;33337:2:1;83295:68:0;;;33319:21:1;33376:2;33356:18;;;33349:30;33415:31;33395:18;;;33388:59;33464:18;;83295:68:0;33135:353:1;83295:68:0;83407:51;83416:5;83423:7;83451:6;83432:16;:25;83407:8;:51::i;:::-;83163:329;83073:419;;;:::o;79349:806::-;-1:-1:-1;;;;;79446:18:0;;79438:68;;;;-1:-1:-1;;;79438:68:0;;33695:2:1;79438:68:0;;;33677:21:1;33734:2;33714:18;;;33707:30;33773:34;33753:18;;;33746:62;-1:-1:-1;;;33824:18:1;;;33817:35;33869:19;;79438:68:0;33493:401:1;79438:68:0;-1:-1:-1;;;;;79525:16:0;;79517:64;;;;-1:-1:-1;;;79517:64:0;;34101:2:1;79517:64:0;;;34083:21:1;34140:2;34120:18;;;34113:30;34179:34;34159:18;;;34152:62;-1:-1:-1;;;34230:18:1;;;34223:33;34273:19;;79517:64:0;33899:399:1;79517:64:0;-1:-1:-1;;;;;79667:15:0;;79645:19;79667:15;;;:9;:15;;;;;;79701:21;;;;79693:72;;;;-1:-1:-1;;;79693:72:0;;34505:2:1;79693:72:0;;;34487:21:1;34544:2;34524:18;;;34517:30;34583:34;34563:18;;;34556:62;-1:-1:-1;;;34634:18:1;;;34627:36;34680:19;;79693:72:0;34303:402:1;79693:72:0;-1:-1:-1;;;;;79801:15:0;;;;;;;:9;:15;;;;;;79819:20;;;79801:38;;80019:13;;;;;;;;;;:23;;;;;;80071:26;;;;;;79833:6;3860:25:1;;3848:2;3833:18;;3714:177;80071:26:0;;;;;;;;80110:37;84092:91;43524:294;43619:11;43632:8;43659:33;43671:11;43684:7;43659:11;:33::i;:::-;43653:39;-1:-1:-1;43712:13:0;43653:39;43712:7;:13;:::i;:::-;43703:22;-1:-1:-1;43740:7:0;;43736:75;;43785:8;;43764:35;;43778:5;;43785:8;;;-1:-1:-1;;;;;43785:8:0;43795:3;43764:13;:35::i;:::-;;43736:75;43524:294;;;;;;:::o;58126:774::-;58325:11;58349:71;58369:11;58325;58391:14;58325:11;58349:19;:71::i;:::-;58445:20;58457:7;58445:11;:20::i;:::-;-1:-1:-1;58433:32:0;-1:-1:-1;58485:50:0;58496:5;58503:11;58516:10;58433:32;58485:10;:50::i;:::-;58476:59;;58603:1;58594:6;:10;58586:48;;;;-1:-1:-1;;;58586:48:0;;34912:2:1;58586:48:0;;;34894:21:1;34951:2;34931:18;;;34924:30;-1:-1:-1;;;34970:18:1;;;34963:55;35035:18;;58586:48:0;34710:349:1;58586:48:0;58647:22;58672:46;58691:10;58703:14;58710:6;58703;:14::i;:::-;63267:48;;;54243:1;63267:48;;;39081:49:1;39146:11;;;39139:27;;;;39222:3;39200:16;;;;-1:-1:-1;;;;;;39196:51:1;39182:12;;;39175:73;63267:48:0;;;;;;;;;39264:12:1;;;;63267:48:0;;;63138:185;58672:46;58647:71;;58729:94;58737:11;58750:9;58761:14;58777:18;58797:14;58813:9;58729:7;:94::i;:::-;58873:10;58866:5;-1:-1:-1;;;;;58841:51:0;58853:11;58841:51;;;58885:6;58841:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;58841:51:0;;;;;;;;58338:562;58126:774;;;;;;;;;:::o;56648:419::-;56802:14;56818:11;56886:20;56909:47;56928:10;56940:15;56947:7;56940:6;:15::i;56909:47::-;56974:85;;-1:-1:-1;;;56974:85:0;;56886:70;;-1:-1:-1;;;;;;56974:10:0;:23;;;;:85;;56998:11;;57019:4;;56886:70;;57035:7;;57044:14;;56974:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56967:92;;;;;56648:419;;;;;;;;:::o;59330:911::-;59582:11;59606:82;59626:11;54292:1;59657:14;-1:-1:-1;;;;;59606:82:0;;:19;:82::i;:::-;59713:20;59725:7;59713:11;:20::i;:::-;-1:-1:-1;59701:32:0;-1:-1:-1;59753:50:0;59764:5;59771:11;59784:10;59701:32;59753:10;:50::i;:::-;59744:59;;59831:1;59822:6;:10;59814:48;;;;-1:-1:-1;;;59814:48:0;;34912:2:1;59814:48:0;;;34894:21:1;34951:2;34931:18;;;34924:30;-1:-1:-1;;;34970:18:1;;;34963:55;35035:18;;59814:48:0;34710:349:1;59814:48:0;59943:22;59968:91;59994:10;60006;60018:14;60025:6;60018;:14::i;:::-;60034:8;60044:14;59968:25;:91::i;:::-;59943:116;;60070:94;60078:11;60091:9;60102:14;60118:18;60138:14;60154:9;60070:7;:94::i;:::-;60214:10;60207:5;-1:-1:-1;;;;;60182:51:0;60194:11;60182:51;;;60226:6;60182:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;60182:51:0;;;;;;;;59595:646;59330:911;;;;;;;;;;;:::o;57603:515::-;57755:16;57774:19;:8;57755:16;57774;:19::i;:::-;57755:38;-1:-1:-1;57810:21:0;;;57806:305;;57848:52;57857:11;57870;57883:6;57891:8;57848;:52::i;:::-;57806:305;;;-1:-1:-1;;57922:30:0;;;;57918:193;;57969:59;57985:11;57998;58011:6;58019:8;57969:15;:59::i;57918:193::-;58061:38;;-1:-1:-1;;;58061:38:0;;36163:2:1;58061:38:0;;;36145:21:1;36202:2;36182:18;;;36175:30;36241;36221:18;;;36214:58;36289:18;;58061:38:0;35961:352:1;41483:191:0;41557:16;41576:6;;-1:-1:-1;;;;;41593:17:0;;;-1:-1:-1;;;;;;41593:17:0;;;;;;41626:40;;41576:6;;;;;;;41626:40;;41557:16;41626:40;41546:128;41483:191;:::o;20285:2779::-;20426:12;20480:7;20464:12;20480:7;20474:2;20464:12;:::i;:::-;:23;;20456:50;;;;-1:-1:-1;;;20456:50:0;;36520:2:1;20456:50:0;;;36502:21:1;36559:2;36539:18;;;36532:30;-1:-1:-1;;;36578:18:1;;;36571:44;36632:18;;20456:50:0;36318:338:1;20456:50:0;20542:16;20551:7;20542:6;:16;:::i;:::-;20525:6;:13;:33;;20517:63;;;;-1:-1:-1;;;20517:63:0;;36863:2:1;20517:63:0;;;36845:21:1;36902:2;36882:18;;;36875:30;-1:-1:-1;;;36921:18:1;;;36914:47;36978:18;;20517:63:0;36661:341:1;20517:63:0;20593:22;20659:15;;20688:1933;;;;22765:4;22759:11;22746:24;;22946:1;22935:9;22928:20;22996:4;22985:9;22981:20;22975:4;22968:34;20652:2365;;20688:1933;20865:4;20859:11;20846:24;;21502:2;21493:7;21489:16;21874:9;21867:17;21861:4;21857:28;21845:9;21834;21830:25;21826:60;21923:7;21919:2;21915:16;22172:6;22158:9;22151:17;22145:4;22141:28;22129:9;22121:6;22117:22;22113:57;22109:70;21951:426;22206:3;22202:2;22199:11;21951:426;;;22348:9;;22337:21;;22248:4;22240:13;;;;22281;21951:426;;;-1:-1:-1;;22397:26:0;;;22601:2;22584:11;-1:-1:-1;;22580:25:0;22574:4;22567:39;-1:-1:-1;20652:2365:0;-1:-1:-1;23047:9:0;20285:2779;-1:-1:-1;;;;20285:2779:0:o;57075:520::-;57282:14;57298:11;57369:20;57392:92;57418:10;57430;57442:15;57449:7;57442:6;:15::i;57392:92::-;57502:85;;-1:-1:-1;;;57502:85:0;;57369:115;;-1:-1:-1;;;;;;57502:10:0;:23;;;;:85;;57526:11;;57547:4;;57369:115;;57563:7;;57572:14;;57502:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57495:92;;;;;57075:520;;;;;;;;;;:::o;86548:391::-;86648:4;38854:10;86798:4;-1:-1:-1;;;;;86781:22:0;;;;;;:42;;;86816:7;-1:-1:-1;;;;;86807:16:0;:5;-1:-1:-1;;;;;86807:16:0;;;86781:42;86777:88;;;86825:40;86841:5;86848:7;86857;86825:15;:40::i;:::-;86876:30;86886:5;86893:3;86898:7;86876:9;:30::i;:::-;-1:-1:-1;86924:7:0;;86548:391;-1:-1:-1;;;86548:391:0:o;6753:1275::-;6915:4;6921:12;6983:15;7009:13;7033:24;7070:8;7060:19;;-1:-1:-1;;;;;7060:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7060:19:0;;7033:46;;7561:1;7535;7501:9;7495:16;7466:4;7455:9;7451:20;7420:1;7385:7;7359:4;7340:247;7328:259;;7652:16;7641:27;;7697:8;7688:7;7685:21;7682:78;;;7737:8;7726:19;;7682:78;7843:7;7830:11;7823:28;7961:7;7958:1;7951:4;7938:11;7934:22;7919:50;7998:8;;;;-1:-1:-1;6753:1275:0;-1:-1:-1;;;;;;6753:1275:0:o;52255:323::-;52479:8;52469:19;;;;;;52418:14;:27;52433:11;52418:27;;;;;;;;;;;;;;;52446:11;52418:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52418:48:0;;;;;;;;;:70;;;;52504:66;;;;52518:11;;52531;;52459:6;;52552:8;;52562:7;;52504:66;:::i;:::-;;;;;;;;52255:323;;;;;:::o;84092:91::-;;;;:::o;62192:373::-;62334:22;;;;62330:228;;;62373:63;62388:11;62401:7;62410:14;62426:9;62373:14;:63::i;:::-;62330:228;;;62477:21;;:26;62469:77;;;;-1:-1:-1;;;62469:77:0;;38225:2:1;62469:77:0;;;38207:21:1;38264:2;38244:18;;;38237:30;38303:34;38283:18;;;38276:62;-1:-1:-1;;;38354:18:1;;;38347:36;38400:19;;62469:77:0;38023:402:1;62948:182:0;63014:16;;63061:22;87033:9;63061:7;:22;:::i;:::-;63054:29;-1:-1:-1;63108:14:0;63054:29;63108:7;:14;:::i;:::-;63094:28;;62948:182;;;:::o;86074:286::-;86175:4;38854:10;-1:-1:-1;;;;;86237:16:0;;;;86233:62;;86255:40;86271:5;86278:7;86287;86255:15;:40::i;:::-;86306:21;86312:5;86319:7;86306:5;:21::i;:::-;-1:-1:-1;86345:7:0;;86074:286;-1:-1:-1;;;;86074:286:0:o;62573:238::-;62634:6;;62669:22;87033:9;62669:7;:22;:::i;:::-;62653:38;-1:-1:-1;;;;;;62710:28:0;;;62702:67;;;;-1:-1:-1;;;62702:67:0;;38749:2:1;62702:67:0;;;38731:21:1;38788:2;38768:18;;;38761:30;38827:28;38807:18;;;38800:56;38873:18;;62702:67:0;38547:350:1;46074:553:0;46297:32;;;46268:26;46297:32;;;:19;:32;;;;;46268:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46348:13;:20;46372:1;46348:25;46340:86;;;;-1:-1:-1;;;46340:86:0;;39489:2:1;46340:86:0;;;39471:21:1;39528:2;39508:18;;;39501:30;39567:34;39547:18;;;39540:62;-1:-1:-1;;;39618:18:1;;;39611:46;39674:19;;46340:86:0;39287:412:1;46340:86:0;46437:47;46455:11;46468:8;:15;46437:17;:47::i;:::-;46495:124;;-1:-1:-1;;;46495:124:0;;-1:-1:-1;;;;;46495:10:0;:15;;;;46518:10;;46495:124;;46530:11;;46543:13;;46558:8;;46568:14;;46584:18;;46604:14;;46495:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46257:370;46074:553;;;;;;:::o;63682:403::-;63847:12;54292:1;63941:10;63966:9;-1:-1:-1;;;;;64753:23:0;;64029:14;64058:8;63879:198;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63872:205;;63682:403;;;;;;;:::o;23443:311::-;23520:5;23563:10;:6;23572:1;23563:10;:::i;:::-;23546:6;:13;:27;;23538:60;;;;-1:-1:-1;;;23538:60:0;;41483:2:1;23538:60:0;;;41465:21:1;41522:2;41502:18;;;41495:30;-1:-1:-1;;;41541:18:1;;;41534:49;41600:18;;23538:60:0;41281:343:1;23538:60:0;-1:-1:-1;23678:29:0;23694:3;23678:29;23672:36;;23443:311::o;58908:414::-;59020:10;59032:15;59051:28;59070:8;59051:18;:28::i;:::-;59019:60;;-1:-1:-1;59019:60:0;-1:-1:-1;;;;;;59094:16:0;;59090:69;;59140:6;59127:20;;59090:69;59171:11;59185:16;59192:8;59185:6;:16::i;:::-;59171:30;;59221:34;59231:11;59244:2;59248:6;59221:9;:34::i;:::-;59212:43;;59303:2;-1:-1:-1;;;;;59273:41:0;59290:11;59273:41;;;59307:6;59273:41;;;;3860:25:1;;3848:2;3833:18;;3714:177;59273:41:0;;;;;;;;59008:314;;;58908:414;;;;:::o;60249:1809::-;60387:12;60401:10;60413:15;60430:27;60459:17;60480:35;60506:8;60480:25;:35::i;:::-;60386:129;;;;;;;;;;60528:13;60544:15;:28;60560:11;60544:28;;;;;;;;;;;;;;;60573:11;60544:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60544:49:0;;;;;;;;;;;;;;-1:-1:-1;60618:16:0;60625:8;60618:6;:16::i;:::-;60604:30;;60762:8;60757:167;;60796:45;60806:11;60827:4;60834:6;60796:9;:45::i;:::-;60856:28;;;;;;;:15;:28;;;;;;;:41;;60787:54;;-1:-1:-1;60908:4:0;;60856:41;;60885:11;;60856:41;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60856:49:0;;;;;;;;;;:56;;-1:-1:-1;;60856:56:0;;;;;;;;;;60757:167;-1:-1:-1;;;;;62152:20:0;;;60936:97;;60978:22;;-1:-1:-1;;;;;11089:32:1;;11071:51;;60978:22:0;;11059:2:1;11044:18;60978:22:0;;;;;;;61015:7;;;;;;;;;60936:97;61107:11;61155;61192:6;61232:8;61267:4;61296:2;61324:6;61372:14;61087:17;61457:8;:33;;61480:10;-1:-1:-1;;;;;61457:33:0;;;;61468:9;61457:33;61446:44;;61502:12;61516:19;61539:180;61573:9;61584:3;61612:31;;;61645:10;61657;61669:5;61676;61683:3;61688:7;61697:15;61714:3;61589:129;;;;;;;;;;;;;;;:::i;61539:180::-;61501:218;;;;61736:7;61732:319;;;61775:18;;;;;;61813:59;;;;;;;;;;61848:10;;61860:5;;61775:18;;61813:59;:::i;:::-;;;;;;;;61745:139;61732:319;;;61972:67;61992:10;62004;62016:5;62023:7;62032:6;61972:19;:67::i;:::-;60375:1683;;;;;;;;;;;;;;;;;;60249:1809;;;;:::o;46635:420::-;46771:21;46795:28;46808:14;46795:12;:28::i;:::-;46853;;;;46834:16;46853:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;;;46771:52;;-1:-1:-1;46834:16:0;46853:47;;46891:9;;46853:47;:::i;:::-;46834:66;;46933:1;46919:11;:15;46911:54;;;;-1:-1:-1;;;46911:54:0;;43115:2:1;46911:54:0;;;43097:21:1;43154:2;43134:18;;;43127:30;43193:28;43173:18;;;43166:56;43239:18;;46911:54:0;42913:350:1;46911:54:0;47004:11;46984:16;:31;;46976:71;;;;-1:-1:-1;;;46976:71:0;;43470:2:1;46976:71:0;;;43452:21:1;43509:2;43489:18;;;43482:30;43548:29;43528:18;;;43521:57;43595:18;;46976:71:0;43268:351:1;81323:675:0;-1:-1:-1;;;;;81407:21:0;;81399:67;;;;-1:-1:-1;;;81399:67:0;;43826:2:1;81399:67:0;;;43808:21:1;43865:2;43845:18;;;43838:30;43904:34;43884:18;;;43877:62;-1:-1:-1;;;43955:18:1;;;43948:31;43996:19;;81399:67:0;43624:397:1;81399:67:0;-1:-1:-1;;;;;81566:18:0;;81541:22;81566:18;;;:9;:18;;;;;;81603:24;;;;81595:71;;;;-1:-1:-1;;;81595:71:0;;44228:2:1;81595:71:0;;;44210:21:1;44267:2;44247:18;;;44240:30;44306:34;44286:18;;;44279:62;-1:-1:-1;;;44357:18:1;;;44350:32;44399:19;;81595:71:0;44026:398:1;81595:71:0;-1:-1:-1;;;;;81702:18:0;;;;;;:9;:18;;;;;;;;81723:23;;;81702:44;;81841:12;:22;;;;;;;81892:37;3860:25:1;;;81702:18:0;;;81892:37;;3833:18:1;81892:37:0;;;;;;;84092:91;;;:::o;47342:389::-;47465:35;;;47441:21;47465:35;;;:22;:35;;;;;;;47515:21;;;47511:125;;-1:-1:-1;44368:5:0;47511:125;47670:16;47654:12;:32;;47646:77;;;;-1:-1:-1;;;47646:77:0;;44631:2:1;47646:77:0;;;44613:21:1;;;44650:18;;;44643:30;44709:34;44689:18;;;44682:62;44761:18;;47646:77:0;44429:356:1;63331:343:0;63413:10;;;63461:19;:8;63413:10;63461:16;:19::i;:::-;:30;;;:55;;;;;63495:8;:15;63514:2;63495:21;63461:55;63453:92;;;;-1:-1:-1;;;63453:92:0;;44992:2:1;63453:92:0;;;44974:21:1;45031:2;45011:18;;;45004:30;-1:-1:-1;;;45050:18:1;;;45043:54;45114:18;;63453:92:0;44790:348:1;63453:92:0;63563:22;:8;63582:2;63563:18;:22::i;:::-;63558:27;-1:-1:-1;63645:21:0;:8;63663:2;63645:17;:21::i;:::-;63634:32;;63331:343;;;:::o;62819:121::-;62884:4;62908:24;87033:9;-1:-1:-1;;;;;62908:24:0;;;:::i;86368:172::-;86464:4;86481:26;86487:10;86499:7;86481:5;:26::i;64093:541::-;64182:12;;;64225:20;64182:12;54292:1;64288:19;:8;64182:12;64288:16;:19::i;:::-;:39;;;64280:76;;;;-1:-1:-1;;;64280:76:0;;44992:2:1;64280:76:0;;;44974:21:1;45031:2;45011:18;;;45004:30;-1:-1:-1;;;45050:18:1;;;45043:54;45114:18;;64280:76:0;44790:348:1;64280:76:0;64374:22;:8;64393:2;64374:18;:22::i;:::-;64369:27;-1:-1:-1;64456:21:0;:8;64474:2;64456:17;:21::i;:::-;64445:32;-1:-1:-1;64495:22:0;:8;64514:2;64495:18;:22::i;:::-;64488:29;-1:-1:-1;64544:21:0;:8;64562:2;64544:17;:21::i;:::-;64528:37;;64586:40;64601:2;64623;64605:8;:15;:20;;;;:::i;:::-;64586:8;;:40;:14;:40::i;:::-;64576:50;;64093:541;;;;;;;:::o;47063:271::-;47145:13;47204:2;47179:14;:21;:27;;47171:68;;;;-1:-1:-1;;;47171:68:0;;45345:2:1;47171:68:0;;;45327:21:1;45384:2;45364:18;;;45357:30;45423;45403:18;;;45396:58;45471:18;;47171:68:0;45143:352:1;47171:68:0;-1:-1:-1;47312:2:0;47292:23;47286:30;;47063:271::o;23072:363::-;23151:7;23196:11;:6;23205:2;23196:11;:::i;:::-;23179:6;:13;:28;;23171:62;;;;-1:-1:-1;;;23171:62:0;;45702:2:1;23171:62:0;;;45684:21:1;45741:2;45721:18;;;45714:30;-1:-1:-1;;;45760:18:1;;;45753:51;45821:18;;23171:62:0;45500:345:1;23171:62:0;-1:-1:-1;23325:30:0;23341:4;23325:30;23319:37;-1:-1:-1;;;23315:71:0;;;23072:363::o;24406:314::-;24484:6;24528:10;:6;24537:1;24528:10;:::i;:::-;24511:6;:13;:27;;24503:60;;;;-1:-1:-1;;;24503:60:0;;46052:2:1;24503:60:0;;;46034:21:1;46091:2;46071:18;;;46064:30;-1:-1:-1;;;46110:18:1;;;46103:50;46170:18;;24503:60:0;45850:344:1;24503:60:0;-1:-1:-1;24644:29:0;24660:3;24644:29;24638:36;;24406:314::o;80442:548::-;-1:-1:-1;;;;;80526:21:0;;80518:65;;;;-1:-1:-1;;;80518:65:0;;46401:2:1;80518:65:0;;;46383:21:1;46440:2;46420:18;;;46413:30;46479:33;46459:18;;;46452:61;46530:18;;80518:65:0;46199:355:1;80518:65:0;80674:6;80658:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;80829:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;80884:37;3860:25:1;;;80884:37:0;;3833:18:1;80884:37:0;;;;;;;80442:548;;:::o;25707:329::-;25786:7;25831:11;:6;25840:2;25831:11;:::i;:::-;25814:6;:13;:28;;25806:62;;;;-1:-1:-1;;;25806:62:0;;46761:2:1;25806:62:0;;;46743:21:1;46800:2;46780:18;;;46773:30;-1:-1:-1;;;46819:18:1;;;46812:51;46880:18;;25806:62:0;46559:345:1;25806:62:0;-1:-1:-1;25956:30:0;25972:4;25956:30;25950:37;;25707:329::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:286::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1726:23;;-1:-1:-1;;;;;;1778:32:1;;1768:43;;1758:71;;1825:1;1822;1815:12;2056:250;2141:1;2151:113;2165:6;2162:1;2159:13;2151:113;;;2241:11;;;2235:18;2222:11;;;2215:39;2187:2;2180:10;2151:113;;;-1:-1:-1;;2298:1:1;2280:16;;2273:27;2056:250::o;2311:271::-;2353:3;2391:5;2385:12;2418:6;2413:3;2406:19;2434:76;2503:6;2496:4;2491:3;2487:14;2480:4;2473:5;2469:16;2434:76;:::i;:::-;2564:2;2543:15;-1:-1:-1;;2539:29:1;2530:39;;;;2571:4;2526:50;;2311:271;-1:-1:-1;;2311:271:1:o;2587:220::-;2736:2;2725:9;2718:21;2699:4;2756:45;2797:2;2786:9;2782:18;2774:6;2756:45;:::i;2812:184::-;2870:6;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2962:28;2980:9;2962:28;:::i;3001:131::-;-1:-1:-1;;;;;3076:31:1;;3066:42;;3056:70;;3122:1;3119;3112:12;3137:315;3205:6;3213;3266:2;3254:9;3245:7;3241:23;3237:32;3234:52;;;3282:1;3279;3272:12;3234:52;3321:9;3308:23;3340:31;3365:5;3340:31;:::i;:::-;3390:5;3442:2;3427:18;;;;3414:32;;-1:-1:-1;;;3137:315:1:o;3457:252::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;3896:456::-;3973:6;3981;3989;4042:2;4030:9;4021:7;4017:23;4013:32;4010:52;;;4058:1;4055;4048:12;4010:52;4097:9;4084:23;4116:31;4141:5;4116:31;:::i;:::-;4166:5;-1:-1:-1;4223:2:1;4208:18;;4195:32;4236:33;4195:32;4236:33;:::i;:::-;3896:456;;4288:7;;-1:-1:-1;;;4342:2:1;4327:18;;;;4314:32;;3896:456::o;4357:160::-;4422:5;4467:2;4458:6;4453:3;4449:16;4445:25;4442:45;;;4483:1;4480;4473:12;4442:45;-1:-1:-1;4505:6:1;4357:160;-1:-1:-1;4357:160:1:o;4522:778::-;4655:6;4663;4671;4679;4687;4695;4748:3;4736:9;4727:7;4723:23;4719:33;4716:53;;;4765:1;4762;4755:12;4716:53;4804:9;4791:23;4823:31;4848:5;4823:31;:::i;:::-;4873:5;-1:-1:-1;4897:37:1;4930:2;4915:18;;4897:37;:::i;:::-;4887:47;;4981:2;4970:9;4966:18;4953:32;4943:42;;5032:2;5021:9;5017:18;5004:32;4994:42;;5083:3;5072:9;5068:19;5055:33;5045:43;;5139:3;5128:9;5124:19;5111:33;-1:-1:-1;;;;;5159:6:1;5156:30;5153:50;;;5199:1;5196;5189:12;5153:50;5222:72;5286:7;5277:6;5266:9;5262:22;5222:72;:::i;:::-;5212:82;;;4522:778;;;;;;;;:::o;5494:160::-;5559:20;;5615:13;;5608:21;5598:32;;5588:60;;5644:1;5641;5634:12;5659:687;5761:6;5769;5777;5785;5793;5801;5854:3;5842:9;5833:7;5829:23;5825:33;5822:53;;;5871:1;5868;5861:12;5822:53;5894:28;5912:9;5894:28;:::i;:::-;5884:38;;5969:2;5958:9;5954:18;5941:32;5931:42;;6020:2;6009:9;6005:18;5992:32;5982:42;;6043:35;6074:2;6063:9;6059:18;6043:35;:::i;:::-;6033:45;;6129:3;6118:9;6114:19;6101:33;-1:-1:-1;;;;;6149:6:1;6146:30;6143:50;;;6189:1;6186;6179:12;6143:50;6228:58;6278:7;6269:6;6258:9;6254:22;6228:58;:::i;6604:481::-;6682:6;6690;6698;6751:2;6739:9;6730:7;6726:23;6722:32;6719:52;;;6767:1;6764;6757:12;6719:52;6790:28;6808:9;6790:28;:::i;:::-;6780:38;;6869:2;6858:9;6854:18;6841:32;-1:-1:-1;;;;;6888:6:1;6885:30;6882:50;;;6928:1;6925;6918:12;6882:50;6967:58;7017:7;7008:6;6997:9;6993:22;6967:58;:::i;:::-;6604:481;;7044:8;;-1:-1:-1;6941:84:1;;-1:-1:-1;;;;6604:481:1:o;7090:1160::-;7251:6;7259;7267;7275;7283;7291;7299;7307;7315;7368:3;7356:9;7347:7;7343:23;7339:33;7336:53;;;7385:1;7382;7375:12;7336:53;7424:9;7411:23;7443:31;7468:5;7443:31;:::i;:::-;7493:5;-1:-1:-1;7517:37:1;7550:2;7535:18;;7517:37;:::i;:::-;7507:47;;7601:2;7590:9;7586:18;7573:32;7563:42;;7652:2;7641:9;7637:18;7624:32;7614:42;;7703:3;7692:9;7688:19;7675:33;7665:43;;7759:3;7748:9;7744:19;7731:33;-1:-1:-1;;;;;7824:2:1;7816:6;7813:14;7810:34;;;7840:1;7837;7830:12;7810:34;7879:58;7929:7;7920:6;7909:9;7905:22;7879:58;:::i;:::-;7956:8;;-1:-1:-1;7853:84:1;-1:-1:-1;7853:84:1;;-1:-1:-1;8010:38:1;8043:3;8028:19;;8010:38;:::i;:::-;8000:48;;8101:3;8090:9;8086:19;8073:33;8057:49;;8131:2;8121:8;8118:16;8115:36;;;8147:1;8144;8137:12;8115:36;;8170:74;8236:7;8225:8;8214:9;8210:24;8170:74;:::i;:::-;8160:84;;;7090:1160;;;;;;;;;;;:::o;8255:247::-;8314:6;8367:2;8355:9;8346:7;8342:23;8338:32;8335:52;;;8383:1;8380;8373:12;8335:52;8422:9;8409:23;8441:31;8466:5;8441:31;:::i;8507:127::-;8568:10;8563:3;8559:20;8556:1;8549:31;8599:4;8596:1;8589:15;8623:4;8620:1;8613:15;8639:275;8710:2;8704:9;8775:2;8756:13;;-1:-1:-1;;8752:27:1;8740:40;;-1:-1:-1;;;;;8795:34:1;;8831:22;;;8792:62;8789:88;;;8857:18;;:::i;:::-;8893:2;8886:22;8639:275;;-1:-1:-1;8639:275:1:o;8919:186::-;8967:4;-1:-1:-1;;;;;8992:6:1;8989:30;8986:56;;;9022:18;;:::i;:::-;-1:-1:-1;9088:2:1;9067:15;-1:-1:-1;;9063:29:1;9094:4;9059:40;;8919:186::o;9110:815::-;9194:6;9202;9210;9263:2;9251:9;9242:7;9238:23;9234:32;9231:52;;;9279:1;9276;9269:12;9231:52;9302:28;9320:9;9302:28;:::i;:::-;9292:38;;9381:2;9370:9;9366:18;9353:32;-1:-1:-1;;;;;9400:6:1;9397:30;9394:50;;;9440:1;9437;9430:12;9394:50;9463:22;;9516:4;9508:13;;9504:27;-1:-1:-1;9494:55:1;;9545:1;9542;9535:12;9494:55;9581:2;9568:16;9606:48;9622:31;9650:2;9622:31;:::i;:::-;9606:48;:::i;:::-;9677:2;9670:5;9663:17;9717:7;9712:2;9707;9703;9699:11;9695:20;9692:33;9689:53;;;9738:1;9735;9728:12;9689:53;9793:2;9788;9784;9780:11;9775:2;9768:5;9764:14;9751:45;9837:1;9832:2;9827;9820:5;9816:14;9812:23;9805:34;9858:5;9848:15;;;;;9882:37;9915:2;9904:9;9900:18;9882:37;:::i;:::-;9872:47;;9110:815;;;;;:::o;10335:324::-;10407:6;10415;10423;10476:2;10464:9;10455:7;10451:23;10447:32;10444:52;;;10492:1;10489;10482:12;10444:52;10515:28;10533:9;10515:28;:::i;:::-;10505:38;;10562:35;10593:2;10582:9;10578:18;10562:35;:::i;:::-;10552:45;;10616:37;10649:2;10638:9;10634:18;10616:37;:::i;10664:256::-;10730:6;10738;10791:2;10779:9;10770:7;10766:23;10762:32;10759:52;;;10807:1;10804;10797:12;10759:52;10830:28;10848:9;10830:28;:::i;:::-;10820:38;;10877:37;10910:2;10899:9;10895:18;10877:37;:::i;:::-;10867:47;;10664:256;;;;;:::o;11133:1069::-;11263:6;11271;11279;11287;11295;11303;11311;11319;11327;11380:3;11368:9;11359:7;11355:23;11351:33;11348:53;;;11397:1;11394;11387:12;11348:53;11420:28;11438:9;11420:28;:::i;:::-;11410:38;;11495:2;11484:9;11480:18;11467:32;11457:42;;11546:2;11535:9;11531:18;11518:32;11508:42;;11601:2;11590:9;11586:18;11573:32;-1:-1:-1;;;;;11665:2:1;11657:6;11654:14;11651:34;;;11681:1;11678;11671:12;11651:34;11720:58;11770:7;11761:6;11750:9;11746:22;11720:58;:::i;:::-;11797:8;;-1:-1:-1;11694:84:1;-1:-1:-1;11694:84:1;;-1:-1:-1;11851:38:1;11884:3;11869:19;;11851:38;:::i;:::-;11841:48;;11908:36;11939:3;11928:9;11924:19;11908:36;:::i;:::-;11898:46;;11997:3;11986:9;11982:19;11969:33;11953:49;;12027:2;12017:8;12014:16;12011:36;;;12043:1;12040;12033:12;12011:36;;12082:60;12134:7;12123:8;12112:9;12108:24;12082:60;:::i;:::-;12056:86;;12161:8;12151:18;;;12188:8;12178:18;;;11133:1069;;;;;;;;;;;:::o;12715:622::-;12810:6;12818;12826;12834;12842;12895:3;12883:9;12874:7;12870:23;12866:33;12863:53;;;12912:1;12909;12902:12;12863:53;12935:28;12953:9;12935:28;:::i;:::-;12925:38;;12982:37;13015:2;13004:9;13000:18;12982:37;:::i;:::-;12972:47;;13066:2;13055:9;13051:18;13038:32;13028:42;;13121:2;13110:9;13106:18;13093:32;-1:-1:-1;;;;;13140:6:1;13137:30;13134:50;;;13180:1;13177;13170:12;13134:50;13219:58;13269:7;13260:6;13249:9;13245:22;13219:58;:::i;:::-;12715:622;;;;-1:-1:-1;12715:622:1;;-1:-1:-1;13296:8:1;;13193:84;12715:622;-1:-1:-1;;;12715:622:1:o;13535:388::-;13603:6;13611;13664:2;13652:9;13643:7;13639:23;13635:32;13632:52;;;13680:1;13677;13670:12;13632:52;13719:9;13706:23;13738:31;13763:5;13738:31;:::i;:::-;13788:5;-1:-1:-1;13845:2:1;13830:18;;13817:32;13858:33;13817:32;13858:33;:::i;:::-;13910:7;13900:17;;;13535:388;;;;;:::o;13928:324::-;14003:6;14011;14019;14072:2;14060:9;14051:7;14047:23;14043:32;14040:52;;;14088:1;14085;14078:12;14040:52;14111:28;14129:9;14111:28;:::i;:::-;14101:38;;14158:37;14191:2;14180:9;14176:18;14158:37;:::i;:::-;14148:47;;14242:2;14231:9;14227:18;14214:32;14204:42;;13928:324;;;;;:::o;14257:180::-;14313:6;14366:2;14354:9;14345:7;14341:23;14337:32;14334:52;;;14382:1;14379;14372:12;14334:52;14405:26;14421:9;14405:26;:::i;14442:1205::-;14584:6;14592;14600;14608;14616;14624;14632;14640;14648;14656;14709:3;14697:9;14688:7;14684:23;14680:33;14677:53;;;14726:1;14723;14716:12;14677:53;14749:28;14767:9;14749:28;:::i;:::-;14739:38;;14828:2;14817:9;14813:18;14800:32;-1:-1:-1;;;;;14892:2:1;14884:6;14881:14;14878:34;;;14908:1;14905;14898:12;14878:34;14947:58;14997:7;14988:6;14977:9;14973:22;14947:58;:::i;:::-;15024:8;;-1:-1:-1;14921:84:1;-1:-1:-1;14921:84:1;;-1:-1:-1;15078:37:1;15111:2;15096:18;;15078:37;:::i;:::-;15068:47;;15162:2;15151:9;15147:18;15134:32;15124:42;;15216:3;15205:9;15201:19;15188:33;15175:46;;15230:31;15255:5;15230:31;:::i;:::-;15280:5;;-1:-1:-1;15332:3:1;15317:19;;15304:33;;-1:-1:-1;15390:3:1;15375:19;;15362:33;;15407:16;;;15404:36;;;15436:1;15433;15426:12;15404:36;;15475:60;15527:7;15516:8;15505:9;15501:24;15475:60;:::i;:::-;15449:86;;15554:8;15544:18;;;15581:8;15571:18;;;15636:3;15625:9;15621:19;15608:33;15598:43;;14442:1205;;;;;;;;;;;;;:::o;15652:460::-;15736:6;15744;15752;15760;15813:3;15801:9;15792:7;15788:23;15784:33;15781:53;;;15830:1;15827;15820:12;15781:53;15853:28;15871:9;15853:28;:::i;:::-;15843:38;;15900:37;15933:2;15922:9;15918:18;15900:37;:::i;:::-;15890:47;;15987:2;15976:9;15972:18;15959:32;16000:31;16025:5;16000:31;:::i;:::-;15652:460;;;;-1:-1:-1;16050:5:1;;16102:2;16087:18;16074:32;;-1:-1:-1;;15652:460:1:o;16476:380::-;16555:1;16551:12;;;;16598;;;16619:61;;16673:4;16665:6;16661:17;16651:27;;16619:61;16726:2;16718:6;16715:14;16695:18;16692:38;16689:161;;16772:10;16767:3;16763:20;16760:1;16753:31;16807:4;16804:1;16797:15;16835:4;16832:1;16825:15;16861:271;17044:6;17036;17031:3;17018:33;17000:3;17070:16;;17095:13;;;17070:16;16861:271;-1:-1:-1;16861:271:1:o;17804:521::-;17881:4;17887:6;17947:11;17934:25;18041:2;18037:7;18026:8;18010:14;18006:29;18002:43;17982:18;17978:68;17968:96;;18060:1;18057;18050:12;17968:96;18087:33;;18139:20;;;-1:-1:-1;;;;;;18171:30:1;;18168:50;;;18214:1;18211;18204:12;18168:50;18247:4;18235:17;;-1:-1:-1;18278:14:1;18274:27;;;18264:38;;18261:58;;;18315:1;18312;18305:12;18330:409;18532:2;18514:21;;;18571:2;18551:18;;;18544:30;18610:34;18605:2;18590:18;;18583:62;-1:-1:-1;;;18676:2:1;18661:18;;18654:43;18729:3;18714:19;;18330:409::o;18744:127::-;18805:10;18800:3;18796:20;18793:1;18786:31;18836:4;18833:1;18826:15;18860:4;18857:1;18850:15;18876:125;18941:9;;;18962:10;;;18959:36;;;18975:18;;:::i;19006:266::-;19094:6;19089:3;19082:19;19146:6;19139:5;19132:4;19127:3;19123:14;19110:43;-1:-1:-1;19198:1:1;19173:16;;;19191:4;19169:27;;;19162:38;;;;19254:2;19233:15;;;-1:-1:-1;;19229:29:1;19220:39;;;19216:50;;19006:266::o;19277:326::-;19472:6;19464;19460:19;19449:9;19442:38;19516:2;19511;19500:9;19496:18;19489:30;19423:4;19536:61;19593:2;19582:9;19578:18;19570:6;19562;19536:61;:::i;19963:401::-;20165:2;20147:21;;;20204:2;20184:18;;;20177:30;20243:34;20238:2;20223:18;;20216:62;-1:-1:-1;;;20309:2:1;20294:18;;20287:35;20354:3;20339:19;;19963:401::o;21507:128::-;21574:9;;;21595:11;;;21592:37;;;21609:18;;:::i;22046:360::-;22257:6;22249;22244:3;22231:33;22327:2;22323:15;;;;-1:-1:-1;;22319:53:1;22283:16;;22308:65;;;22397:2;22389:11;;22046:360;-1:-1:-1;22046:360:1:o;22536:544::-;22637:2;22632:3;22629:11;22626:448;;;22673:1;22698:5;22694:2;22687:17;22743:4;22739:2;22729:19;22813:2;22801:10;22797:19;22794:1;22790:27;22784:4;22780:38;22849:4;22837:10;22834:20;22831:47;;;-1:-1:-1;22872:4:1;22831:47;22927:2;22922:3;22918:12;22915:1;22911:20;22905:4;22901:31;22891:41;;22982:82;23000:2;22993:5;22990:13;22982:82;;;23045:17;;;23026:1;23015:13;22982:82;;23256:1348;23380:3;23374:10;-1:-1:-1;;;;;23399:6:1;23396:30;23393:56;;;23429:18;;:::i;:::-;23458:96;23547:6;23507:38;23539:4;23533:11;23507:38;:::i;:::-;23501:4;23458:96;:::i;:::-;23609:4;;23673:2;23662:14;;23690:1;23685:662;;;;24391:1;24408:6;24405:89;;;-1:-1:-1;24460:19:1;;;24454:26;24405:89;-1:-1:-1;;23213:1:1;23209:11;;;23205:24;23201:29;23191:40;23237:1;23233:11;;;23188:57;24507:81;;23655:943;;23685:662;22483:1;22476:14;;;22520:4;22507:18;;-1:-1:-1;;23721:20:1;;;23838:236;23852:7;23849:1;23846:14;23838:236;;;23941:19;;;23935:26;23920:42;;24033:27;;;;24001:1;23989:14;;;;23868:19;;23838:236;;;23842:3;24102:6;24093:7;24090:19;24087:201;;;24163:19;;;24157:26;-1:-1:-1;;24246:1:1;24242:14;;;24258:3;24238:24;24234:37;24230:42;24215:58;24200:74;;24087:201;-1:-1:-1;;;;;24334:1:1;24318:14;;;24314:22;24301:36;;-1:-1:-1;23256:1348:1:o;24609:498::-;24809:4;24838:6;24883:2;24875:6;24871:15;24860:9;24853:34;24935:2;24927:6;24923:15;24918:2;24907:9;24903:18;24896:43;;24975:6;24970:2;24959:9;24955:18;24948:34;25018:3;25013:2;25002:9;24998:18;24991:31;25039:62;25096:3;25085:9;25081:19;25073:6;25065;25039:62;:::i;:::-;25031:70;24609:498;-1:-1:-1;;;;;;;24609:498:1:o;25918:493::-;26167:6;26159;26155:19;26144:9;26137:38;26211:3;26206:2;26195:9;26191:18;26184:31;26118:4;26232:62;26289:3;26278:9;26274:19;26266:6;26258;26232:62;:::i;:::-;-1:-1:-1;;;;;26330:31:1;;;;26325:2;26310:18;;26303:59;-1:-1:-1;26393:2:1;26378:18;26371:34;26224:70;25918:493;-1:-1:-1;;;25918:493:1:o;27489:753::-;27822:6;27814;27810:19;27799:9;27792:38;27866:3;27861:2;27850:9;27846:18;27839:31;27773:4;27893:62;27950:3;27939:9;27935:19;27927:6;27919;27893:62;:::i;:::-;-1:-1:-1;;;;;27995:6:1;27991:31;27986:2;27975:9;27971:18;27964:59;28059:6;28054:2;28043:9;28039:18;28032:34;28103:6;28097:3;28086:9;28082:19;28075:35;28159:9;28151:6;28147:22;28141:3;28130:9;28126:19;28119:51;28187:49;28229:6;28221;28213;28187:49;:::i;:::-;28179:57;27489:753;-1:-1:-1;;;;;;;;;;;27489:753:1:o;28247:1202::-;-1:-1:-1;;;;;28364:3:1;28361:27;28358:53;;;28391:18;;:::i;:::-;28420:93;28509:3;28469:38;28501:4;28495:11;28469:38;:::i;:::-;28463:4;28420:93;:::i;:::-;28539:1;28564:2;28559:3;28556:11;28581:1;28576:615;;;;29235:1;29252:3;29249:93;;;-1:-1:-1;29308:19:1;;;29295:33;29249:93;-1:-1:-1;;23213:1:1;23209:11;;;23205:24;23201:29;23191:40;23237:1;23233:11;;;23188:57;29355:78;;28549:894;;28576:615;22483:1;22476:14;;;22520:4;22507:18;;-1:-1:-1;;28612:17:1;;;28712:9;28734:229;28748:7;28745:1;28742:14;28734:229;;;28837:19;;;28824:33;28809:49;;28944:4;28929:20;;;;28897:1;28885:14;;;;28764:12;28734:229;;;28738:3;28991;28982:7;28979:16;28976:159;;;29115:1;29111:6;29105:3;29099;29096:1;29092:11;29088:21;29084:34;29080:39;29067:9;29062:3;29058:19;29045:33;29041:79;29033:6;29026:95;28976:159;;;29178:1;29172:3;29169:1;29165:11;29161:19;29155:4;29148:33;28549:894;;28247:1202;;;:::o;29454:168::-;29527:9;;;29558;;29575:15;;;29569:22;;29555:37;29545:71;;29596:18;;:::i;29627:127::-;29688:10;29683:3;29679:20;29676:1;29669:31;29719:4;29716:1;29709:15;29743:4;29740:1;29733:15;29759:120;29799:1;29825;29815:35;;29830:18;;:::i;:::-;-1:-1:-1;29864:9:1;;29759:120::o;30752:647::-;30831:6;30884:2;30872:9;30863:7;30859:23;30855:32;30852:52;;;30900:1;30897;30890:12;30852:52;30933:9;30927:16;-1:-1:-1;;;;;30958:6:1;30955:30;30952:50;;;30998:1;30995;30988:12;30952:50;31021:22;;31074:4;31066:13;;31062:27;-1:-1:-1;31052:55:1;;31103:1;31100;31093:12;31052:55;31132:2;31126:9;31157:48;31173:31;31201:2;31173:31;:::i;31157:48::-;31228:2;31221:5;31214:17;31268:7;31263:2;31258;31254;31250:11;31246:20;31243:33;31240:53;;;31289:1;31286;31279:12;31240:53;31302:67;31366:2;31361;31354:5;31350:14;31345:2;31341;31337:11;31302:67;:::i;31404:557::-;31661:6;31653;31649:19;31638:9;31631:38;31705:3;31700:2;31689:9;31685:18;31678:31;31612:4;31732:46;31773:3;31762:9;31758:19;31750:6;31732:46;:::i;:::-;-1:-1:-1;;;;;31818:6:1;31814:31;31809:2;31798:9;31794:18;31787:59;31894:9;31886:6;31882:22;31877:2;31866:9;31862:18;31855:50;31922:33;31948:6;31940;31922:33;:::i;35064:642::-;35345:6;35333:19;;35315:38;;-1:-1:-1;;;;;35389:32:1;;35384:2;35369:18;;35362:60;35409:3;35453:2;35438:18;;35431:31;;;-1:-1:-1;;35485:46:1;;35511:19;;35503:6;35485:46;:::i;:::-;35581:6;35574:14;35567:22;35562:2;35551:9;35547:18;35540:50;35639:9;35631:6;35627:22;35621:3;35610:9;35606:19;35599:51;35667:33;35693:6;35685;35667:33;:::i;:::-;35659:41;35064:642;-1:-1:-1;;;;;;;;35064:642:1:o;35711:245::-;35790:6;35798;35851:2;35839:9;35830:7;35826:23;35822:32;35819:52;;;35867:1;35864;35857:12;35819:52;-1:-1:-1;;35890:16:1;;35946:2;35931:18;;;35925:25;35890:16;;35925:25;;-1:-1:-1;35711:245:1:o;37007:287::-;37136:3;37174:6;37168:13;37190:66;37249:6;37244:3;37237:4;37229:6;37225:17;37190:66;:::i;:::-;37272:16;;;;;37007:287;-1:-1:-1;;37007:287:1:o;37299:719::-;37602:6;37594;37590:19;37579:9;37572:38;37646:3;37641:2;37630:9;37626:18;37619:31;37553:4;37673:46;37714:3;37703:9;37699:19;37691:6;37673:46;:::i;:::-;-1:-1:-1;;;;;37759:6:1;37755:31;37750:2;37739:9;37735:18;37728:59;37835:9;37827:6;37823:22;37818:2;37807:9;37803:18;37796:50;37869:33;37895:6;37887;37869:33;:::i;:::-;37855:47;;37951:9;37943:6;37939:22;37933:3;37922:9;37918:19;37911:51;37979:33;38005:6;37997;37979:33;:::i;38430:112::-;38462:1;38488;38478:35;;38493:18;;:::i;:::-;-1:-1:-1;38527:9:1;;38430:112::o;39704:840::-;40053:6;40045;40041:19;40030:9;40023:38;40097:3;40092:2;40081:9;40077:18;40070:31;40004:4;40124:46;40165:3;40154:9;40150:19;40142:6;40124:46;:::i;:::-;40218:9;40210:6;40206:22;40201:2;40190:9;40186:18;40179:50;40252:33;40278:6;40270;40252:33;:::i;:::-;-1:-1:-1;;;;;40359:15:1;;;40354:2;40339:18;;40332:43;40412:15;;40406:3;40391:19;;40384:44;40465:22;;;40312:3;40444:19;;40437:51;40238:47;-1:-1:-1;40505:33:1;40238:47;40523:6;40505:33;:::i;:::-;40497:41;39704:840;-1:-1:-1;;;;;;;;;39704:840:1:o;40549:727::-;40871:3;40866;40862:13;40853:6;40848:3;40844:16;40840:36;40835:3;40828:49;40906:6;40902:1;40897:3;40893:11;40886:27;40810:3;-1:-1:-1;;;;;40936:3:1;40932:28;41012:2;41003:6;40998:3;40994:16;40990:25;40985:2;40980:3;40976:12;40969:47;41046:6;41041:2;41036:3;41032:12;41025:28;41105:2;41096:6;41091:3;41087:16;41083:25;41078:2;41073:3;41069:12;41062:47;;41138:6;41132:13;41154:75;41222:6;41217:2;41212:3;41208:12;41201:4;41193:6;41189:17;41154:75;:::i;:::-;41249:16;;;;41267:2;41245:25;;40549:727;-1:-1:-1;;;;;;;40549:727:1:o;41629:891::-;41949:4;41978:3;42020:6;42012;42008:19;41997:9;41990:38;42064:2;42059;42048:9;42044:18;42037:30;42090:45;42131:2;42120:9;42116:18;42108:6;42090:45;:::i;:::-;-1:-1:-1;;;;;42171:31:1;;42166:2;42151:18;;42144:59;42234:2;42219:18;;42212:34;;;-1:-1:-1;;;;;42283:32:1;;42277:3;42262:19;;42255:61;42303:3;42332:19;;42325:35;;;42397:22;;;42391:3;42376:19;;42369:51;42076:59;-1:-1:-1;42437:33:1;42076:59;42455:6;42437:33;:::i;:::-;42429:41;;;42507:6;42501:3;42490:9;42486:19;42479:35;41629:891;;;;;;;;;;;:::o;42525:383::-;42726:2;42715:9;42708:21;42689:4;42746:45;42787:2;42776:9;42772:18;42764:6;42746:45;:::i;:::-;-1:-1:-1;;;;;42827:31:1;;;;42822:2;42807:18;;42800:59;-1:-1:-1;42890:2:1;42875:18;42868:34;42738:53;42525:383;-1:-1:-1;42525:383:1:o
Swarm Source
ipfs://ac6a26a757e2c156d6357afcdbf4e76d8c4fd4d85298179f160f212dfb9607c9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.