More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 72 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Chain Addres... | 16934722 | 604 days ago | IN | 0 ETH | 0.00151086 | ||||
Validate Transac... | 16170149 | 711 days ago | IN | 0 ETH | 0.0024613 | ||||
Update Hash | 16170149 | 711 days ago | IN | 0 ETH | 0.00086315 | ||||
Transfer Ownersh... | 15498374 | 806 days ago | IN | 0 ETH | 0.00106379 | ||||
Set Default Conf... | 15480041 | 809 days ago | IN | 0 ETH | 0.00198009 | ||||
Set Default Adap... | 15480040 | 809 days ago | IN | 0 ETH | 0.00212415 | ||||
Enable Supported... | 15480039 | 809 days ago | IN | 0 ETH | 0.00095849 | ||||
Set Default Conf... | 15480038 | 809 days ago | IN | 0 ETH | 0.00169219 | ||||
Set Default Adap... | 15480037 | 809 days ago | IN | 0 ETH | 0.00181148 | ||||
Enable Supported... | 15480034 | 809 days ago | IN | 0 ETH | 0.00083633 | ||||
Add Inbound Proo... | 15480033 | 809 days ago | IN | 0 ETH | 0.00110599 | ||||
Set Remote Uln | 15480032 | 809 days ago | IN | 0 ETH | 0.00067489 | ||||
Set Chain Addres... | 15480031 | 809 days ago | IN | 0 ETH | 0.0006863 | ||||
Set Default Conf... | 15480030 | 809 days ago | IN | 0 ETH | 0.00117222 | ||||
Set Default Adap... | 15480029 | 809 days ago | IN | 0 ETH | 0.00156024 | ||||
Enable Supported... | 15480028 | 809 days ago | IN | 0 ETH | 0.00071488 | ||||
Add Inbound Proo... | 15480026 | 809 days ago | IN | 0 ETH | 0.00094682 | ||||
Set Remote Uln | 15480025 | 809 days ago | IN | 0 ETH | 0.00064975 | ||||
Set Chain Addres... | 15480023 | 809 days ago | IN | 0 ETH | 0.00058153 | ||||
Set Default Conf... | 15480018 | 809 days ago | IN | 0 ETH | 0.00098779 | ||||
Set Default Adap... | 15480017 | 809 days ago | IN | 0 ETH | 0.00106295 | ||||
Enable Supported... | 15480016 | 809 days ago | IN | 0 ETH | 0.00052477 | ||||
Add Inbound Proo... | 15480015 | 809 days ago | IN | 0 ETH | 0.00079579 | ||||
Set Remote Uln | 15480014 | 809 days ago | IN | 0 ETH | 0.0004875 | ||||
Set Chain Addres... | 15480013 | 809 days ago | IN | 0 ETH | 0.000562 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21246410 | 2 mins ago | 0.00007817 ETH | ||||
21246410 | 2 mins ago | 0.00039082 ETH | ||||
21246403 | 3 mins ago | 0.00007148 ETH | ||||
21246403 | 3 mins ago | 0.00035656 ETH | ||||
21246399 | 4 mins ago | 0.00007784 ETH | ||||
21246399 | 4 mins ago | 0.00038916 ETH | ||||
21246317 | 20 mins ago | 0.0004387 ETH | ||||
21246313 | 21 mins ago | 0.00171923 ETH | ||||
21246313 | 21 mins ago | 0.002 ETH | ||||
21246239 | 36 mins ago | 0.00027293 ETH | ||||
21246238 | 36 mins ago | 0.00003439 ETH | ||||
21246238 | 36 mins ago | 0.00037831 ETH | ||||
21246226 | 39 mins ago | 0.00027433 ETH | ||||
21246185 | 47 mins ago | 0.000028 ETH | ||||
21246185 | 47 mins ago | 0.00030807 ETH | ||||
21246175 | 49 mins ago | 0.00027114 ETH | ||||
21246145 | 55 mins ago | 0.00027337 ETH | ||||
21246143 | 55 mins ago | 0.00040741 ETH | ||||
21245991 | 1 hr ago | 0.000033 ETH | ||||
21245991 | 1 hr ago | 0.00036307 ETH | ||||
21245871 | 1 hr ago | 0.00012821 ETH | ||||
21245871 | 1 hr ago | 0.00064007 ETH | ||||
21245842 | 1 hr ago | 0.00014964 ETH | ||||
21245842 | 1 hr ago | 0.00074722 ETH | ||||
21245826 | 1 hr ago | 0.00006118 ETH |
Loading...
Loading
Contract Name:
UltraLightNodeV2
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; import "./Ownable.sol"; import "./SafeMath.sol"; import "./ReentrancyGuard.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./ILayerZeroValidationLibrary.sol"; import "./ILayerZeroReceiver.sol"; import "./ILayerZeroTreasury.sol"; import "./ILayerZeroEndpoint.sol"; // v2 import "./ILayerZeroMessagingLibraryV2.sol"; import "./ILayerZeroOracleV2.sol"; import "./ILayerZeroUltraLightNodeV2.sol"; import "./ILayerZeroRelayerV2.sol"; import "./NonceContract.sol"; contract UltraLightNodeV2 is ILayerZeroMessagingLibraryV2, ILayerZeroUltraLightNodeV2, ReentrancyGuard, Ownable { using SafeERC20 for IERC20; using SafeMath for uint; // Application config uint public constant CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION = 1; uint public constant CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS = 2; uint public constant CONFIG_TYPE_RELAYER = 3; uint public constant CONFIG_TYPE_OUTBOUND_PROOF_TYPE = 4; uint public constant CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS = 5; uint public constant CONFIG_TYPE_ORACLE = 6; // Token and Contracts IERC20 public layerZeroToken; ILayerZeroTreasury public treasuryContract; mapping(address => uint) public nativeFees; uint public treasuryZROFees; // User Application mapping(address => mapping(uint16 => ApplicationConfiguration)) public appConfig; // app address => chainId => config mapping(uint16 => ApplicationConfiguration) public defaultAppConfig; // default UA settings if no version specified mapping(uint16 => mapping(uint16 => bytes)) public defaultAdapterParams; // Validation mapping(uint16 => mapping(uint16 => address)) public inboundProofLibrary; // chainId => library Id => inboundProofLibrary contract mapping(uint16 => uint16) public maxInboundProofLibrary; // chainId => inboundProofLibrary mapping(uint16 => mapping(uint16 => bool)) public supportedOutboundProof; // chainId => outboundProofType => enabled mapping(uint16 => uint) public chainAddressSizeMap; mapping(address => mapping(uint16 => mapping(bytes32 => mapping(bytes32 => uint)))) public hashLookup; //[oracle][srcChainId][blockhash][datahash] -> confirmation mapping(uint16 => bytes32) public ulnLookup; // remote ulns ILayerZeroEndpoint public immutable endpoint; uint16 public immutable localChainId; NonceContract public immutable nonceContract; constructor(address _endpoint, address _nonceContract, uint16 _localChainId) { require(_endpoint != address(0x0), "LayerZero: endpoint cannot be zero address"); require(_nonceContract != address(0x0), "LayerZero: nonceContract cannot be zero address"); ILayerZeroEndpoint lzEndpoint = ILayerZeroEndpoint(_endpoint); localChainId = _localChainId; endpoint = lzEndpoint; nonceContract = NonceContract(_nonceContract); } // only the endpoint can call SEND() and setConfig() modifier onlyEndpoint() { require(address(endpoint) == msg.sender, "LayerZero: only endpoint"); _; } //---------------------------------------------------------------------------------- // PROTOCOL function validateTransactionProof(uint16 _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes32 _blockData, bytes calldata _transactionProof) external override { // retrieve UA's configuration using the _dstAddress from arguments. ApplicationConfiguration memory uaConfig = _getAppConfig(_srcChainId, _dstAddress); // assert that the caller == UA's relayer require(uaConfig.relayer == msg.sender, "LayerZero: invalid relayer"); LayerZeroPacket.Packet memory _packet; uint remoteAddressSize = chainAddressSizeMap[_srcChainId]; require(remoteAddressSize != 0, "LayerZero: incorrect remote address size"); { // assert that the data submitted by UA's oracle have no fewer confirmations than UA's configuration uint storedConfirmations = hashLookup[uaConfig.oracle][_srcChainId][_lookupHash][_blockData]; require(storedConfirmations > 0 && storedConfirmations >= uaConfig.inboundBlockConfirmations, "LayerZero: not enough block confirmations"); // decode address inboundProofLib = inboundProofLibrary[_srcChainId][uaConfig.inboundProofLibraryVersion]; _packet = ILayerZeroValidationLibrary(inboundProofLib).validateProof(_blockData, _transactionProof, remoteAddressSize); } // packet content assertion require(ulnLookup[_srcChainId] == _packet.ulnAddress && _packet.ulnAddress != bytes32(0), "LayerZero: invalid _packet.ulnAddress"); require(_packet.srcChainId == _srcChainId, "LayerZero: invalid srcChain Id"); // failsafe because the remoteAddress size being passed into validateProof trims the address this should not hit require(_packet.srcAddress.length == remoteAddressSize, "LayerZero: invalid srcAddress size"); require(_packet.dstChainId == localChainId, "LayerZero: invalid dstChain Id"); require(_packet.dstAddress == _dstAddress, "LayerZero: invalid dstAddress"); // if the dst is not a contract, then emit and return early. This will break inbound nonces, but this particular // path is already broken and wont ever be able to deliver anyways if (!_isContract(_dstAddress)) { emit InvalidDst(_packet.srcChainId, _packet.srcAddress, _packet.dstAddress, _packet.nonce, keccak256(_packet.payload)); return; } bytes memory pathData = abi.encodePacked(_packet.srcAddress, _packet.dstAddress); emit PacketReceived(_packet.srcChainId, _packet.srcAddress, _packet.dstAddress, _packet.nonce, keccak256(_packet.payload)); endpoint.receivePayload(_srcChainId, pathData, _dstAddress, _packet.nonce, _gasLimit, _packet.payload); } function send(address _ua, uint64, uint16 _dstChainId, bytes calldata _path, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable override onlyEndpoint { address ua = _ua; uint16 dstChainId = _dstChainId; require(ulnLookup[dstChainId] != bytes32(0), "LayerZero: dstChainId does not exist"); bytes memory dstAddress; uint64 nonce; // code block for solving 'Stack Too Deep' { uint chainAddressSize = chainAddressSizeMap[dstChainId]; // path = remoteAddress + localAddress require(chainAddressSize != 0 && _path.length == 20 + chainAddressSize, "LayerZero: incorrect remote address size"); address srcInPath; bytes memory path = _path; // copy to memory assembly { srcInPath := mload(add(add(path, 20), chainAddressSize)) // chainAddressSize + 20 } require(ua == srcInPath, "LayerZero: wrong path data"); dstAddress = _path[0:chainAddressSize]; nonce = nonceContract.increment(dstChainId, ua, path); } bytes memory payload = _payload; ApplicationConfiguration memory uaConfig = _getAppConfig(dstChainId, ua); // compute all the fees uint relayerFee = _handleRelayer(dstChainId, uaConfig, ua, payload.length, _adapterParams); uint oracleFee = _handleOracle(dstChainId, uaConfig, ua); uint nativeProtocolFee = _handleProtocolFee(relayerFee, oracleFee, ua, _zroPaymentAddress); // total native fee, does not include ZRO protocol fee uint totalNativeFee = relayerFee.add(oracleFee).add(nativeProtocolFee); // assert the user has attached enough native token for this address require(totalNativeFee <= msg.value, "LayerZero: not enough native for fees"); // refund if they send too much uint amount = msg.value.sub(totalNativeFee); if (amount > 0) { (bool success, ) = _refundAddress.call{value: amount}(""); require(success, "LayerZero: failed to refund"); } // emit the data packet bytes memory encodedPayload = abi.encodePacked(nonce, localChainId, ua, dstChainId, dstAddress, payload); emit Packet(encodedPayload); } function _handleRelayer(uint16 _dstChainId, ApplicationConfiguration memory _uaConfig, address _ua, uint _payloadSize, bytes memory _adapterParams) internal returns (uint relayerFee) { if (_adapterParams.length == 0) { _adapterParams = defaultAdapterParams[_dstChainId][_uaConfig.outboundProofType]; } address relayerAddress = _uaConfig.relayer; ILayerZeroRelayerV2 relayer = ILayerZeroRelayerV2(relayerAddress); relayerFee = relayer.assignJob(_dstChainId, _uaConfig.outboundProofType, _ua, _payloadSize, _adapterParams); _creditNativeFee(relayerAddress, relayerFee); // emit the param events emit RelayerParams(_adapterParams, _uaConfig.outboundProofType); } function _handleOracle(uint16 _dstChainId, ApplicationConfiguration memory _uaConfig, address _ua) internal returns (uint oracleFee) { address oracleAddress = _uaConfig.oracle; oracleFee = ILayerZeroOracleV2(oracleAddress).assignJob(_dstChainId, _uaConfig.outboundProofType, _uaConfig.outboundBlockConfirmations, _ua); _creditNativeFee(oracleAddress, oracleFee); } function _handleProtocolFee(uint _relayerFee, uint _oracleFee, address _ua, address _zroPaymentAddress) internal returns (uint protocolNativeFee) { // if no ZRO token or not specifying a payment address, pay in native token bool payInNative = _zroPaymentAddress == address(0x0) || address(layerZeroToken) == address(0x0); uint protocolFee = treasuryContract.getFees(!payInNative, _relayerFee, _oracleFee); if (protocolFee > 0) { if (payInNative) { address treasuryAddress = address(treasuryContract); _creditNativeFee(treasuryAddress, protocolFee); protocolNativeFee = protocolFee; } else { // zro payment address must equal the ua or the tx.origin otherwise the transaction reverts require(_zroPaymentAddress == _ua || _zroPaymentAddress == tx.origin, "LayerZero: must be paid by sender or origin"); // transfer the LayerZero token to this contract from the payee layerZeroToken.safeTransferFrom(_zroPaymentAddress, address(this), protocolFee); treasuryZROFees = treasuryZROFees.add(protocolFee); } } } function _creditNativeFee(address _receiver, uint _amount) internal { nativeFees[_receiver] = nativeFees[_receiver].add(_amount); } // Can be called by any address to update a block header // can only upload new block data or the same block data with more confirmations function updateHash(uint16 _srcChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _blockData) external override { uint storedConfirmations = hashLookup[msg.sender][_srcChainId][_lookupHash][_blockData]; // if it has a record, requires a larger confirmation. require(storedConfirmations < _confirmations, "LayerZero: oracle data can only update if it has more confirmations"); // set the new information into storage hashLookup[msg.sender][_srcChainId][_lookupHash][_blockData] = _confirmations; emit HashReceived(_srcChainId, msg.sender, _lookupHash, _blockData, _confirmations); } //---------------------------------------------------------------------------------- // Other Library Interfaces // default to DEFAULT setting if ZERO value function getAppConfig(uint16 _remoteChainId, address _ua) external view override returns (ApplicationConfiguration memory) { return _getAppConfig(_remoteChainId, _ua); } function _getAppConfig(uint16 _remoteChainId, address _ua) internal view returns (ApplicationConfiguration memory) { ApplicationConfiguration memory config = appConfig[_ua][_remoteChainId]; ApplicationConfiguration storage defaultConfig = defaultAppConfig[_remoteChainId]; if (config.inboundProofLibraryVersion == 0) { config.inboundProofLibraryVersion = defaultConfig.inboundProofLibraryVersion; } if (config.inboundBlockConfirmations == 0) { config.inboundBlockConfirmations = defaultConfig.inboundBlockConfirmations; } if (config.relayer == address(0x0)) { config.relayer = defaultConfig.relayer; } if (config.outboundProofType == 0) { config.outboundProofType = defaultConfig.outboundProofType; } if (config.outboundBlockConfirmations == 0) { config.outboundBlockConfirmations = defaultConfig.outboundBlockConfirmations; } if (config.oracle == address(0x0)) { config.oracle = defaultConfig.oracle; } return config; } function setConfig(uint16 _remoteChainId, address _ua, uint _configType, bytes calldata _config) external override onlyEndpoint { ApplicationConfiguration storage uaConfig = appConfig[_ua][_remoteChainId]; if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION) { uint16 inboundProofLibraryVersion = abi.decode(_config, (uint16)); require(inboundProofLibraryVersion <= maxInboundProofLibrary[_remoteChainId], "LayerZero: invalid inbound proof library version"); uaConfig.inboundProofLibraryVersion = inboundProofLibraryVersion; } else if (_configType == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) { uint64 blockConfirmations = abi.decode(_config, (uint64)); uaConfig.inboundBlockConfirmations = blockConfirmations; } else if (_configType == CONFIG_TYPE_RELAYER) { address relayer = abi.decode(_config, (address)); uaConfig.relayer = relayer; } else if (_configType == CONFIG_TYPE_OUTBOUND_PROOF_TYPE) { uint16 outboundProofType = abi.decode(_config, (uint16)); require(supportedOutboundProof[_remoteChainId][outboundProofType] || outboundProofType == 0, "LayerZero: invalid outbound proof type"); uaConfig.outboundProofType = outboundProofType; } else if (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) { uint64 blockConfirmations = abi.decode(_config, (uint64)); uaConfig.outboundBlockConfirmations = blockConfirmations; } else if (_configType == CONFIG_TYPE_ORACLE) { address oracle = abi.decode(_config, (address)); uaConfig.oracle = oracle; } else { revert("LayerZero: Invalid config type"); } emit AppConfigUpdated(_ua, _configType, _config); } function getConfig(uint16 _remoteChainId, address _ua, uint _configType) external view override returns (bytes memory) { ApplicationConfiguration storage uaConfig = appConfig[_ua][_remoteChainId]; if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION) { if (uaConfig.inboundProofLibraryVersion == 0) { return abi.encode(defaultAppConfig[_remoteChainId].inboundProofLibraryVersion); } return abi.encode(uaConfig.inboundProofLibraryVersion); } else if (_configType == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) { if (uaConfig.inboundBlockConfirmations == 0) { return abi.encode(defaultAppConfig[_remoteChainId].inboundBlockConfirmations); } return abi.encode(uaConfig.inboundBlockConfirmations); } else if (_configType == CONFIG_TYPE_RELAYER) { if (uaConfig.relayer == address(0x0)) { return abi.encode(defaultAppConfig[_remoteChainId].relayer); } return abi.encode(uaConfig.relayer); } else if (_configType == CONFIG_TYPE_OUTBOUND_PROOF_TYPE) { if (uaConfig.outboundProofType == 0) { return abi.encode(defaultAppConfig[_remoteChainId].outboundProofType); } return abi.encode(uaConfig.outboundProofType); } else if (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) { if (uaConfig.outboundBlockConfirmations == 0) { return abi.encode(defaultAppConfig[_remoteChainId].outboundBlockConfirmations); } return abi.encode(uaConfig.outboundBlockConfirmations); } else if (_configType == CONFIG_TYPE_ORACLE) { if (uaConfig.oracle == address(0x0)) { return abi.encode(defaultAppConfig[_remoteChainId].oracle); } return abi.encode(uaConfig.oracle); } else { revert("LayerZero: Invalid config type"); } } // returns the native fee the UA pays to cover fees function estimateFees(uint16 _dstChainId, address _ua, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParams) external view override returns (uint nativeFee, uint zroFee) { ApplicationConfiguration memory uaConfig = _getAppConfig(_dstChainId, _ua); // Relayer Fee bytes memory adapterParams; if (_adapterParams.length > 0) { adapterParams = _adapterParams; } else { adapterParams = defaultAdapterParams[_dstChainId][uaConfig.outboundProofType]; } uint relayerFee = ILayerZeroRelayerV2(uaConfig.relayer).getFee(_dstChainId, uaConfig.outboundProofType, _ua, _payload.length, adapterParams); // Oracle Fee address ua = _ua; // stack too deep uint oracleFee = ILayerZeroOracleV2(uaConfig.oracle).getFee(_dstChainId, uaConfig.outboundProofType, uaConfig.outboundBlockConfirmations, ua); // LayerZero Fee uint protocolFee = treasuryContract.getFees(_payInZRO, relayerFee, oracleFee); _payInZRO ? zroFee = protocolFee : nativeFee = protocolFee; // return the sum of fees nativeFee = nativeFee.add(relayerFee).add(oracleFee); } //--------------------------------------------------------------------------- // Claim Fees // universal withdraw ZRO token function function withdrawZRO(address _to, uint _amount) external override nonReentrant { require(msg.sender == address(treasuryContract), "LayerZero: only treasury"); treasuryZROFees = treasuryZROFees.sub(_amount); layerZeroToken.safeTransfer(_to, _amount); emit WithdrawZRO(msg.sender, _to, _amount); } // universal withdraw native token function. // the source contract should perform all the authentication control function withdrawNative(address payable _to, uint _amount) external override nonReentrant { require(_to != address(0x0), "LayerZero: _to cannot be zero address"); nativeFees[msg.sender] = nativeFees[msg.sender].sub(_amount); (bool success, ) = _to.call{value: _amount}(""); require(success, "LayerZero: withdraw failed"); emit WithdrawNative(msg.sender, _to, _amount); } //--------------------------------------------------------------------------- // Owner calls, configuration only. function setLayerZeroToken(address _layerZeroToken) external onlyOwner { require(_layerZeroToken != address(0x0), "LayerZero: _layerZeroToken cannot be zero address"); layerZeroToken = IERC20(_layerZeroToken); emit SetLayerZeroToken(_layerZeroToken); } function setTreasury(address _treasury) external onlyOwner { require(_treasury != address(0x0), "LayerZero: treasury cannot be zero address"); treasuryContract = ILayerZeroTreasury(_treasury); emit SetTreasury(_treasury); } function addInboundProofLibraryForChain(uint16 _chainId, address _library) external onlyOwner { require(_library != address(0x0), "LayerZero: library cannot be zero address"); uint16 libId = maxInboundProofLibrary[_chainId]; require(libId < 65535, "LayerZero: can not add new library"); maxInboundProofLibrary[_chainId] = ++libId; inboundProofLibrary[_chainId][libId] = _library; emit AddInboundProofLibraryForChain(_chainId, _library); } function enableSupportedOutboundProof(uint16 _chainId, uint16 _proofType) external onlyOwner { supportedOutboundProof[_chainId][_proofType] = true; emit EnableSupportedOutboundProof(_chainId, _proofType); } function setDefaultConfigForChainId(uint16 _chainId, uint16 _inboundProofLibraryVersion, uint64 _inboundBlockConfirmations, address _relayer, uint16 _outboundProofType, uint64 _outboundBlockConfirmations, address _oracle) external onlyOwner { require(_inboundProofLibraryVersion <= maxInboundProofLibrary[_chainId] && _inboundProofLibraryVersion > 0, "LayerZero: invalid inbound proof library version"); require(_inboundBlockConfirmations > 0, "LayerZero: invalid inbound block confirmation"); require(_relayer != address(0x0), "LayerZero: invalid relayer address"); require(supportedOutboundProof[_chainId][_outboundProofType], "LayerZero: invalid outbound proof type"); require(_outboundBlockConfirmations > 0, "LayerZero: invalid outbound block confirmation"); require(_oracle != address(0x0), "LayerZero: invalid oracle address"); defaultAppConfig[_chainId] = ApplicationConfiguration(_inboundProofLibraryVersion, _inboundBlockConfirmations, _relayer, _outboundProofType, _outboundBlockConfirmations, _oracle); emit SetDefaultConfigForChainId(_chainId, _inboundProofLibraryVersion, _inboundBlockConfirmations, _relayer, _outboundProofType, _outboundBlockConfirmations, _oracle); } function setDefaultAdapterParamsForChainId(uint16 _chainId, uint16 _proofType, bytes calldata _adapterParams) external onlyOwner { defaultAdapterParams[_chainId][_proofType] = _adapterParams; emit SetDefaultAdapterParamsForChainId(_chainId, _proofType, _adapterParams); } function setRemoteUln(uint16 _remoteChainId, bytes32 _remoteUln) external onlyOwner { require(ulnLookup[_remoteChainId] == bytes32(0), "LayerZero: remote uln already set"); ulnLookup[_remoteChainId] = _remoteUln; emit SetRemoteUln(_remoteChainId, _remoteUln); } function setChainAddressSize(uint16 _chainId, uint _size) external onlyOwner { require(chainAddressSizeMap[_chainId] == 0, "LayerZero: remote chain address size already set"); chainAddressSizeMap[_chainId] = _size; emit SetChainAddressSize(_chainId, _size); } //---------------------------------------------------------------------------------- // view functions function accruedNativeFee(address _address) external view override returns (uint) { return nativeFees[_address]; } function getOutboundNonce(uint16 _chainId, bytes calldata _path) external view override returns (uint64) { return nonceContract.outboundNonce(_chainId, _path); } function _isContract(address addr) internal view returns (bool) { uint size; assembly { size := extcodesize(addr) } return size != 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: BUSL-1.1 // https://github.com/ensdomains/buffer pragma solidity ^0.7.0; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity.a co * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns (buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param rawData The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function writeRawBytes( buffer memory buf, uint off, bytes memory rawData, uint offData, uint len ) internal pure returns (buffer memory) { if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(rawData, offData) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256**(32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256**(32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns (uint) { if (a > b) { return a; } return b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroMessagingLibrary { // send(), messages will be inflight. function send(address _userApplication, uint64 _lastNonce, uint16 _chainId, bytes calldata _destination, bytes calldata _payload, address payable refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // estimate native fee at the send side function estimateFees(uint16 _chainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); //--------------------------------------------------------------------------- // setConfig / getConfig are User Application (UA) functions to specify Oracle, Relayer, blockConfirmations, libraryVersion function setConfig(uint16 _chainId, address _userApplication, uint _configType, bytes calldata _config) external; function getConfig(uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; import "./ILayerZeroUserApplicationConfig.sol"; import "./ILayerZeroMessagingLibrary.sol"; interface ILayerZeroMessagingLibraryV2 is ILayerZeroMessagingLibrary { function getOutboundNonce(uint16 _chainId, bytes calldata _path) external view returns (uint64); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; interface ILayerZeroOracleV2 { // @notice query price and assign jobs at the same time // @param _dstChainId - the destination endpoint identifier // @param _outboundProofType - the proof type identifier to specify proof to be relayed // @param _outboundBlockConfirmation - block confirmation delay before relaying blocks // @param _userApplication - the source sending contract address function assignJob(uint16 _dstChainId, uint16 _outboundProofType, uint64 _outboundBlockConfirmation, address _userApplication) external returns (uint price); // @notice query the oracle price for relaying block information to the destination chain // @param _dstChainId the destination endpoint identifier // @param _outboundProofType the proof type identifier to specify the data to be relayed // @param _outboundBlockConfirmation - block confirmation delay before relaying blocks // @param _userApplication - the source sending contract address function getFee(uint16 _dstChainId, uint16 _outboundProofType, uint64 _outboundBlockConfirmation, address _userApplication) external view returns (uint price); // @notice withdraw the accrued fee in ultra light node // @param _to - the fee receiver // @param _amount - the withdrawal amount function withdrawFee(address payable _to, uint _amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; interface ILayerZeroRelayerV2 { // @notice query price and assign jobs at the same time // @param _dstChainId - the destination endpoint identifier // @param _outboundProofType - the proof type identifier to specify proof to be relayed // @param _userApplication - the source sending contract address. relayers may apply price discrimination to user apps // @param _payloadSize - the length of the payload. it is an indicator of gas usage for relaying cross-chain messages // @param _adapterParams - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain function assignJob(uint16 _dstChainId, uint16 _outboundProofType, address _userApplication, uint _payloadSize, bytes calldata _adapterParams) external returns (uint price); // @notice query the relayer price for relaying the payload and its proof to the destination chain // @param _dstChainId - the destination endpoint identifier // @param _outboundProofType - the proof type identifier to specify proof to be relayed // @param _userApplication - the source sending contract address. relayers may apply price discrimination to user apps // @param _payloadSize - the length of the payload. it is an indicator of gas usage for relaying cross-chain messages // @param _adapterParams - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain function getFee(uint16 _dstChainId, uint16 _outboundProofType, address _userApplication, uint _payloadSize, bytes calldata _adapterParams) external view returns (uint price); // @notice withdraw the accrued fee in ultra light node // @param _to - the fee receiver // @param _amount - the withdrawal amount function withdrawFee(address payable _to, uint _amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroTreasury { function getFees(bool payInZro, uint relayerFee, uint oracleFee) external view returns (uint); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; pragma abicoder v2; interface ILayerZeroUltraLightNodeV2 { // Relayer functions function validateTransactionProof(uint16 _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes32 _blockData, bytes calldata _transactionProof) external; // an Oracle delivers the block data using updateHash() function updateHash(uint16 _srcChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _blockData) external; // can only withdraw the receivable of the msg.sender function withdrawNative(address payable _to, uint _amount) external; function withdrawZRO(address _to, uint _amount) external; // view functions function getAppConfig(uint16 _remoteChainId, address _userApplicationAddress) external view returns (ApplicationConfiguration memory); function accruedNativeFee(address _address) external view returns (uint); struct ApplicationConfiguration { uint16 inboundProofLibraryVersion; uint64 inboundBlockConfirmations; address relayer; uint16 outboundProofType; uint64 outboundBlockConfirmations; address oracle; } event HashReceived(uint16 indexed srcChainId, address indexed oracle, bytes32 lookupHash, bytes32 blockData, uint confirmations); event RelayerParams(bytes adapterParams, uint16 outboundProofType); event Packet(bytes payload); event InvalidDst(uint16 indexed srcChainId, bytes srcAddress, address indexed dstAddress, uint64 nonce, bytes32 payloadHash); event PacketReceived(uint16 indexed srcChainId, bytes srcAddress, address indexed dstAddress, uint64 nonce, bytes32 payloadHash); event AppConfigUpdated(address indexed userApplication, uint indexed configType, bytes newConfig); event AddInboundProofLibraryForChain(uint16 indexed chainId, address lib); event EnableSupportedOutboundProof(uint16 indexed chainId, uint16 proofType); event SetChainAddressSize(uint16 indexed chainId, uint size); event SetDefaultConfigForChainId(uint16 indexed chainId, uint16 inboundProofLib, uint64 inboundBlockConfirm, address relayer, uint16 outboundProofType, uint64 outboundBlockConfirm, address oracle); event SetDefaultAdapterParamsForChainId(uint16 indexed chainId, uint16 indexed proofType, bytes adapterParams); event SetLayerZeroToken(address indexed tokenAddress); event SetRemoteUln(uint16 indexed chainId, bytes32 uln); event SetTreasury(address indexed treasuryAddress); event WithdrawZRO(address indexed msgSender, address indexed to, uint amount); event WithdrawNative(address indexed msgSender, address indexed to, uint amount); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; pragma abicoder v2; import "./LayerZeroPacket.sol"; interface ILayerZeroValidationLibrary { function validateProof(bytes32 blockData, bytes calldata _data, uint _remoteAddressSize) external returns (LayerZeroPacket.Packet memory packet); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; import "./Buffer.sol"; import "./SafeMath.sol"; library LayerZeroPacket { using Buffer for Buffer.buffer; using SafeMath for uint; struct Packet { uint16 srcChainId; uint16 dstChainId; uint64 nonce; address dstAddress; bytes srcAddress; bytes32 ulnAddress; bytes payload; } function getPacket( bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress ) internal pure returns (LayerZeroPacket.Packet memory) { uint16 dstChainId; address dstAddress; uint size; uint64 nonce; // The log consists of the destination chain id and then a bytes payload // 0--------------------------------------------31 // 0 | total bytes size // 32 | destination chain id // 64 | bytes offset // 96 | bytes array size // 128 | payload assembly { dstChainId := mload(add(data, 32)) size := mload(add(data, 96)) /// size of the byte array nonce := mload(add(data, 104)) // offset to convert to uint64 128 is index -24 dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8 } Buffer.buffer memory srcAddressBuffer; srcAddressBuffer.init(sizeOfSrcAddress); srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8 uint payloadSize = size.sub(28).sub(sizeOfSrcAddress); Buffer.buffer memory payloadBuffer; payloadBuffer.init(payloadSize); payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8 return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf); } function getPacketV2( bytes memory data, uint sizeOfSrcAddress, bytes32 ulnAddress ) internal pure returns (LayerZeroPacket.Packet memory) { // packet def: abi.encodePacked(nonce, srcChain, srcAddress, dstChain, dstAddress, payload); // data def: abi.encode(packet) = offset(32) + length(32) + packet // if from EVM // 0 - 31 0 - 31 | total bytes size // 32 - 63 32 - 63 | location // 64 - 95 64 - 95 | size of the packet // 96 - 103 96 - 103 | nonce // 104 - 105 104 - 105 | srcChainId // 106 - P 106 - 125 | srcAddress, where P = 106 + sizeOfSrcAddress - 1, // P+1 - P+2 126 - 127 | dstChainId // P+3 - P+22 128 - 147 | dstAddress // P+23 - END 148 - END | payload // decode the packet uint256 realSize; uint64 nonce; uint16 srcChain; uint16 dstChain; address dstAddress; assembly { realSize := mload(add(data, 64)) nonce := mload(add(data, 72)) // 104 - 32 srcChain := mload(add(data, 74)) // 106 - 32 dstChain := mload(add(data, add(76, sizeOfSrcAddress))) // P + 3 - 32 = 105 + size + 3 - 32 = 76 + size dstAddress := mload(add(data, add(96, sizeOfSrcAddress))) // P + 23 - 32 = 105 + size + 23 - 32 = 96 + size } require(srcChain != 0, "LayerZeroPacket: invalid packet"); Buffer.buffer memory srcAddressBuffer; srcAddressBuffer.init(sizeOfSrcAddress); srcAddressBuffer.writeRawBytes(0, data, 106, sizeOfSrcAddress); uint nonPayloadSize = sizeOfSrcAddress.add(32);// 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20 uint payloadSize = realSize.sub(nonPayloadSize); Buffer.buffer memory payloadBuffer; payloadBuffer.init(payloadSize); payloadBuffer.writeRawBytes(0, data, nonPayloadSize.add(96), payloadSize); return LayerZeroPacket.Packet(srcChain, dstChain, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf); } function getPacketV3( bytes memory data, uint sizeOfSrcAddress, bytes32 ulnAddress ) internal pure returns (LayerZeroPacket.Packet memory) { // data def: abi.encodePacked(nonce, srcChain, srcAddress, dstChain, dstAddress, payload); // if from EVM // 0 - 31 0 - 31 | total bytes size // 32 - 39 32 - 39 | nonce // 40 - 41 40 - 41 | srcChainId // 42 - P 42 - 61 | srcAddress, where P = 41 + sizeOfSrcAddress, // P+1 - P+2 62 - 63 | dstChainId // P+3 - P+22 64 - 83 | dstAddress // P+23 - END 84 - END | payload // decode the packet uint256 realSize = data.length; uint nonPayloadSize = sizeOfSrcAddress.add(32);// 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20 require(realSize >= nonPayloadSize, "LayerZeroPacket: invalid packet"); uint payloadSize = realSize - nonPayloadSize; uint64 nonce; uint16 srcChain; uint16 dstChain; address dstAddress; assembly { nonce := mload(add(data, 8)) // 40 - 32 srcChain := mload(add(data, 10)) // 42 - 32 dstChain := mload(add(data, add(12, sizeOfSrcAddress))) // P + 3 - 32 = 41 + size + 3 - 32 = 12 + size dstAddress := mload(add(data, add(32, sizeOfSrcAddress))) // P + 23 - 32 = 41 + size + 23 - 32 = 32 + size } require(srcChain != 0, "LayerZeroPacket: invalid packet"); Buffer.buffer memory srcAddressBuffer; srcAddressBuffer.init(sizeOfSrcAddress); srcAddressBuffer.writeRawBytes(0, data, 42, sizeOfSrcAddress); Buffer.buffer memory payloadBuffer; if (payloadSize > 0) { payloadBuffer.init(payloadSize); payloadBuffer.writeRawBytes(0, data, nonPayloadSize.add(32), payloadSize); } return LayerZeroPacket.Packet(srcChain, dstChain, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; import "./ILayerZeroEndpoint.sol"; contract NonceContract { ILayerZeroEndpoint public immutable endpoint; // outboundNonce = [dstChainId][remoteAddress + localAddress] mapping(uint16 => mapping(bytes => uint64)) public outboundNonce; constructor(address _endpoint) { endpoint = ILayerZeroEndpoint(_endpoint); } function increment(uint16 _chainId, address _ua, bytes calldata _path) external returns (uint64) { require(endpoint.getSendLibraryAddress(_ua) == msg.sender, "NonceContract: msg.sender is not valid sendlibrary"); return ++outboundNonce[_chainId][_path]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_nonceContract","type":"address"},{"internalType":"uint16","name":"_localChainId","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"lib","type":"address"}],"name":"AddInboundProofLibraryForChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userApplication","type":"address"},{"indexed":true,"internalType":"uint256","name":"configType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newConfig","type":"bytes"}],"name":"AppConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"proofType","type":"uint16"}],"name":"EnableSupportedOutboundProof","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"bytes32","name":"lookupHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"blockData","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"confirmations","type":"uint256"}],"name":"HashReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"dstAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"InvalidDst","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":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"Packet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"dstAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"PacketReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"adapterParams","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"outboundProofType","type":"uint16"}],"name":"RelayerParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"}],"name":"SetChainAddressSize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":true,"internalType":"uint16","name":"proofType","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"SetDefaultAdapterParamsForChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"inboundProofLib","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"inboundBlockConfirm","type":"uint64"},{"indexed":false,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"outboundBlockConfirm","type":"uint64"},{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetDefaultConfigForChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"SetLayerZeroToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes32","name":"uln","type":"bytes32"}],"name":"SetRemoteUln","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawZRO","type":"event"},{"inputs":[],"name":"CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_ORACLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_OUTBOUND_PROOF_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_RELAYER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"accruedNativeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_library","type":"address"}],"name":"addInboundProofLibraryForChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"appConfig","outputs":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainAddressSizeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"defaultAdapterParams","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"defaultAppConfig","outputs":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_proofType","type":"uint16"}],"name":"enableSupportedOutboundProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"bool","name":"_payInZRO","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"}],"name":"getAppConfig","outputs":[{"components":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct ILayerZeroUltraLightNodeV2.ApplicationConfiguration","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"getOutboundNonce","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"inboundProofLibrary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"localChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"maxInboundProofLibrary","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nativeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonceContract","outputs":[{"internalType":"contract NonceContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ua","type":"address"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setChainAddressSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_proofType","type":"uint16"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"setDefaultAdapterParamsForChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"_inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"_relayer","type":"address"},{"internalType":"uint16","name":"_outboundProofType","type":"uint16"},{"internalType":"uint64","name":"_outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"setDefaultConfigForChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_layerZeroToken","type":"address"}],"name":"setLayerZeroToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes32","name":"_remoteUln","type":"bytes32"}],"name":"setRemoteUln","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"supportedOutboundProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryContract","outputs":[{"internalType":"contract ILayerZeroTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryZROFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"ulnLookup","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes32","name":"_lookupHash","type":"bytes32"},{"internalType":"uint256","name":"_confirmations","type":"uint256"},{"internalType":"bytes32","name":"_blockData","type":"bytes32"}],"name":"updateHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"address","name":"_dstAddress","type":"address"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes32","name":"_lookupHash","type":"bytes32"},{"internalType":"bytes32","name":"_blockData","type":"bytes32"},{"internalType":"bytes","name":"_transactionProof","type":"bytes"}],"name":"validateTransactionProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawZRO","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162005ad838038062005ad883398101604081905262000034916200013f565b60016000908155620000456200011e565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038316620000c55760405162461bcd60e51b8152600401620000bc9062000191565b60405180910390fd5b6001600160a01b038216620000ee5760405162461bcd60e51b8152600401620000bc90620001db565b60f01b6001600160f01b03191660a052606091821b6001600160601b0319908116608052911b1660c0526200022a565b3390565b80516001600160a01b03811681146200013a57600080fd5b919050565b60008060006060848603121562000154578283fd5b6200015f8462000122565b92506200016f6020850162000122565b9150604084015161ffff8116811462000186578182fd5b809150509250925092565b6020808252602a908201527f4c617965725a65726f3a20656e64706f696e742063616e6e6f74206265207a65604082015269726f206164647265737360b01b606082015260800190565b6020808252602f908201527f4c617965725a65726f3a206e6f6e6365436f6e74726163742063616e6e6f742060408201526e6265207a65726f206164647265737360881b606082015260800190565b60805160601c60a05160f01c60c05160601c615855620002836000398061084d52806110ee5280612991525080611305528061189552806126ba525080610f2052806118b9528061287b5280612fe852506158556000f3fe6080604052600436106102e75760003560e01c80638317814a11610184578063d543c774116100d6578063ed28580a1161008a578063f47a5feb11610064578063f47a5feb146107f6578063f58589a21461080b578063f8e1734c1461082b576102e7565b8063ed28580a14610796578063f0f44260146107b6578063f2fde38b146107d6576102e7565b8063ddfdef5a116100bb578063ddfdef5a14610736578063ea216c2114610756578063eb0d4c3114610776576102e7565b8063d543c774146106e9578063db00719b14610716576102e7565b8063959f594311610138578063b77d22ad11610112578063b77d22ad14610687578063b8e7e3e01461069c578063b9a99bed146106bc576102e7565b8063959f59431461061a578063987fa2d51461063a578063a46622221461065a576102e7565b806387078f9f1161016957806387078f9f146105d05780638da5cb5b146105f0578063904d3b8d14610605576102e7565b80638317814a146105905780638525b711146105b0576102e7565b806352d2871f1161023d5780636a14ac82116101f1578063759c5b3b116101cb578063759c5b3b1461053b5780638140666e1461055b5780638207f79d14610570576102e7565b80636a14ac82146104e6578063704316e514610506578063715018a614610526576102e7565b80635b056da5116102225780635b056da51461048f5780635e280f11146104b157806369412bfa146104c6576102e7565b806352d2871f1461044f57806352d3b5001461046f576102e7565b80632cfacb061161029f57806340a7bb101161027957806340a7bb10146103f957806349148c37146104275780634d3a0f7c1461043c576102e7565b80632cfacb06146103905780632f813464146103b257806331bd2430146103e4576102e7565b806307b9ca7c116102d057806307b9ca7c1461033957806318da00111461034e5780632a819bbf14610363576102e7565b806302bd9743146102ec57806307b18bde14610317575b600080fd5b3480156102f857600080fd5b5061030161084b565b60405161030e91906149ba565b60405180910390f35b34801561032357600080fd5b50610337610332366004614168565b61086f565b005b34801561034557600080fd5b50610301610a2d565b34801561035a57600080fd5b50610301610a49565b34801561036f57600080fd5b5061038361037e3660046146ae565b610a65565b60405161030e9190614a5c565b34801561039c57600080fd5b506103a5610b27565b60405161030e91906149fe565b3480156103be57600080fd5b506103d26103cd3660046143ee565b610b2c565b60405161030e96959493929190615693565b3480156103f057600080fd5b506103a5610bbd565b34801561040557600080fd5b50610419610414366004614437565b610bc2565b60405161030e9291906156e9565b34801561043357600080fd5b506103a5610f19565b61033761044a366004614222565b610f1e565b34801561045b57600080fd5b5061038361046a3660046144e2565b61139e565b34801561047b57600080fd5b5061033761048a36600461414c565b611763565b34801561049b57600080fd5b506104a4611893565b60405161030e919061552a565b3480156104bd57600080fd5b506103016118b7565b3480156104d257600080fd5b506103a56104e136600461414c565b6118db565b3480156104f257600080fd5b5061033761050136600461472e565b611907565b34801561051257600080fd5b50610337610521366004614621565b611ceb565b34801561053257600080fd5b50610337611db0565b34801561054757600080fd5b506103a56105563660046141cb565b611ead565b34801561056757600080fd5b506103a5611ed9565b34801561057c57600080fd5b5061033761058b36600461440a565b611ede565b34801561059c57600080fd5b506103376105ab3660046146cb565b6120ab565b3480156105bc57600080fd5b506103376105cb366004614210565b6121ae565b3480156105dc57600080fd5b506103376105eb366004614604565b6122e4565b3480156105fc57600080fd5b506103016123f5565b34801561061157600080fd5b506103a5612411565b34801561062657600080fd5b506103a56106353660046143ee565b612416565b34801561064657600080fd5b50610337610655366004614522565b612428565b34801561066657600080fd5b5061067a61067536600461440a565b612924565b60405161030e91906154b1565b34801561069357600080fd5b506103a5612936565b3480156106a857600080fd5b506104a46106b73660046143ee565b61293b565b3480156106c857600080fd5b506106dc6106d736600461465b565b612951565b60405161030e91906156f7565b3480156106f557600080fd5b506107096107043660046146ae565b612a22565b60405161030e91906149db565b34801561072257600080fd5b506103016107313660046146ae565b612a42565b34801561074257600080fd5b506103d2610751366004614193565b612a75565b34801561076257600080fd5b506103a56107713660046143ee565b612b11565b34801561078257600080fd5b506103376107913660046146ae565b612b23565b3480156107a257600080fd5b506103376107b1366004614604565b612c2b565b3480156107c257600080fd5b506103376107d136600461414c565b612d30565b3480156107e257600080fd5b506103376107f136600461414c565b612e60565b34801561080257600080fd5b506103a5612fce565b34801561081757600080fd5b506103a561082636600461414c565b612fd4565b34801561083757600080fd5b50610337610846366004614593565b612fe6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260005414156108c7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005573ffffffffffffffffffffffffffffffffffffffff82166109085760405162461bcd60e51b81526004016108ff90614c80565b60405180910390fd5b33600090815260046020526040902054610922908261338e565b3360009081526004602052604080822092909255905173ffffffffffffffffffffffffffffffffffffffff841690839061095b906148ef565b60006040518083038185875af1925050503d8060008114610998576040519150601f19603f3d011682016040523d82523d6000602084013e61099d565b606091505b50509050806109be5760405162461bcd60e51b81526004016108ff90614bec565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3bfd26201736b5cb14a562ab3cfc2bef76901726e3a78483d6288af47131e1d984604051610a1b91906149fe565b60405180910390a35050600160005550565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60086020908152600092835260408084208252918352918190208054825160026001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921691909104601f810185900485028201850190935282815292909190830182828015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b600381565b6007602052600090815260409020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b600681565b6000806000610bd18a8a6133eb565b905060608415610c1a5785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350610ce992505050565b61ffff808c166000908152600860209081526040808320606087015190941683529281529082902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018616150201909316929092049182018490048402810184019094528084529091830182828015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b505050505090505b6000826040015173ffffffffffffffffffffffffffffffffffffffff1663c03f15298d85606001518e8e8e9050876040518663ffffffff1660e01b8152600401610d37959493929190615607565b60206040518083038186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8791906147c3565b905060008b905060008460a0015173ffffffffffffffffffffffffffffffffffffffff16635553fb8e8f87606001518860800151866040518563ffffffff1660e01b8152600401610ddb9493929190615650565b60206040518083038186803b158015610df357600080fd5b505afa158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b91906147c3565b6003546040517f5cbbbd7500000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690635cbbbd7590610e8b908e90889087906004016149e6565b60206040518083038186803b158015610ea357600080fd5b505afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb91906147c3565b90508a610eeb5780975087610ef0565b809650865b50610f0582610eff8a876135f7565b906135f7565b975050505050505097509795505050505050565b600281565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f735760405162461bcd60e51b81526004016108ff906152a9565b61ffff89166000908152600e60205260409020548b908a90610fa75760405162461bcd60e51b81526004016108ff90614b21565b61ffff81166000908152600c6020526040812054606091908015801590610fd05750601481018c145b610fec5760405162461bcd60e51b81526004016108ff9061533d565b6000808e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050838101601401519250905073ffffffffffffffffffffffffffffffffffffffff878116908316146110685760405162461bcd60e51b81526004016108ff90614f8a565b8e8e600090859261107b93929190615730565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f6fe7b6730000000000000000000000000000000000000000000000000000000081529297505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636fe7b67391506111289089908b908690600401615539565b602060405180830381600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a91906147f7565b935050505060008a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394506111c692508791508890506133eb565b9050600061120e86838986518d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061365192505050565b9050600061121d87848a613838565b9050600061122d83838b8f6138ff565b9050600061123f82610eff86866135f7565b9050348111156112615760405162461bcd60e51b81526004016108ff90614c23565b600061126d348361338e565b905080156113005760008f73ffffffffffffffffffffffffffffffffffffffff168260405161129b906148ef565b60006040518083038185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b50509050806112fe5760405162461bcd60e51b81526004016108ff90614d97565b505b6000887f00000000000000000000000000000000000000000000000000000000000000008d8d8d8c60405160200161133d969594939291906148f2565b60405160208183030381529060405290507fe9bded5f24a4168e4f3bf44e00298c993b22376aad8c58c7dda9718a54cbea828160405161137d9190614a5c565b60405180910390a15050505050505050505050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832061ffff871684529091529020606090600183141561143f57805461ffff166114295761ffff8086166000908152600760209081526040918290205491516114129392909216910161552a565b60405160208183030381529060405291505061175c565b80546040516114129161ffff169060200161552a565b60028314156114b557805462010000900467ffffffffffffffff166114935761ffff85166000908152600760209081526040918290205491516114129262010000900467ffffffffffffffff1691016156f7565b80546040516114129162010000900467ffffffffffffffff16906020016156f7565b60038314156115675780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166115315761ffff8516600090815260076020908152604091829020549151611412926a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1691016149ba565b8054604051611412916a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906020016149ba565b60048314156116205780547e01000000000000000000000000000000000000000000000000000000000000900461ffff166115e85761ffff808616600090815260076020908152604091829020549151611412937e01000000000000000000000000000000000000000000000000000000000000909304909216910161552a565b8054604051611412917e01000000000000000000000000000000000000000000000000000000000000900461ffff169060200161552a565b600583141561168d57600181015467ffffffffffffffff1661166e5761ffff85166000908152600760209081526040918290206001015491516114129267ffffffffffffffff1691016156f7565b60018101546040516114129167ffffffffffffffff16906020016156f7565b600683141561174257600181015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661170b5761ffff85166000908152600760209081526040918290206001015491516114129268010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1691016149ba565b60018101546040516114129168010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906020016149ba565b60405162461bcd60e51b81526004016108ff90614bb5565b505b9392505050565b61176b613ad1565b73ffffffffffffffffffffffffffffffffffffffff166117896123f5565b73ffffffffffffffffffffffffffffffffffffffff16146117f1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166118245760405162461bcd60e51b81526004016108ff90614cdd565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f33d644987381deff4408951d55afa136f124e22a7810b163b2aaa3ebef770f6490600090a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460205260409020545b919050565b61190f613ad1565b73ffffffffffffffffffffffffffffffffffffffff1661192d6123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8088166000908152600a60205260409020548116908716118015906119c1575060008661ffff16115b6119dd5760405162461bcd60e51b81526004016108ff906150d8565b60008567ffffffffffffffff1611611a075760405162461bcd60e51b81526004016108ff906153f7565b73ffffffffffffffffffffffffffffffffffffffff8416611a3a5760405162461bcd60e51b81526004016108ff90614d3a565b61ffff8088166000908152600b602090815260408083209387168352929052205460ff16611a7a5760405162461bcd60e51b81526004016108ff90614ac4565b60008267ffffffffffffffff1611611aa45760405162461bcd60e51b81526004016108ff906152e0565b73ffffffffffffffffffffffffffffffffffffffff8116611ad75760405162461bcd60e51b81526004016108ff90614e62565b6040518060c001604052808761ffff1681526020018667ffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018461ffff1681526020018367ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815250600760008961ffff1661ffff16815260200190815260200160002060008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001600a6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600001601e6101000a81548161ffff021916908361ffff16021790555060808201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508661ffff167f5a76432853a0871c4e780def7f3ffc7912339b53f022ac31127fe5ff84a36fa1878787878787604051611cda96959493929190615693565b60405180910390a250505050505050565b336000908152600d6020908152604080832061ffff8816845282528083208684528252808320848452909152902054828110611d395760405162461bcd60e51b81526004016108ff9061501e565b336000818152600d6020908152604080832061ffff8a1680855290835281842089855283528184208785529092529182902086905590517f74bbc026808dcba59692d6a8bb20596849ca718e10e2432c6cdf48af865bc5d990611da190889087908990614a07565b60405180910390a35050505050565b611db8613ad1565b73ffffffffffffffffffffffffffffffffffffffff16611dd66123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611e3e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600d60209081526000948552604080862082529385528385208152918452828420909152825290205481565b600481565b611ee6613ad1565b73ffffffffffffffffffffffffffffffffffffffff16611f046123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611f9f5760405162461bcd60e51b81526004016108ff90614fc1565b61ffff8083166000908152600a60205260409020548116908110611fd55760405162461bcd60e51b81526004016108ff9061524c565b61ffff8381166000818152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660019790970195861696871790556009825280832095835294905283902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861617905591519091907f802d55279d51813cb7a9a98e8fd2d7bec5346cb830901c11b85d1650cb857e9a9061209e9085906149ba565b60405180910390a2505050565b6120b3613ad1565b73ffffffffffffffffffffffffffffffffffffffff166120d16123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8085166000908152600860209081526040808320938716835292905220612164908383613f17565b508261ffff168461ffff167f4a5695eee2a74d548d5f5c485a3de99ace99e3b664c8e30a90f49be6ebb5493284846040516121a0929190614a48565b60405180910390a350505050565b60026000541415612206576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005560035473ffffffffffffffffffffffffffffffffffffffff1633146122425760405162461bcd60e51b81526004016108ff90614b7e565b60055461224f908261338e565b6005556002546122769073ffffffffffffffffffffffffffffffffffffffff168383613ad5565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3a20c8c3cd1848485ae8261a52398bb9b26f195b717306b3cf7f058e62c095d5836040516122d391906149fe565b60405180910390a350506001600055565b6122ec613ad1565b73ffffffffffffffffffffffffffffffffffffffff1661230a6123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612372576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff82166000908152600c6020526040902054156123a35760405162461bcd60e51b81526004016108ff9061539a565b61ffff82166000818152600c602052604090819020839055517f0611bb2107e385b79ec826fff8ecc1c1248a7aae3c875c96668f8cfbf1734220906123e99084906149fe565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600581565b600c6020526000908152604090205481565b600061243488886133eb565b604081015190915073ffffffffffffffffffffffffffffffffffffffff1633146124705760405162461bcd60e51b81526004016108ff90614f53565b612478613fc1565b61ffff89166000908152600c6020526040902054806124a95760405162461bcd60e51b81526004016108ff9061533d565b60a083015173ffffffffffffffffffffffffffffffffffffffff166000908152600d6020908152604080832061ffff8e16845282528083208a84528252808320898452909152902054801580159061250f5750836020015167ffffffffffffffff168110155b61252b5760405162461bcd60e51b81526004016108ff90615454565b61ffff808c166000908152600960209081526040808320885190941683529290528190205490517fb71e0f7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690819063b71e0f71906125aa908b908b908b908990600401614a1d565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261261e9190810190614312565b60a081015161ffff8e166000908152600e602052604090205491955014915050801561264d575060a082015115155b6126695760405162461bcd60e51b81526004016108ff90614ebf565b8961ffff16826000015161ffff16146126945760405162461bcd60e51b81526004016108ff90614f1c565b80826080015151146126b85760405162461bcd60e51b81526004016108ff90615135565b7f000000000000000000000000000000000000000000000000000000000000000061ffff16826020015161ffff16146127035760405162461bcd60e51b81526004016108ff906150a1565b8873ffffffffffffffffffffffffffffffffffffffff16826060015173ffffffffffffffffffffffffffffffffffffffff16146127525760405162461bcd60e51b81526004016108ff90614e2b565b61275b89613b67565b6127d957816060015173ffffffffffffffffffffffffffffffffffffffff16826000015161ffff167fa2786598bd84ae4a299103996359e6cb4333404583256079dfc279386baf5832846080015185604001518660c00151805190602001206040516127c993929190614a95565b60405180910390a350505061291b565b6000826080015183606001516040516020016127f69291906148a5565b6040516020818303038152906040529050826060015173ffffffffffffffffffffffffffffffffffffffff16836000015161ffff167f2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d856080015186604001518760c001518051906020012060405161287193929190614a95565b60405180910390a37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c2fa48138c838d87604001518e8960c001516040518763ffffffff1660e01b81526004016128e496959493929190615599565b600060405180830381600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b50505050505050505b50505050505050565b61292c613fff565b61175c83836133eb565b600181565b600a6020526000908152604090205461ffff1681565b6040517fc533338f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063c533338f906129ca9087908790879060040161557b565b60206040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a91906147f7565b949350505050565b600b60209081526000928352604080842090915290825290205460ff1681565b600960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60066020908152600092835260408084209091529082529020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b600e6020526000908152604090205481565b612b2b613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612b496123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8083166000818152600b60209081526040808320948616835293905282902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517fec23bee6f88cfecebb09d6aaaed66f0ce110debc1f61117c8270a7116597df9a906123e990849061552a565b612c33613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612c516123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612cb9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff82166000908152600e602052604090205415612cea5760405162461bcd60e51b81526004016108ff906151ef565b61ffff82166000818152600e602052604090819020839055517f0dad975e1d2fbe771c95cdcc7be9a1e61181de7173abe0a32b8f8f83140873e5906123e99084906149fe565b612d38613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612d566123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612dbe576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612df15760405162461bcd60e51b81526004016108ff90615192565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef390600090a250565b612e68613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612e866123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612eee576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f405760405162461bcd60e51b81526004018080602001828103825260268152602001806157d06026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055481565b60046020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461303b5760405162461bcd60e51b81526004016108ff906152a9565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832061ffff89168452909152902060018414156130f5576000613086838501856143ee565b61ffff8089166000908152600a602052604090205491925090811690821611156130c25760405162461bcd60e51b81526004016108ff906150d8565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116178155613335565b600284141561314c57600061310c838501856147db565b825467ffffffffffffffff90911662010000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff90911617825550613335565b60038414156131b75760006131638385018561414c565b825473ffffffffffffffffffffffffffffffffffffffff9091166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff90911617825550613335565b60048414156132715760006131ce838501856143ee565b61ffff8089166000908152600b602090815260408083209385168352929052205490915060ff1680613202575061ffff8116155b61321e5760405162461bcd60e51b81526004016108ff90614ac4565b815461ffff9091167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116178155613335565b60058414156132c9576000613288838501856147db565b6001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff9290921691909117905550613335565b60068414156117425760006132e08385018561414c565b60018301805473ffffffffffffffffffffffffffffffffffffffff90921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055505b838573ffffffffffffffffffffffffffffffffffffffff167ffc01bf86212a14151d51d1be5c2ac64d67d5ec823dfc6f53298d7ce3f3d3d252858560405161337e929190614a48565b60405180910390a3505050505050565b6000828211156133e5576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6133f3613fff565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020908152604080832061ffff808916808652918452828520835160c0810185528154808416825267ffffffffffffffff6201000082048116838901526a010000000000000000000082048a16838801527e010000000000000000000000000000000000000000000000000000000000009091048416606083015260019092015491821660808201526801000000000000000090910490961660a0870152908452600790925290912082519091166134cd57805461ffff1682525b602082015167ffffffffffffffff166134f857805462010000900467ffffffffffffffff1660208301525b604082015173ffffffffffffffffffffffffffffffffffffffff166135435780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660408301525b606082015161ffff1661357e5780547e01000000000000000000000000000000000000000000000000000000000000900461ffff1660608301525b608082015167ffffffffffffffff166135a657600181015467ffffffffffffffff1660808301525b60a082015173ffffffffffffffffffffffffffffffffffffffff1661175a576001015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660a08201529392505050565b60008282018381101561175c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081516000141561372c5761ffff808716600090815260086020908152604080832060608a015190941683529281529082902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845290918301828280156137245780601f106136f957610100808354040283529160200191613724565b820191906000526020600020905b81548152906001019060200180831161370757829003601f168201915b505050505091505b604080860151606087015191517f5886ea650000000000000000000000000000000000000000000000000000000081529091829173ffffffffffffffffffffffffffffffffffffffff831691635886ea6591613792918c918b908b908b90600401615607565b602060405180830381600087803b1580156137ac57600080fd5b505af11580156137c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e491906147c3565b92506137f08284613b6d565b7fb0c632f55f1e1b3b2c3d82f41ee4716bb4c00f0f5d84cdafc141581bb8757a4f848860600151604051613825929190614a6f565b60405180910390a1505095945050505050565b60a0820151606083015160808401516040517fc5e193cd0000000000000000000000000000000000000000000000000000000081526000939273ffffffffffffffffffffffffffffffffffffffff84169263c5e193cd926138a1928a9290918990600401615650565b602060405180830381600087803b1580156138bb57600080fd5b505af11580156138cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f391906147c3565b915061175a8183613b6d565b60008073ffffffffffffffffffffffffffffffffffffffff8316158061393b575060025473ffffffffffffffffffffffffffffffffffffffff16155b6003546040517f5cbbbd7500000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690635cbbbd759061399c908515908b908b906004016149e6565b60206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec91906147c3565b90508015613ac7578115613a265760035473ffffffffffffffffffffffffffffffffffffffff16613a1d8183613b6d565b81935050613ac7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a75575073ffffffffffffffffffffffffffffffffffffffff841632145b613a915760405162461bcd60e51b81526004016108ff90614dce565b600254613ab69073ffffffffffffffffffffffffffffffffffffffff16853084613bca565b600554613ac390826135f7565b6005555b5050949350505050565b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613b62908490613c65565b505050565b3b151590565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054613b9d90826135f7565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613c5f908590613c65565b50505050565b6000613cc7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d239092919063ffffffff16565b805190915015613b6257808060200190516020811015613ce657600080fd5b5051613b625760405162461bcd60e51b815260040180806020018281038252602a8152602001806157f6602a913960400191505060405180910390fd5b6060612a1a848460008585613d3785613b67565b613d88576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613df157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613db4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613e53576040519150601f19603f3d011682016040523d82523d6000602084013e613e58565b606091505b5091509150613e68828286613e73565b979650505050505050565b60608315613e8257508161175c565b825115613e925782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613edc578181015183820152602001613ec4565b50505050905090810190601f168015613f095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613f4d5760008555613fb1565b82601f10613f84578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613fb1565b82800160010185558215613fb1579182015b82811115613fb1578235825591602001919060010190613f96565b50613fbd929150614034565b5090565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b5b80821115613fbd5760008155600101614035565b803561190281615784565b805161190281615784565b60008083601f840112614070578182fd5b50813567ffffffffffffffff811115614087578182fd5b60208301915083602082850101111561409f57600080fd5b9250929050565b600082601f8301126140b6578081fd5b815167ffffffffffffffff8111156140ca57fe5b6140fb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161570c565b81815284602083860101111561410f578283fd5b612a1a826020830160208701615758565b8035611902816157a9565b8051611902816157a9565b8035611902816157b9565b8051611902816157b9565b60006020828403121561415d578081fd5b813561175c81615784565b6000806040838503121561417a578081fd5b823561418581615784565b946020939093013593505050565b600080604083850312156141a5578182fd5b82356141b081615784565b915060208301356141c0816157a9565b809150509250929050565b600080600080608085870312156141e0578182fd5b84356141eb81615784565b935060208501356141fb816157a9565b93969395505050506040820135916060013590565b6000806040838503121561417a578182fd5b60008060008060008060008060008060006101008c8e031215614243578687fd5b61424c8c614049565b9a5061425a60208d01614136565b995061426860408d01614120565b985067ffffffffffffffff8060608e01351115614283578788fd5b6142938e60608f01358f0161405f565b909950975060808d01358110156142a8578687fd5b6142b88e60808f01358f0161405f565b90975095506142c960a08e01614049565b94506142d760c08e01614049565b93508060e08e013511156142e9578283fd5b506142fa8d60e08e01358e0161405f565b81935080925050509295989b509295989b9093969950565b600060208284031215614323578081fd5b815167ffffffffffffffff8082111561433a578283fd5b9083019060e0828603121561434d578283fd5b61435760e061570c565b6143608361412b565b815261436e6020840161412b565b602082015261437f60408401614141565b604082015261439060608401614054565b60608201526080830151828111156143a6578485fd5b6143b2878286016140a6565b60808301525060a083015160a082015260c0830151828111156143d3578485fd5b6143df878286016140a6565b60c08301525095945050505050565b6000602082840312156143ff578081fd5b813561175c816157a9565b6000806040838503121561441c578182fd5b8235614427816157a9565b915060208301356141c081615784565b600080600080600080600060a0888a031215614451578081fd5b873561445c816157a9565b9650602088013561446c81615784565b9550604088013567ffffffffffffffff80821115614488578283fd5b6144948b838c0161405f565b909750955060608a0135915081151582146144ad578283fd5b909350608089013590808211156144c2578283fd5b506144cf8a828b0161405f565b989b979a50959850939692959293505050565b6000806000606084860312156144f6578081fd5b8335614501816157a9565b9250602084013561451181615784565b929592945050506040919091013590565b600080600080600080600060c0888a03121561453c578081fd5b8735614547816157a9565b9650602088013561455781615784565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115614587578182fd5b6144cf8a828b0161405f565b6000806000806000608086880312156145aa578283fd5b85356145b5816157a9565b945060208601356145c581615784565b935060408601359250606086013567ffffffffffffffff8111156145e7578182fd5b6145f38882890161405f565b969995985093965092949392505050565b60008060408385031215614616578182fd5b8235614185816157a9565b60008060008060808587031215614636578182fd5b8435614641816157a9565b966020860135965060408601359560600135945092505050565b60008060006040848603121561466f578081fd5b833561467a816157a9565b9250602084013567ffffffffffffffff811115614695578182fd5b6146a18682870161405f565b9497909650939450505050565b600080604083850312156146c0578182fd5b82356141b0816157a9565b600080600080606085870312156146e0578182fd5b84356146eb816157a9565b935060208501356146fb816157a9565b9250604085013567ffffffffffffffff811115614716578283fd5b6147228782880161405f565b95989497509550505050565b600080600080600080600060e0888a031215614748578081fd5b8735614753816157a9565b96506020880135614763816157a9565b95506040880135614773816157b9565b9450606088013561478381615784565b93506080880135614793816157a9565b925060a08801356147a3816157b9565b915060c08801356147b381615784565b8091505092959891949750929550565b6000602082840312156147d4578081fd5b5051919050565b6000602082840312156147ec578081fd5b813561175c816157b9565b600060208284031215614808578081fd5b815161175c816157b9565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452614873816020860160208601615758565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600083516148b7818460208801615758565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b90565b60007fffffffffffffffff0000000000000000000000000000000000000000000000008860c01b1682527fffff000000000000000000000000000000000000000000000000000000000000808860f01b1660088401527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b16600a840152808660f01b16601e840152508351614992816020850160208801615758565b808301905083516149aa816020840160208801615758565b0160200198975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526020830191909152604082015260600190565b600085825260606020830152614a37606083018587614813565b905082604083015295945050505050565b600060208252612a1a602083018486614813565b60006020825261175c602083018461485b565b600060408252614a82604083018561485b565b905061ffff831660208301529392505050565b600060608252614aa8606083018661485b565b67ffffffffffffffff9490941660208301525060400152919050565b60208082526026908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e642070726f6f60408201527f6620747970650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4c617965725a65726f3a20647374436861696e496420646f6573206e6f74206560408201527f7869737400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c792074726561737572790000000000000000604082015260600190565b6020808252601e908201527f4c617965725a65726f3a20496e76616c696420636f6e66696720747970650000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a207769746864726177206661696c6564000000000000604082015260600190565b60208082526025908201527f4c617965725a65726f3a206e6f7420656e6f756768206e617469766520666f7260408201527f2066656573000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4c617965725a65726f3a205f746f2063616e6e6f74206265207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4c617965725a65726f3a205f6c617965725a65726f546f6b656e2063616e6e6f60408201527f74206265207a65726f2061646472657373000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a20696e76616c69642072656c6179657220616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4c617965725a65726f3a206661696c656420746f20726566756e640000000000604082015260600190565b6020808252602b908201527f4c617965725a65726f3a206d75737420626520706169642062792073656e646560408201527f72206f72206f726967696e000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4c617965725a65726f3a20696e76616c69642064737441646472657373000000604082015260600190565b60208082526021908201527f4c617965725a65726f3a20696e76616c6964206f7261636c652061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4c617965725a65726f3a20696e76616c6964205f7061636b65742e756c6e416460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f4c617965725a65726f3a20696e76616c696420737263436861696e2049640000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a20696e76616c69642072656c61796572000000000000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a2077726f6e6720706174682064617461000000000000604082015260600190565b60208082526029908201527f4c617965725a65726f3a206c6962726172792063616e6e6f74206265207a657260408201527f6f20616464726573730000000000000000000000000000000000000000000000606082015260800190565b60208082526043908201527f4c617965725a65726f3a206f7261636c6520646174612063616e206f6e6c792060408201527f75706461746520696620697420686173206d6f726520636f6e6669726d61746960608201527f6f6e730000000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252601e908201527f4c617965725a65726f3a20696e76616c696420647374436861696e2049640000604082015260600190565b60208082526030908201527f4c617965725a65726f3a20696e76616c696420696e626f756e642070726f6f6660408201527f206c6962726172792076657273696f6e00000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a20696e76616c6964207372634164647265737320736960408201527f7a65000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4c617965725a65726f3a2074726561737572792063616e6e6f74206265207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4c617965725a65726f3a2072656d6f746520756c6e20616c726561647920736560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a2063616e206e6f7420616464206e6577206c6962726160408201527f7279000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c7920656e64706f696e740000000000000000604082015260600190565b6020808252602e908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e6420626c6f6360408201527f6b20636f6e6669726d6174696f6e000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4c617965725a65726f3a20696e636f72726563742072656d6f7465206164647260408201527f6573732073697a65000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4c617965725a65726f3a2072656d6f746520636861696e20616464726573732060408201527f73697a6520616c72656164792073657400000000000000000000000000000000606082015260800190565b6020808252602d908201527f4c617965725a65726f3a20696e76616c696420696e626f756e6420626c6f636b60408201527f20636f6e6669726d6174696f6e00000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4c617965725a65726f3a206e6f7420656e6f75676820626c6f636b20636f6e6660408201527f69726d6174696f6e730000000000000000000000000000000000000000000000606082015260800190565b600060c08201905061ffff808451168352602084015167ffffffffffffffff80821660208601526040860151915073ffffffffffffffffffffffffffffffffffffffff80831660408701528360608801511660608701528160808801511660808701528060a08801511660a08701525050505092915050565b61ffff91909116815260200190565b600061ffff8516825273ffffffffffffffffffffffffffffffffffffffff8416602083015260606040830152615572606083018461485b565b95945050505050565b600061ffff8516825260406020830152615572604083018486614813565b600061ffff8816825260c060208301526155b660c083018861485b565b73ffffffffffffffffffffffffffffffffffffffff8716604084015267ffffffffffffffff8616606084015284608084015282810360a08401526155fa818561485b565b9998505050505050505050565b600061ffff808816835280871660208401525073ffffffffffffffffffffffffffffffffffffffff8516604083015283606083015260a06080830152613e6860a083018461485b565b61ffff948516815292909316602083015267ffffffffffffffff16604082015273ffffffffffffffffffffffffffffffffffffffff909116606082015260800190565b61ffff968716815267ffffffffffffffff958616602082015273ffffffffffffffffffffffffffffffffffffffff948516604082015292909516606083015290921660808301529190911660a082015260c00190565b918252602082015260400190565b67ffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561572857fe5b604052919050565b6000808585111561573f578182fd5b8386111561574b578182fd5b5050820193919092039150565b60005b8381101561577357818101518382015260200161575b565b83811115613c5f5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146157a657600080fd5b50565b61ffff811681146157a657600080fd5b67ffffffffffffffff811681146157a657600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fec2950ded16215c7cfa48e61f5136dfa2770dd4f696d7deb0a7a636056c350964736f6c6343000706003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf760680000000000000000000000000000000000000000000000000000000000000065
Deployed Bytecode
0x6080604052600436106102e75760003560e01c80638317814a11610184578063d543c774116100d6578063ed28580a1161008a578063f47a5feb11610064578063f47a5feb146107f6578063f58589a21461080b578063f8e1734c1461082b576102e7565b8063ed28580a14610796578063f0f44260146107b6578063f2fde38b146107d6576102e7565b8063ddfdef5a116100bb578063ddfdef5a14610736578063ea216c2114610756578063eb0d4c3114610776576102e7565b8063d543c774146106e9578063db00719b14610716576102e7565b8063959f594311610138578063b77d22ad11610112578063b77d22ad14610687578063b8e7e3e01461069c578063b9a99bed146106bc576102e7565b8063959f59431461061a578063987fa2d51461063a578063a46622221461065a576102e7565b806387078f9f1161016957806387078f9f146105d05780638da5cb5b146105f0578063904d3b8d14610605576102e7565b80638317814a146105905780638525b711146105b0576102e7565b806352d2871f1161023d5780636a14ac82116101f1578063759c5b3b116101cb578063759c5b3b1461053b5780638140666e1461055b5780638207f79d14610570576102e7565b80636a14ac82146104e6578063704316e514610506578063715018a614610526576102e7565b80635b056da5116102225780635b056da51461048f5780635e280f11146104b157806369412bfa146104c6576102e7565b806352d2871f1461044f57806352d3b5001461046f576102e7565b80632cfacb061161029f57806340a7bb101161027957806340a7bb10146103f957806349148c37146104275780634d3a0f7c1461043c576102e7565b80632cfacb06146103905780632f813464146103b257806331bd2430146103e4576102e7565b806307b9ca7c116102d057806307b9ca7c1461033957806318da00111461034e5780632a819bbf14610363576102e7565b806302bd9743146102ec57806307b18bde14610317575b600080fd5b3480156102f857600080fd5b5061030161084b565b60405161030e91906149ba565b60405180910390f35b34801561032357600080fd5b50610337610332366004614168565b61086f565b005b34801561034557600080fd5b50610301610a2d565b34801561035a57600080fd5b50610301610a49565b34801561036f57600080fd5b5061038361037e3660046146ae565b610a65565b60405161030e9190614a5c565b34801561039c57600080fd5b506103a5610b27565b60405161030e91906149fe565b3480156103be57600080fd5b506103d26103cd3660046143ee565b610b2c565b60405161030e96959493929190615693565b3480156103f057600080fd5b506103a5610bbd565b34801561040557600080fd5b50610419610414366004614437565b610bc2565b60405161030e9291906156e9565b34801561043357600080fd5b506103a5610f19565b61033761044a366004614222565b610f1e565b34801561045b57600080fd5b5061038361046a3660046144e2565b61139e565b34801561047b57600080fd5b5061033761048a36600461414c565b611763565b34801561049b57600080fd5b506104a4611893565b60405161030e919061552a565b3480156104bd57600080fd5b506103016118b7565b3480156104d257600080fd5b506103a56104e136600461414c565b6118db565b3480156104f257600080fd5b5061033761050136600461472e565b611907565b34801561051257600080fd5b50610337610521366004614621565b611ceb565b34801561053257600080fd5b50610337611db0565b34801561054757600080fd5b506103a56105563660046141cb565b611ead565b34801561056757600080fd5b506103a5611ed9565b34801561057c57600080fd5b5061033761058b36600461440a565b611ede565b34801561059c57600080fd5b506103376105ab3660046146cb565b6120ab565b3480156105bc57600080fd5b506103376105cb366004614210565b6121ae565b3480156105dc57600080fd5b506103376105eb366004614604565b6122e4565b3480156105fc57600080fd5b506103016123f5565b34801561061157600080fd5b506103a5612411565b34801561062657600080fd5b506103a56106353660046143ee565b612416565b34801561064657600080fd5b50610337610655366004614522565b612428565b34801561066657600080fd5b5061067a61067536600461440a565b612924565b60405161030e91906154b1565b34801561069357600080fd5b506103a5612936565b3480156106a857600080fd5b506104a46106b73660046143ee565b61293b565b3480156106c857600080fd5b506106dc6106d736600461465b565b612951565b60405161030e91906156f7565b3480156106f557600080fd5b506107096107043660046146ae565b612a22565b60405161030e91906149db565b34801561072257600080fd5b506103016107313660046146ae565b612a42565b34801561074257600080fd5b506103d2610751366004614193565b612a75565b34801561076257600080fd5b506103a56107713660046143ee565b612b11565b34801561078257600080fd5b506103376107913660046146ae565b612b23565b3480156107a257600080fd5b506103376107b1366004614604565b612c2b565b3480156107c257600080fd5b506103376107d136600461414c565b612d30565b3480156107e257600080fd5b506103376107f136600461414c565b612e60565b34801561080257600080fd5b506103a5612fce565b34801561081757600080fd5b506103a561082636600461414c565b612fd4565b34801561083757600080fd5b50610337610846366004614593565b612fe6565b7f0000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf7606881565b600260005414156108c7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005573ffffffffffffffffffffffffffffffffffffffff82166109085760405162461bcd60e51b81526004016108ff90614c80565b60405180910390fd5b33600090815260046020526040902054610922908261338e565b3360009081526004602052604080822092909255905173ffffffffffffffffffffffffffffffffffffffff841690839061095b906148ef565b60006040518083038185875af1925050503d8060008114610998576040519150601f19603f3d011682016040523d82523d6000602084013e61099d565b606091505b50509050806109be5760405162461bcd60e51b81526004016108ff90614bec565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3bfd26201736b5cb14a562ab3cfc2bef76901726e3a78483d6288af47131e1d984604051610a1b91906149fe565b60405180910390a35050600160005550565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60086020908152600092835260408084208252918352918190208054825160026001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921691909104601f810185900485028201850190935282815292909190830182828015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b600381565b6007602052600090815260409020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b600681565b6000806000610bd18a8a6133eb565b905060608415610c1a5785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929350610ce992505050565b61ffff808c166000908152600860209081526040808320606087015190941683529281529082902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018616150201909316929092049182018490048402810184019094528084529091830182828015610ce15780601f10610cb657610100808354040283529160200191610ce1565b820191906000526020600020905b815481529060010190602001808311610cc457829003601f168201915b505050505090505b6000826040015173ffffffffffffffffffffffffffffffffffffffff1663c03f15298d85606001518e8e8e9050876040518663ffffffff1660e01b8152600401610d37959493929190615607565b60206040518083038186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8791906147c3565b905060008b905060008460a0015173ffffffffffffffffffffffffffffffffffffffff16635553fb8e8f87606001518860800151866040518563ffffffff1660e01b8152600401610ddb9493929190615650565b60206040518083038186803b158015610df357600080fd5b505afa158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b91906147c3565b6003546040517f5cbbbd7500000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690635cbbbd7590610e8b908e90889087906004016149e6565b60206040518083038186803b158015610ea357600080fd5b505afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb91906147c3565b90508a610eeb5780975087610ef0565b809650865b50610f0582610eff8a876135f7565b906135f7565b975050505050505097509795505050505050565b600281565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff163314610f735760405162461bcd60e51b81526004016108ff906152a9565b61ffff89166000908152600e60205260409020548b908a90610fa75760405162461bcd60e51b81526004016108ff90614b21565b61ffff81166000908152600c6020526040812054606091908015801590610fd05750601481018c145b610fec5760405162461bcd60e51b81526004016108ff9061533d565b6000808e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050838101601401519250905073ffffffffffffffffffffffffffffffffffffffff878116908316146110685760405162461bcd60e51b81526004016108ff90614f8a565b8e8e600090859261107b93929190615730565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f6fe7b6730000000000000000000000000000000000000000000000000000000081529297505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf760681691636fe7b67391506111289089908b908690600401615539565b602060405180830381600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a91906147f7565b935050505060008a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394506111c692508791508890506133eb565b9050600061120e86838986518d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061365192505050565b9050600061121d87848a613838565b9050600061122d83838b8f6138ff565b9050600061123f82610eff86866135f7565b9050348111156112615760405162461bcd60e51b81526004016108ff90614c23565b600061126d348361338e565b905080156113005760008f73ffffffffffffffffffffffffffffffffffffffff168260405161129b906148ef565b60006040518083038185875af1925050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b50509050806112fe5760405162461bcd60e51b81526004016108ff90614d97565b505b6000887f00000000000000000000000000000000000000000000000000000000000000658d8d8d8c60405160200161133d969594939291906148f2565b60405160208183030381529060405290507fe9bded5f24a4168e4f3bf44e00298c993b22376aad8c58c7dda9718a54cbea828160405161137d9190614a5c565b60405180910390a15050505050505050505050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832061ffff871684529091529020606090600183141561143f57805461ffff166114295761ffff8086166000908152600760209081526040918290205491516114129392909216910161552a565b60405160208183030381529060405291505061175c565b80546040516114129161ffff169060200161552a565b60028314156114b557805462010000900467ffffffffffffffff166114935761ffff85166000908152600760209081526040918290205491516114129262010000900467ffffffffffffffff1691016156f7565b80546040516114129162010000900467ffffffffffffffff16906020016156f7565b60038314156115675780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff166115315761ffff8516600090815260076020908152604091829020549151611412926a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1691016149ba565b8054604051611412916a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906020016149ba565b60048314156116205780547e01000000000000000000000000000000000000000000000000000000000000900461ffff166115e85761ffff808616600090815260076020908152604091829020549151611412937e01000000000000000000000000000000000000000000000000000000000000909304909216910161552a565b8054604051611412917e01000000000000000000000000000000000000000000000000000000000000900461ffff169060200161552a565b600583141561168d57600181015467ffffffffffffffff1661166e5761ffff85166000908152600760209081526040918290206001015491516114129267ffffffffffffffff1691016156f7565b60018101546040516114129167ffffffffffffffff16906020016156f7565b600683141561174257600181015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661170b5761ffff85166000908152600760209081526040918290206001015491516114129268010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1691016149ba565b60018101546040516114129168010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16906020016149ba565b60405162461bcd60e51b81526004016108ff90614bb5565b505b9392505050565b61176b613ad1565b73ffffffffffffffffffffffffffffffffffffffff166117896123f5565b73ffffffffffffffffffffffffffffffffffffffff16146117f1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166118245760405162461bcd60e51b81526004016108ff90614cdd565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f33d644987381deff4408951d55afa136f124e22a7810b163b2aaa3ebef770f6490600090a250565b7f000000000000000000000000000000000000000000000000000000000000006581565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460205260409020545b919050565b61190f613ad1565b73ffffffffffffffffffffffffffffffffffffffff1661192d6123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8088166000908152600a60205260409020548116908716118015906119c1575060008661ffff16115b6119dd5760405162461bcd60e51b81526004016108ff906150d8565b60008567ffffffffffffffff1611611a075760405162461bcd60e51b81526004016108ff906153f7565b73ffffffffffffffffffffffffffffffffffffffff8416611a3a5760405162461bcd60e51b81526004016108ff90614d3a565b61ffff8088166000908152600b602090815260408083209387168352929052205460ff16611a7a5760405162461bcd60e51b81526004016108ff90614ac4565b60008267ffffffffffffffff1611611aa45760405162461bcd60e51b81526004016108ff906152e0565b73ffffffffffffffffffffffffffffffffffffffff8116611ad75760405162461bcd60e51b81526004016108ff90614e62565b6040518060c001604052808761ffff1681526020018667ffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018461ffff1681526020018367ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815250600760008961ffff1661ffff16815260200190815260200160002060008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001600a6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600001601e6101000a81548161ffff021916908361ffff16021790555060808201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508661ffff167f5a76432853a0871c4e780def7f3ffc7912339b53f022ac31127fe5ff84a36fa1878787878787604051611cda96959493929190615693565b60405180910390a250505050505050565b336000908152600d6020908152604080832061ffff8816845282528083208684528252808320848452909152902054828110611d395760405162461bcd60e51b81526004016108ff9061501e565b336000818152600d6020908152604080832061ffff8a1680855290835281842089855283528184208785529092529182902086905590517f74bbc026808dcba59692d6a8bb20596849ca718e10e2432c6cdf48af865bc5d990611da190889087908990614a07565b60405180910390a35050505050565b611db8613ad1565b73ffffffffffffffffffffffffffffffffffffffff16611dd66123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611e3e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600d60209081526000948552604080862082529385528385208152918452828420909152825290205481565b600481565b611ee6613ad1565b73ffffffffffffffffffffffffffffffffffffffff16611f046123f5565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611f9f5760405162461bcd60e51b81526004016108ff90614fc1565b61ffff8083166000908152600a60205260409020548116908110611fd55760405162461bcd60e51b81526004016108ff9061524c565b61ffff8381166000818152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660019790970195861696871790556009825280832095835294905283902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861617905591519091907f802d55279d51813cb7a9a98e8fd2d7bec5346cb830901c11b85d1650cb857e9a9061209e9085906149ba565b60405180910390a2505050565b6120b3613ad1565b73ffffffffffffffffffffffffffffffffffffffff166120d16123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8085166000908152600860209081526040808320938716835292905220612164908383613f17565b508261ffff168461ffff167f4a5695eee2a74d548d5f5c485a3de99ace99e3b664c8e30a90f49be6ebb5493284846040516121a0929190614a48565b60405180910390a350505050565b60026000541415612206576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005560035473ffffffffffffffffffffffffffffffffffffffff1633146122425760405162461bcd60e51b81526004016108ff90614b7e565b60055461224f908261338e565b6005556002546122769073ffffffffffffffffffffffffffffffffffffffff168383613ad5565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3a20c8c3cd1848485ae8261a52398bb9b26f195b717306b3cf7f058e62c095d5836040516122d391906149fe565b60405180910390a350506001600055565b6122ec613ad1565b73ffffffffffffffffffffffffffffffffffffffff1661230a6123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612372576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff82166000908152600c6020526040902054156123a35760405162461bcd60e51b81526004016108ff9061539a565b61ffff82166000818152600c602052604090819020839055517f0611bb2107e385b79ec826fff8ecc1c1248a7aae3c875c96668f8cfbf1734220906123e99084906149fe565b60405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600581565b600c6020526000908152604090205481565b600061243488886133eb565b604081015190915073ffffffffffffffffffffffffffffffffffffffff1633146124705760405162461bcd60e51b81526004016108ff90614f53565b612478613fc1565b61ffff89166000908152600c6020526040902054806124a95760405162461bcd60e51b81526004016108ff9061533d565b60a083015173ffffffffffffffffffffffffffffffffffffffff166000908152600d6020908152604080832061ffff8e16845282528083208a84528252808320898452909152902054801580159061250f5750836020015167ffffffffffffffff168110155b61252b5760405162461bcd60e51b81526004016108ff90615454565b61ffff808c166000908152600960209081526040808320885190941683529290528190205490517fb71e0f7100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690819063b71e0f71906125aa908b908b908b908990600401614a1d565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261261e9190810190614312565b60a081015161ffff8e166000908152600e602052604090205491955014915050801561264d575060a082015115155b6126695760405162461bcd60e51b81526004016108ff90614ebf565b8961ffff16826000015161ffff16146126945760405162461bcd60e51b81526004016108ff90614f1c565b80826080015151146126b85760405162461bcd60e51b81526004016108ff90615135565b7f000000000000000000000000000000000000000000000000000000000000006561ffff16826020015161ffff16146127035760405162461bcd60e51b81526004016108ff906150a1565b8873ffffffffffffffffffffffffffffffffffffffff16826060015173ffffffffffffffffffffffffffffffffffffffff16146127525760405162461bcd60e51b81526004016108ff90614e2b565b61275b89613b67565b6127d957816060015173ffffffffffffffffffffffffffffffffffffffff16826000015161ffff167fa2786598bd84ae4a299103996359e6cb4333404583256079dfc279386baf5832846080015185604001518660c00151805190602001206040516127c993929190614a95565b60405180910390a350505061291b565b6000826080015183606001516040516020016127f69291906148a5565b6040516020818303038152906040529050826060015173ffffffffffffffffffffffffffffffffffffffff16836000015161ffff167f2bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4d856080015186604001518760c001518051906020012060405161287193929190614a95565b60405180910390a37f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663c2fa48138c838d87604001518e8960c001516040518763ffffffff1660e01b81526004016128e496959493929190615599565b600060405180830381600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b50505050505050505b50505050505050565b61292c613fff565b61175c83836133eb565b600181565b600a6020526000908152604090205461ffff1681565b6040517fc533338f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf76068169063c533338f906129ca9087908790879060040161557b565b60206040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a91906147f7565b949350505050565b600b60209081526000928352604080842090915290825290205460ff1681565b600960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60066020908152600092835260408084209091529082529020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b600e6020526000908152604090205481565b612b2b613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612b496123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8083166000818152600b60209081526040808320948616835293905282902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517fec23bee6f88cfecebb09d6aaaed66f0ce110debc1f61117c8270a7116597df9a906123e990849061552a565b612c33613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612c516123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612cb9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff82166000908152600e602052604090205415612cea5760405162461bcd60e51b81526004016108ff906151ef565b61ffff82166000818152600e602052604090819020839055517f0dad975e1d2fbe771c95cdcc7be9a1e61181de7173abe0a32b8f8f83140873e5906123e99084906149fe565b612d38613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612d566123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612dbe576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612df15760405162461bcd60e51b81526004016108ff90615192565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef390600090a250565b612e68613ad1565b73ffffffffffffffffffffffffffffffffffffffff16612e866123f5565b73ffffffffffffffffffffffffffffffffffffffff1614612eee576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f405760405162461bcd60e51b81526004018080602001828103825260268152602001806157d06026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055481565b60046020526000908152604090205481565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff16331461303b5760405162461bcd60e51b81526004016108ff906152a9565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260066020908152604080832061ffff89168452909152902060018414156130f5576000613086838501856143ee565b61ffff8089166000908152600a602052604090205491925090811690821611156130c25760405162461bcd60e51b81526004016108ff906150d8565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116178155613335565b600284141561314c57600061310c838501856147db565b825467ffffffffffffffff90911662010000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff90911617825550613335565b60038414156131b75760006131638385018561414c565b825473ffffffffffffffffffffffffffffffffffffffff9091166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff90911617825550613335565b60048414156132715760006131ce838501856143ee565b61ffff8089166000908152600b602090815260408083209385168352929052205490915060ff1680613202575061ffff8116155b61321e5760405162461bcd60e51b81526004016108ff90614ac4565b815461ffff9091167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116178155613335565b60058414156132c9576000613288838501856147db565b6001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff9290921691909117905550613335565b60068414156117425760006132e08385018561414c565b60018301805473ffffffffffffffffffffffffffffffffffffffff90921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055505b838573ffffffffffffffffffffffffffffffffffffffff167ffc01bf86212a14151d51d1be5c2ac64d67d5ec823dfc6f53298d7ce3f3d3d252858560405161337e929190614a48565b60405180910390a3505050505050565b6000828211156133e5576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6133f3613fff565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260066020908152604080832061ffff808916808652918452828520835160c0810185528154808416825267ffffffffffffffff6201000082048116838901526a010000000000000000000082048a16838801527e010000000000000000000000000000000000000000000000000000000000009091048416606083015260019092015491821660808201526801000000000000000090910490961660a0870152908452600790925290912082519091166134cd57805461ffff1682525b602082015167ffffffffffffffff166134f857805462010000900467ffffffffffffffff1660208301525b604082015173ffffffffffffffffffffffffffffffffffffffff166135435780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660408301525b606082015161ffff1661357e5780547e01000000000000000000000000000000000000000000000000000000000000900461ffff1660608301525b608082015167ffffffffffffffff166135a657600181015467ffffffffffffffff1660808301525b60a082015173ffffffffffffffffffffffffffffffffffffffff1661175a576001015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660a08201529392505050565b60008282018381101561175c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081516000141561372c5761ffff808716600090815260086020908152604080832060608a015190941683529281529082902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845290918301828280156137245780601f106136f957610100808354040283529160200191613724565b820191906000526020600020905b81548152906001019060200180831161370757829003601f168201915b505050505091505b604080860151606087015191517f5886ea650000000000000000000000000000000000000000000000000000000081529091829173ffffffffffffffffffffffffffffffffffffffff831691635886ea6591613792918c918b908b908b90600401615607565b602060405180830381600087803b1580156137ac57600080fd5b505af11580156137c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e491906147c3565b92506137f08284613b6d565b7fb0c632f55f1e1b3b2c3d82f41ee4716bb4c00f0f5d84cdafc141581bb8757a4f848860600151604051613825929190614a6f565b60405180910390a1505095945050505050565b60a0820151606083015160808401516040517fc5e193cd0000000000000000000000000000000000000000000000000000000081526000939273ffffffffffffffffffffffffffffffffffffffff84169263c5e193cd926138a1928a9290918990600401615650565b602060405180830381600087803b1580156138bb57600080fd5b505af11580156138cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f391906147c3565b915061175a8183613b6d565b60008073ffffffffffffffffffffffffffffffffffffffff8316158061393b575060025473ffffffffffffffffffffffffffffffffffffffff16155b6003546040517f5cbbbd7500000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690635cbbbd759061399c908515908b908b906004016149e6565b60206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec91906147c3565b90508015613ac7578115613a265760035473ffffffffffffffffffffffffffffffffffffffff16613a1d8183613b6d565b81935050613ac7565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a75575073ffffffffffffffffffffffffffffffffffffffff841632145b613a915760405162461bcd60e51b81526004016108ff90614dce565b600254613ab69073ffffffffffffffffffffffffffffffffffffffff16853084613bca565b600554613ac390826135f7565b6005555b5050949350505050565b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613b62908490613c65565b505050565b3b151590565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054613b9d90826135f7565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613c5f908590613c65565b50505050565b6000613cc7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d239092919063ffffffff16565b805190915015613b6257808060200190516020811015613ce657600080fd5b5051613b625760405162461bcd60e51b815260040180806020018281038252602a8152602001806157f6602a913960400191505060405180910390fd5b6060612a1a848460008585613d3785613b67565b613d88576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613df157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613db4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613e53576040519150601f19603f3d011682016040523d82523d6000602084013e613e58565b606091505b5091509150613e68828286613e73565b979650505050505050565b60608315613e8257508161175c565b825115613e925782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613edc578181015183820152602001613ec4565b50505050905090810190601f168015613f095780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613f4d5760008555613fb1565b82601f10613f84578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613fb1565b82800160010185558215613fb1579182015b82811115613fb1578235825591602001919060010190613f96565b50613fbd929150614034565b5090565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b5b80821115613fbd5760008155600101614035565b803561190281615784565b805161190281615784565b60008083601f840112614070578182fd5b50813567ffffffffffffffff811115614087578182fd5b60208301915083602082850101111561409f57600080fd5b9250929050565b600082601f8301126140b6578081fd5b815167ffffffffffffffff8111156140ca57fe5b6140fb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161570c565b81815284602083860101111561410f578283fd5b612a1a826020830160208701615758565b8035611902816157a9565b8051611902816157a9565b8035611902816157b9565b8051611902816157b9565b60006020828403121561415d578081fd5b813561175c81615784565b6000806040838503121561417a578081fd5b823561418581615784565b946020939093013593505050565b600080604083850312156141a5578182fd5b82356141b081615784565b915060208301356141c0816157a9565b809150509250929050565b600080600080608085870312156141e0578182fd5b84356141eb81615784565b935060208501356141fb816157a9565b93969395505050506040820135916060013590565b6000806040838503121561417a578182fd5b60008060008060008060008060008060006101008c8e031215614243578687fd5b61424c8c614049565b9a5061425a60208d01614136565b995061426860408d01614120565b985067ffffffffffffffff8060608e01351115614283578788fd5b6142938e60608f01358f0161405f565b909950975060808d01358110156142a8578687fd5b6142b88e60808f01358f0161405f565b90975095506142c960a08e01614049565b94506142d760c08e01614049565b93508060e08e013511156142e9578283fd5b506142fa8d60e08e01358e0161405f565b81935080925050509295989b509295989b9093969950565b600060208284031215614323578081fd5b815167ffffffffffffffff8082111561433a578283fd5b9083019060e0828603121561434d578283fd5b61435760e061570c565b6143608361412b565b815261436e6020840161412b565b602082015261437f60408401614141565b604082015261439060608401614054565b60608201526080830151828111156143a6578485fd5b6143b2878286016140a6565b60808301525060a083015160a082015260c0830151828111156143d3578485fd5b6143df878286016140a6565b60c08301525095945050505050565b6000602082840312156143ff578081fd5b813561175c816157a9565b6000806040838503121561441c578182fd5b8235614427816157a9565b915060208301356141c081615784565b600080600080600080600060a0888a031215614451578081fd5b873561445c816157a9565b9650602088013561446c81615784565b9550604088013567ffffffffffffffff80821115614488578283fd5b6144948b838c0161405f565b909750955060608a0135915081151582146144ad578283fd5b909350608089013590808211156144c2578283fd5b506144cf8a828b0161405f565b989b979a50959850939692959293505050565b6000806000606084860312156144f6578081fd5b8335614501816157a9565b9250602084013561451181615784565b929592945050506040919091013590565b600080600080600080600060c0888a03121561453c578081fd5b8735614547816157a9565b9650602088013561455781615784565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115614587578182fd5b6144cf8a828b0161405f565b6000806000806000608086880312156145aa578283fd5b85356145b5816157a9565b945060208601356145c581615784565b935060408601359250606086013567ffffffffffffffff8111156145e7578182fd5b6145f38882890161405f565b969995985093965092949392505050565b60008060408385031215614616578182fd5b8235614185816157a9565b60008060008060808587031215614636578182fd5b8435614641816157a9565b966020860135965060408601359560600135945092505050565b60008060006040848603121561466f578081fd5b833561467a816157a9565b9250602084013567ffffffffffffffff811115614695578182fd5b6146a18682870161405f565b9497909650939450505050565b600080604083850312156146c0578182fd5b82356141b0816157a9565b600080600080606085870312156146e0578182fd5b84356146eb816157a9565b935060208501356146fb816157a9565b9250604085013567ffffffffffffffff811115614716578283fd5b6147228782880161405f565b95989497509550505050565b600080600080600080600060e0888a031215614748578081fd5b8735614753816157a9565b96506020880135614763816157a9565b95506040880135614773816157b9565b9450606088013561478381615784565b93506080880135614793816157a9565b925060a08801356147a3816157b9565b915060c08801356147b381615784565b8091505092959891949750929550565b6000602082840312156147d4578081fd5b5051919050565b6000602082840312156147ec578081fd5b813561175c816157b9565b600060208284031215614808578081fd5b815161175c816157b9565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452614873816020860160208601615758565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600083516148b7818460208801615758565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169190920190815260140192915050565b90565b60007fffffffffffffffff0000000000000000000000000000000000000000000000008860c01b1682527fffff000000000000000000000000000000000000000000000000000000000000808860f01b1660088401527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b16600a840152808660f01b16601e840152508351614992816020850160208801615758565b808301905083516149aa816020840160208801615758565b0160200198975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526020830191909152604082015260600190565b600085825260606020830152614a37606083018587614813565b905082604083015295945050505050565b600060208252612a1a602083018486614813565b60006020825261175c602083018461485b565b600060408252614a82604083018561485b565b905061ffff831660208301529392505050565b600060608252614aa8606083018661485b565b67ffffffffffffffff9490941660208301525060400152919050565b60208082526026908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e642070726f6f60408201527f6620747970650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4c617965725a65726f3a20647374436861696e496420646f6573206e6f74206560408201527f7869737400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c792074726561737572790000000000000000604082015260600190565b6020808252601e908201527f4c617965725a65726f3a20496e76616c696420636f6e66696720747970650000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a207769746864726177206661696c6564000000000000604082015260600190565b60208082526025908201527f4c617965725a65726f3a206e6f7420656e6f756768206e617469766520666f7260408201527f2066656573000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4c617965725a65726f3a205f746f2063616e6e6f74206265207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4c617965725a65726f3a205f6c617965725a65726f546f6b656e2063616e6e6f60408201527f74206265207a65726f2061646472657373000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a20696e76616c69642072656c6179657220616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4c617965725a65726f3a206661696c656420746f20726566756e640000000000604082015260600190565b6020808252602b908201527f4c617965725a65726f3a206d75737420626520706169642062792073656e646560408201527f72206f72206f726967696e000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4c617965725a65726f3a20696e76616c69642064737441646472657373000000604082015260600190565b60208082526021908201527f4c617965725a65726f3a20696e76616c6964206f7261636c652061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4c617965725a65726f3a20696e76616c6964205f7061636b65742e756c6e416460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f4c617965725a65726f3a20696e76616c696420737263436861696e2049640000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a20696e76616c69642072656c61796572000000000000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a2077726f6e6720706174682064617461000000000000604082015260600190565b60208082526029908201527f4c617965725a65726f3a206c6962726172792063616e6e6f74206265207a657260408201527f6f20616464726573730000000000000000000000000000000000000000000000606082015260800190565b60208082526043908201527f4c617965725a65726f3a206f7261636c6520646174612063616e206f6e6c792060408201527f75706461746520696620697420686173206d6f726520636f6e6669726d61746960608201527f6f6e730000000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252601e908201527f4c617965725a65726f3a20696e76616c696420647374436861696e2049640000604082015260600190565b60208082526030908201527f4c617965725a65726f3a20696e76616c696420696e626f756e642070726f6f6660408201527f206c6962726172792076657273696f6e00000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a20696e76616c6964207372634164647265737320736960408201527f7a65000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4c617965725a65726f3a2074726561737572792063616e6e6f74206265207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4c617965725a65726f3a2072656d6f746520756c6e20616c726561647920736560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a2063616e206e6f7420616464206e6577206c6962726160408201527f7279000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c7920656e64706f696e740000000000000000604082015260600190565b6020808252602e908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e6420626c6f6360408201527f6b20636f6e6669726d6174696f6e000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4c617965725a65726f3a20696e636f72726563742072656d6f7465206164647260408201527f6573732073697a65000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4c617965725a65726f3a2072656d6f746520636861696e20616464726573732060408201527f73697a6520616c72656164792073657400000000000000000000000000000000606082015260800190565b6020808252602d908201527f4c617965725a65726f3a20696e76616c696420696e626f756e6420626c6f636b60408201527f20636f6e6669726d6174696f6e00000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4c617965725a65726f3a206e6f7420656e6f75676820626c6f636b20636f6e6660408201527f69726d6174696f6e730000000000000000000000000000000000000000000000606082015260800190565b600060c08201905061ffff808451168352602084015167ffffffffffffffff80821660208601526040860151915073ffffffffffffffffffffffffffffffffffffffff80831660408701528360608801511660608701528160808801511660808701528060a08801511660a08701525050505092915050565b61ffff91909116815260200190565b600061ffff8516825273ffffffffffffffffffffffffffffffffffffffff8416602083015260606040830152615572606083018461485b565b95945050505050565b600061ffff8516825260406020830152615572604083018486614813565b600061ffff8816825260c060208301526155b660c083018861485b565b73ffffffffffffffffffffffffffffffffffffffff8716604084015267ffffffffffffffff8616606084015284608084015282810360a08401526155fa818561485b565b9998505050505050505050565b600061ffff808816835280871660208401525073ffffffffffffffffffffffffffffffffffffffff8516604083015283606083015260a06080830152613e6860a083018461485b565b61ffff948516815292909316602083015267ffffffffffffffff16604082015273ffffffffffffffffffffffffffffffffffffffff909116606082015260800190565b61ffff968716815267ffffffffffffffff958616602082015273ffffffffffffffffffffffffffffffffffffffff948516604082015292909516606083015290921660808301529190911660a082015260c00190565b918252602082015260400190565b67ffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561572857fe5b604052919050565b6000808585111561573f578182fd5b8386111561574b578182fd5b5050820193919092039150565b60005b8381101561577357818101518382015260200161575b565b83811115613c5f5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146157a657600080fd5b50565b61ffff811681146157a657600080fd5b67ffffffffffffffff811681146157a657600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fec2950ded16215c7cfa48e61f5136dfa2770dd4f696d7deb0a7a636056c350964736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf760680000000000000000000000000000000000000000000000000000000000000065
-----Decoded View---------------
Arg [0] : _endpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _nonceContract (address): 0x5B905fE05F81F3a8ad8B28C6E17779CFAbf76068
Arg [2] : _localChainId (uint16): 101
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 0000000000000000000000005b905fe05f81f3a8ad8b28c6e17779cfabf76068
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000065
Deployed Bytecode Sourcemap
558:22855:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2424:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18848:415;;;;;;;;;;-1:-1:-1;18848:415:20;;;;;:::i;:::-;;:::i;:::-;;1166:28;;;;;;;;;;;;;:::i;1200:42::-;;;;;;;;;;;;;:::i;1597:71::-;;;;;;;;;;-1:-1:-1;1597:71:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;906:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1477:67::-;;;;;;;;;;-1:-1:-1;1477:67:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;1089:43::-;;;;;;;;;;;;;:::i;17049:1188::-;;;;;;;;;;-1:-1:-1;17049:1188:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;836:64::-;;;;;;;;;;;;;:::i;5983:2363::-;;;;;;:::i;:::-;;:::i;14983:2004::-;;;;;;;;;;-1:-1:-1;14983:2004:20;;;;;:::i;:::-;;:::i;19391:280::-;;;;;;;;;;-1:-1:-1;19391:280:20;;;;;:::i;:::-;;:::i;2382:36::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2332:44::-;;;;;;;;;;;;;:::i;22917:126::-;;;;;;;;;;-1:-1:-1;22917:126:20;;;;;:::i;:::-;;:::i;20662:1252::-;;;;;;;;;;-1:-1:-1;20662:1252:20;;;;;:::i;:::-;;:::i;11013:644::-;;;;;;;;;;-1:-1:-1;11013:644:20;;;;;:::i;:::-;;:::i;1693:145:16:-;;;;;;;;;;;;;:::i;2100:101:20:-;;;;;;;;;;-1:-1:-1;2100:101:20;;;;;:::i;:::-;;:::i;956:56::-;;;;;;;;;;;;;:::i;19934:490::-;;;;;;;;;;-1:-1:-1;19934:490:20;;;;;:::i;:::-;;:::i;21920:291::-;;;;;;;;;;-1:-1:-1;21920:291:20;;;;;:::i;:::-;;:::i;18389:331::-;;;;;;;;;;-1:-1:-1;18389:331:20;;;;;:::i;:::-;;:::i;22512:287::-;;;;;;;;;;-1:-1:-1;22512:287:20;;;;;:::i;:::-;;:::i;1061:85:16:-;;;;;;;;;;;;;:::i;1018:65:20:-;;;;;;;;;;;;;:::i;2044:50::-;;;;;;;;;;-1:-1:-1;2044:50:20;;;;;:::i;:::-;;:::i;3238:2739::-;;;;;;;;;;-1:-1:-1;3238:2739:20;;;;;:::i;:::-;;:::i;11833:181::-;;;;;;;;;;-1:-1:-1;11833:181:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;764:66::-;;;;;;;;;;;;;:::i;1828:55::-;;;;;;;;;;-1:-1:-1;1828:55:20;;;;;:::i;:::-;;:::i;23049:173::-;;;;;;;;;;-1:-1:-1;23049:173:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1923:72::-;;;;;;;;;;-1:-1:-1;1923:72:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1693:::-;;;;;;;;;;-1:-1:-1;1693:72:20;;;;;:::i;:::-;;:::i;1355:80::-;;;;;;;;;;-1:-1:-1;1355:80:20;;;;;:::i;:::-;;:::i;2267:43::-;;;;;;;;;;-1:-1:-1;2267:43:20;;;;;:::i;:::-;;:::i;20430:226::-;;;;;;;;;;-1:-1:-1;20430:226:20;;;;;:::i;:::-;;:::i;22217:289::-;;;;;;;;;;-1:-1:-1;22217:289:20;;;;;:::i;:::-;;:::i;19677:251::-;;;;;;;;;;-1:-1:-1;19677:251:20;;;;;:::i;:::-;;:::i;1987:240:16:-;;;;;;;;;;-1:-1:-1;1987:240:16;;;;;:::i;:::-;;:::i;1297:27:20:-;;;;;;;;;;;;;:::i;1249:42::-;;;;;;;;;;-1:-1:-1;1249:42:20;;;;;:::i;:::-;;:::i;13149:1828::-;;;;;;;;;;-1:-1:-1;13149:1828:20;;;;;:::i;:::-;;:::i;2424:44::-;;;:::o;18848:415::-;1680:1:17;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;18956:19:20::1;::::0;::::1;18948:69;;;;-1:-1:-1::0;;;18948:69:20::1;;;;;;;:::i;:::-;;;;;;;;;19063:10;19052:22;::::0;;;:10:::1;:22;::::0;;;;;:35:::1;::::0;19079:7;19052:26:::1;:35::i;:::-;19038:10;19027:22;::::0;;;:10:::1;:22;::::0;;;;;:60;;;;19117:28;;19027:22:::1;19117:8:::0;::::1;::::0;19133:7;;19117:28:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19098:47;;;19163:7;19155:46;;;;-1:-1:-1::0;;;19155:46:20::1;;;;;;;:::i;:::-;19243:3;19216:40;;19231:10;19216:40;;;19248:7;19216:40;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:17;2563:7;:22;-1:-1:-1;18848:415:20:o;1166:28::-;;;;;;:::o;1200:42::-;;;;;;:::o;1597:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;906:44::-;949:1;906:44;:::o;1477:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1089:43::-;1131:1;1089:43;:::o;17049:1188::-;17208:14;17224:11;17247:40;17290:31;17304:11;17317:3;17290:13;:31::i;:::-;17247:74;-1:-1:-1;17355:26:20;17395:25;;17391:194;;17452:14;;17436:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17436:30:20;;-1:-1:-1;17391:194:20;;-1:-1:-1;;;17391:194:20;;17513:33;;;;;;;;:20;:33;;;;;;;;17547:26;;;;17513:61;;;;;;;;;;;;17497:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17513:61;;17497:77;;17513:61;17497:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17391:194;17594:15;17632:8;:16;;;17612:44;;;17657:11;17670:8;:26;;;17698:3;17703:8;;:15;;17720:13;17612:122;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17594:140;;17767:10;17780:3;17767:16;;17811:14;17847:8;:15;;;17828:42;;;17871:11;17884:8;:26;;;17912:8;:35;;;17949:2;17828:124;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18007:16;;:58;;;;;17811:141;;-1:-1:-1;17988:16:20;;18007;;;;;:24;;:58;;18032:9;;18043:10;;17811:141;;18007:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17988:77;;18075:9;:58;;18122:11;18110:23;;;18075:58;;;18096:11;18087:20;;;18075:58;-1:-1:-1;18190:40:20;18220:9;18190:25;:9;18204:10;18190:13;:25::i;:::-;:29;;:40::i;:::-;18178:52;;17049:1188;;;;;;;;;;;;;;;;:::o;836:64::-;899:1;836:64;:::o;5983:2363::-;3057:8;3049:31;;3070:10;3049:31;3041:68;;;;-1:-1:-1;;;3041:68:20;;;;;;;:::i;:::-;6300:21:::1;::::0;::::1;6225:10;6300:21:::0;;;:9:::1;:21;::::0;;;;;6238:3;;6271:11;;6292:84:::1;;;;-1:-1:-1::0;;;6292:84:20::1;;;;;;;:::i;:::-;6531:31;::::0;::::1;6420:12;6531:31:::0;;;:19:::1;:31;::::0;;;;;6387:23:::1;::::0;6420:12;6635:21;;;::::1;::::0;:62:::1;;-1:-1:-1::0;6676:2:20::1;:21:::0;::::1;6660:37:::0;::::1;6635:62;6627:115;;;;-1:-1:-1::0;;;6627:115:20::1;;;;;;;:::i;:::-;6756:17;6787::::0;6807:5:::1;;6787:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;6890:36:20;;;6904:2:::1;6890:36:::0;6884:43;;-1:-1:-1;6787:25:20;-1:-1:-1;6987:15:20::1;::::0;;::::1;::::0;;::::1;;6979:54;;;;-1:-1:-1::0;;;6979:54:20::1;;;;;;;:::i;:::-;7060:5;;7066:1;7060:25;7068:16;7060:25;;;;;;;:::i;:::-;7047:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;7107:45:20::1;::::0;;;;7047:38;;-1:-1:-1;;7107:23:20::1;:13;:23;::::0;::::1;::::0;-1:-1:-1;7107:45:20::1;::::0;7131:10;;7143:2;;7147:4;;7107:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7099:53;;3119:1;;;7173:20;7196:8;;7173:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;7173:31:20;;-1:-1:-1;7257:29:20::1;::::0;-1:-1:-1;7271:10:20;;-1:-1:-1;7283:2:20;;-1:-1:-1;7257:13:20::1;:29::i;:::-;7214:72;;7329:15;7347:72;7362:10;7374:8;7384:2;7388:7;:14;7404;;7347:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;7347:14:20::1;::::0;-1:-1:-1;;;7347:72:20:i:1;:::-;7329:90;;7429:14;7446:39;7460:10;7472:8;7482:2;7446:13;:39::i;:::-;7429:56;;7495:22;7520:65;7539:10;7551:9;7562:2;7566:18;7520;:65::i;:::-;7495:90:::0;-1:-1:-1;7659:19:20::1;7681:48;7495:90:::0;7681:25:::1;:10:::0;7696:9;7681:14:::1;:25::i;:48::-;7659:70;;7843:9;7825:14;:27;;7817:77;;;;-1:-1:-1::0;;;7817:77:20::1;;;;;;;:::i;:::-;7944:11;7958:29;:9;7972:14:::0;7958:13:::1;:29::i;:::-;7944:43:::0;-1:-1:-1;8001:10:20;;7997:159:::1;;8028:12;8046:14;:19;;8073:6;8046:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8027:57;;;8106:7;8098:47;;;;-1:-1:-1::0;;;8098:47:20::1;;;;;;;:::i;:::-;7997:159;;8198:27;8245:5;8252:12;8266:2;8270:10;8282;8294:7;8228:74;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8198:104;;8317:22;8324:14;8317:22;;;;;;:::i;:::-;;;;;;;;3119:1;;;;;;;;;;;;5983:2363:::0;;;;;;;;;;;:::o;14983:2004::-;15156:14;;;15112:41;15156:14;;;:9;:14;;;;;;;;:30;;;;;;;;;;15088:12;;829:1;15201:56;;15197:1784;;;15277:35;;;;15273:157;;15355:32;;;;;;;;:16;:32;;;;;;;;;:59;15344:71;;;;15355:59;;;;;15344:71;;:::i;:::-;;;;;;;;;;;;;15337:78;;;;;15273:157;15461:35;;15450:47;;;;15461:35;;;15450:47;;;:::i;15197:1784::-;899:1;15518:11;:54;15514:1467;;;15592:34;;;;;;;15588:155;;15669:32;;;;;;;:16;:32;;;;;;;;;:58;15658:70;;;;15669:58;;;;;;15658:70;;:::i;15588:155::-;15774:34;;15763:46;;;;15774:34;;;;;;15763:46;;;:::i;15514:1467::-;949:1;15830:11;:34;15826:1155;;;15884:16;;;;;:32;:16;15880:130;;15954:32;;;;;;;:16;:32;;;;;;;;;:40;15943:52;;;;15954:40;;;;;;15943:52;;:::i;15880:130::-;16041:16;;16030:28;;;;16041:16;;;;;;16030:28;;;:::i;15826:1155::-;1011:1;16079:11;:46;16075:906;;;16145:26;;;;;;;16141:139;;16214:32;;;;;;;;:16;:32;;;;;;;;;:50;16203:62;;;;16214:50;;;;;;;;16203:62;;:::i;16141:139::-;16311:26;;16300:38;;;;16311:26;;;;;;16300:38;;;:::i;16075:906::-;1082:1;16359:11;:55;16355:626;;;16434:35;;;;;;16430:157;;16512:32;;;;;;;:16;:32;;;;;;;;;:59;;;16501:71;;;;16512:59;;;16501:71;;:::i;16430:157::-;16618:35;;;;16607:47;;;;16618:35;;;16607:47;;;:::i;16355:626::-;1131:1;16675:11;:33;16671:310;;;16728:15;;;;;;;:31;:15;16724:128;;16797:32;;;;;;;:16;:32;;;;;;;;;:39;;;16786:51;;;;16797:39;;;;;;16786:51;;:::i;16724:128::-;16883:15;;;;16872:27;;;;16883:15;;;;;;16872:27;;;:::i;16671:310::-;16930:40;;-1:-1:-1;;;16930:40:20;;;;;;;:::i;16671:310::-;14983:2004;;;;;;;:::o;19391:280::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19480:31:20::1;::::0;::::1;19472:93;;;;-1:-1:-1::0;;;19472:93:20::1;;;;;;;:::i;:::-;19575:14;:40:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;19630:34:::1;::::0;::::1;::::0;-1:-1:-1;;19630:34:20::1;19391:280:::0;:::o;2382:36::-;;;:::o;2332:44::-;;;:::o;22917:126::-;23016:20;;;22993:4;23016:20;;;:10;:20;;;;;;22917:126;;;;:::o;20662:1252::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20952:32:20::1;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;::::1;20921:63:::0;;::::1;;::::0;::::1;::::0;:98:::1;;;21018:1;20988:27;:31;;;20921:98;20913:159;;;;-1:-1:-1::0;;;20913:159:20::1;;;;;;;:::i;:::-;21119:1;21090:26;:30;;;21082:88;;;;-1:-1:-1::0;;;21082:88:20::1;;;;;;;:::i;:::-;21188:24;::::0;::::1;21180:71;;;;-1:-1:-1::0;;;21180:71:20::1;;;;;;;:::i;:::-;21269:32;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:52;;::::1;::::0;;;;;;;::::1;;21261:103;;;;-1:-1:-1::0;;;21261:103:20::1;;;;;;;:::i;:::-;21412:1;21382:27;:31;;;21374:90;;;;-1:-1:-1::0;;;21374:90:20::1;;;;;;;:::i;:::-;21482:23;::::0;::::1;21474:69;;;;-1:-1:-1::0;;;21474:69:20::1;;;;;;;:::i;:::-;21582:149;;;;;;;;21607:27;21582:149;;;;;;21636:26;21582:149;;;;;;21664:8;21582:149;;;;;;21674:18;21582:149;;;;;;21694:27;21582:149;;;;;;21723:7;21582:149;;;;::::0;21553:16:::1;:26;21570:8;21553:26;;;;;;;;;;;;;;;:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21773:8;21746:161;;;21783:27;21812:26;21840:8;21850:18;21870:27;21899:7;21746:161;;;;;;;;;;;:::i;:::-;;;;;;;;20662:1252:::0;;;;;;;:::o;11013:644::-;11181:10;11143:24;11170:22;;;:10;:22;;;;;;;;:35;;;;;;;;;;:48;;;;;;;;:60;;;;;;;;;11312:36;;;11304:116;;;;-1:-1:-1;;;11304:116:20;;;;;;;:::i;:::-;11490:10;11479:22;;;;:10;:22;;;;;;;;:35;;;;;;;;;;;;:48;;;;;;;;:60;;;;;;;;;;:77;;;11572:78;;;;;;11515:11;;11528:10;;11542:14;;11572:78;:::i;:::-;;;;;;;;11013:644;;;;;:::o;1693:145:16:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1783:6:::1;::::0;1762:40:::1;::::0;1799:1:::1;::::0;1762:40:::1;1783:6;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1812:6;:19:::0;;;::::1;::::0;;1693:145::o;2100:101:20:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;956:56::-;1011:1;956:56;:::o;19934:490::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20046:24:20::1;::::0;::::1;20038:78;;;;-1:-1:-1::0;;;20038:78:20::1;;;;;;;:::i;:::-;20141:32;::::0;;::::1;20126:12;20141:32:::0;;;:22:::1;:32;::::0;;;;;;::::1;::::0;20191:13;::::1;20183:60;;;;-1:-1:-1::0;;;20183:60:20::1;;;;;;;:::i;:::-;20253:32;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:42;;;::::1;20288:7;::::0;;;::::1;20253:42:::0;;::::1;::::0;;::::1;::::0;;20305:19:::1;:29:::0;;;;;:36;;;;;;;;;:47;;;::::1;;::::0;::::1;;::::0;;20367:50;;20288:7;;20253:32;20367:50:::1;::::0;::::1;::::0;20305:47;;20367:50:::1;:::i;:::-;;;;;;;;1343:1:16;19934:490:20::0;;:::o;21920:291::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22059:30:20::1;::::0;;::::1;;::::0;;;:20:::1;:30;::::0;;;;;;;:42;;::::1;::::0;;;;;;:59:::1;::::0;22104:14;;22059:59:::1;:::i;:::-;;22177:10;22133:71;;22167:8;22133:71;;;22189:14;;22133:71;;;;;;;:::i;:::-;;;;;;;;21920:291:::0;;;;:::o;18389:331::-;1680:1:17;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;18508:16:20::1;::::0;::::1;;18486:10;:39;18478:76;;;;-1:-1:-1::0;;;18478:76:20::1;;;;;;;:::i;:::-;18582:15;::::0;:28:::1;::::0;18602:7;18582:19:::1;:28::i;:::-;18564:15;:46:::0;18620:14:::1;::::0;:41:::1;::::0;:14:::1;;18648:3:::0;18653:7;18620:27:::1;:41::i;:::-;18700:3;18676:37;;18688:10;18676:37;;;18705:7;18676:37;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:17;2563:7;:22;18389:331:20:o;22512:287::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22607:29:20::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;;:34;22599:95:::1;;;;-1:-1:-1::0;;;22599:95:20::1;;;;;;;:::i;:::-;22704:29;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;;;:37;;;22756:36;::::1;::::0;::::1;::::0;22736:5;;22756:36:::1;:::i;:::-;;;;;;;;22512:287:::0;;:::o;1061:85:16:-;1133:6;;;;1061:85;:::o;1018:65:20:-;1082:1;1018:65;:::o;2044:50::-;;;;;;;;;;;;;:::o;3238:2739::-;3509:40;3552:39;3566:11;3579;3552:13;:39::i;:::-;3660:16;;;;3509:82;;-1:-1:-1;3660:30:20;;3680:10;3660:30;3652:69;;;;-1:-1:-1;;;3652:69:20;;;;;;;:::i;:::-;3732:37;;:::i;:::-;3804:32;;;3779:22;3804:32;;;:19;:32;;;;;;3854:22;3846:75;;;;-1:-1:-1;;;3846:75:20;;;;;;;:::i;:::-;4096:15;;;;4085:27;;4058:24;4085:27;;;:10;:27;;;;;;;;:40;;;;;;;;;;:53;;;;;;;;:65;;;;;;;;;4172:23;;;;;:84;;;4222:8;:34;;;4199:57;;:19;:57;;4172:84;4164:138;;;;-1:-1:-1;;;4164:138:20;;;;;;;:::i;:::-;4365:32;;;;4339:23;4365:32;;;:19;:32;;;;;;;;4398:35;;4365:69;;;;;;;;;;;;4458:108;;;;;4365:69;;;;;;;4458:58;;:108;;4517:10;;4529:17;;;;4548;;4458:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4657:18;;;;4631:22;;;;;;;:9;:22;;;;;;4448:118;;-1:-1:-1;4631:44:20;;-1:-1:-1;;4631:80:20;;;;-1:-1:-1;4679:18:20;;;;:32;;4631:80;4623:130;;;;-1:-1:-1;;;4623:130:20;;;;;;;:::i;:::-;4793:11;4771:33;;:7;:18;;;:33;;;4763:76;;;;-1:-1:-1;;;4763:76:20;;;;;;;:::i;:::-;5007:17;4978:7;:18;;;:25;:46;4970:93;;;;-1:-1:-1;;;4970:93:20;;;;;;;:::i;:::-;5103:12;5081:34;;:7;:18;;;:34;;;5073:77;;;;-1:-1:-1;;;5073:77:20;;;;;;;:::i;:::-;5190:11;5168:33;;:7;:18;;;:33;;;5160:75;;;;-1:-1:-1;;;5160:75:20;;;;;;;:::i;:::-;5447:24;5459:11;5447;:24::i;:::-;5442:194;;5543:7;:18;;;5492:113;;5503:7;:18;;;5492:113;;;5523:7;:18;;;5563:7;:13;;;5588:7;:15;;;5578:26;;;;;;5492:113;;;;;;;;:::i;:::-;;;;;;;;5619:7;;;;;5442:194;5646:21;5687:7;:18;;;5707:7;:18;;;5670:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5646:80;;5796:7;:18;;;5741:117;;5756:7;:18;;;5741:117;;;5776:7;:18;;;5816:7;:13;;;5841:7;:15;;;5831:26;;;;;;5741:117;;;;;;;;:::i;:::-;;;;;;;;5868:8;:23;;;5892:11;5905:8;5915:11;5928:7;:13;;;5943:9;5954:7;:15;;;5868:102;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3238:2739;;;;;;;;;;;;:::o;11833:181::-;11923:31;;:::i;:::-;11973:34;11987:14;12003:3;11973:13;:34::i;764:66::-;829:1;764:66;:::o;1828:55::-;;;;;;;;;;;;;;;:::o;23049:173::-;23171:44;;;;;23146:6;;23171:27;:13;:27;;;;:44;;23199:8;;23209:5;;;;23171:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23164:51;23049:173;-1:-1:-1;;;;23049:173:20:o;1923:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1693:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1355:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2267:43::-;;;;;;;;;;;;;:::o;20430:226::-;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20533:32:20::1;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:44;;::::1;::::0;;;;;;;;:51;;;::::1;20580:4;20533:51;::::0;;20599:50;;::::1;::::0;::::1;::::0;20566:10;;20599:50:::1;:::i;22217:289::-:0;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22319:25:20::1;::::0;::::1;22356:1;22319:25:::0;;;:9:::1;:25;::::0;;;;;:39;22311:85:::1;;;;-1:-1:-1::0;;;22311:85:20::1;;;;;;;:::i;:::-;22406:25;::::0;::::1;;::::0;;;:9:::1;:25;::::0;;;;;;:38;;;22459:40;::::1;::::0;::::1;::::0;22434:10;;22459:40:::1;:::i;19677:251::-:0;1284:12:16;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19754:25:20::1;::::0;::::1;19746:80;;;;-1:-1:-1::0;;;19746:80:20::1;;;;;;;:::i;:::-;19836:16;:48:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;19899:22:::1;::::0;::::1;::::0;-1:-1:-1;;19899:22:20::1;19677:251:::0;:::o;1987:240:16:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2075:22:::1;::::0;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:16::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:6;::::0;2155:38:::1;::::0;::::1;::::0;;::::1;::::0;2176:6:::1;::::0;2155:38:::1;::::0;2176:6:::1;::::0;2155:38:::1;2203:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1987:240::o;1297:27:20:-;;;;:::o;1249:42::-;;;;;;;;;;;;;:::o;13149:1828::-;3057:8;3049:31;;3070:10;3049:31;3041:68;;;;-1:-1:-1;;;3041:68:20;;;;;;;:::i;:::-;13331:14:::1;::::0;::::1;13287:41;13331:14:::0;;;:9:::1;:14;::::0;;;;;;;:30:::1;::::0;::::1;::::0;;;;;;;829:1:::1;13375:56:::0;::::1;13371:1541;;;13447:33;13483:29;::::0;;::::1;13494:7:::0;13483:29:::1;:::i;:::-;13564:38;::::0;;::::1;;::::0;;;:22:::1;:38;::::0;;;;;13447:65;;-1:-1:-1;13564:38:20;;::::1;13534:68:::0;;::::1;;;13526:129;;;;-1:-1:-1::0;;;13526:129:20::1;;;;;;;:::i;:::-;13669:64:::0;;;::::1;;::::0;;;::::1;;::::0;;13371:1541:::1;;;899:1;13754:11;:54;13750:1162;;;13824:25;13852:29;::::0;;::::1;13863:7:::0;13852:29:::1;:::i;:::-;13895:55:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;13750:1162:20::1;;;949:1;13971:11;:34;13967:945;;;14021:15;14039:30;::::0;;::::1;14050:7:::0;14039:30:::1;:::i;:::-;14083:26:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;13967:945:20::1;;;1011:1;14130:11;:46;14126:786;;;14192:24;14219:29;::::0;;::::1;14230:7:::0;14219:29:::1;:::i;:::-;14270:38;::::0;;::::1;;::::0;;;:22:::1;:38;::::0;;;;;;;:57;;::::1;::::0;;;;;;;14192:56;;-1:-1:-1;14270:57:20::1;;::::0;:83:::1;;-1:-1:-1::0;14331:22:20::1;::::0;::::1;::::0;14270:83:::1;14262:134;;;;-1:-1:-1::0;;;14262:134:20::1;;;;;;;:::i;:::-;14410:46:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;14126:786:::1;;;1082:1;14477:11;:55;14473:439;;;14548:25;14576:29;::::0;;::::1;14587:7:::0;14576:29:::1;:::i;:::-;14619:35;::::0;::::1;:56:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;14473:439:20::1;;;1131:1;14696:11;:33;14692:220;;;14745:14;14762:30;::::0;;::::1;14773:7:::0;14762:30:::1;:::i;:::-;14806:15;::::0;::::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;14692:220:20::1;14949:11;14944:3;14927:43;;;14962:7;;14927:43;;;;;;;:::i;:::-;;;;;;;;3119:1;13149:1828:::0;;;;;:::o;3128:155:19:-;3186:7;3218:1;3213;:6;;3205:49;;;;;-1:-1:-1;;;3205:49:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:19;;;3128:155::o;12020:1123:20:-;12102:31;;:::i;:::-;12186:14;;;;12145:38;12186:14;;;:9;:14;;;;;;;;:30;;;;;;;;;;;;;12145:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12275:32;;;:16;:32;;;;;;12322:33;;12275:32;;12322:38;12318:145;;12412:40;;;;12376:76;;12318:145;12477:32;;;;:37;;12473:142;;12565:39;;;;;;;12530:32;;;:74;12473:142;12629:14;;;;:30;;12625:99;;12692:21;;;;;;;12675:14;;;:38;12625:99;12738:24;;;;:29;;12734:118;;12810:31;;;;;;;12783:24;;;:58;12734:118;12866:33;;;;:38;;12862:145;;12956:40;;;;;;12920:33;;;:76;12862:145;13021:13;;;;:29;;13017:96;;13082:20;;;;;;;;13066:13;;;:36;:13;;-1:-1:-1;;;12020:1123:20:o;2682:175:19:-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;-1:-1:-1;;;2786:46:19;;;;;;;;;;;;;;;;;;;;;;;;;;;8352:741:20;8518:15;8549:14;:21;8574:1;8549:26;8545:136;;;8608:33;;;;;;;;:20;:33;;;;;;;;8642:27;;;;8608:62;;;;;;;;;;;;8591:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8608:62;;8591:79;;8608:62;8591:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8545:136;8715:17;;;;;8861:27;;;;8830:94;;;;;8715:17;;;;8830;;;;;;:94;;8848:11;;8890:3;;8895:12;;8909:14;;8830:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8817:107;;8935:44;8952:14;8968:10;8935:16;:44::i;:::-;9028:58;9042:14;9058:9;:27;;;9028:58;;;;;;;:::i;:::-;;;;;;;;8352:741;;;;;;;;;:::o;9099:393::-;9266:16;;;;9361:27;;;;9390:36;;;;9304:128;;;;;9216:14;;9266:16;9304:43;;;;;;:128;;9348:11;;9361:27;;9428:3;;9304:128;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9292:140;;9443:42;9460:13;9475:9;9443:16;:42::i;9498:1214::-;9620:22;;9757:34;;;;;:77;;-1:-1:-1;9803:14:20;;9795:39;9803:14;9795:39;9757:77;9863:16;;:63;;;;;9738:96;;-1:-1:-1;9844:16:20;;9863;;;;;:24;;:63;;9888:12;;;9902:11;;9915:10;;9863:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9844:82;-1:-1:-1;9941:15:20;;9937:769;;9976:11;9972:724;;;10041:16;;;;10076:46;10041:16;10110:11;10076:16;:46::i;:::-;10160:11;10140:31;;9972:724;;;;10348:3;10326:25;;:18;:25;;;:60;;;-1:-1:-1;10355:31:20;;;10377:9;10355:31;10326:60;10318:116;;;;-1:-1:-1;;;10318:116:20;;;;;;;:::i;:::-;10533:14;;:79;;:14;;10565:18;10593:4;10600:11;10533:31;:79::i;:::-;10649:15;;:32;;10669:11;10649:19;:32::i;:::-;10631:15;:50;9972:724;9498:1214;;;;;;;;:::o;598:104:2:-;685:10;598:104;:::o;677:175:18:-;786:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;809:23;786:58;;;759:86;;779:5;;759:19;:86::i;:::-;677:175;;;:::o;23228:183:20:-;23352:17;23395:9;;;23228:183::o;10718:143::-;10820:21;;;;;;;:10;:21;;;;;;:34;;10846:7;10820:25;:34::i;:::-;10796:21;;;;;;;;:10;:21;;;;;:58;;;;-1:-1:-1;10718:143:20:o;858:203:18:-;985:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1008:27;985:68;;;958:96;;978:5;;958:19;:96::i;:::-;858:203;;;;:::o;2940:751::-;3359:23;3385:69;3413:4;3385:69;;;;;;;;;;;;;;;;;3393:5;3385:27;;;;:69;;;;;:::i;:::-;3468:17;;3359:95;;-1:-1:-1;3468:21:18;3464:221;;3608:10;3597:30;;;;;;;;;;;;;;;-1:-1:-1;3597:30:18;3589:85;;;;-1:-1:-1;;;3589:85:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3573:193:0;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3676;4850:18;4861:6;4850:10;:18::i;:::-;4842:60;;;;;-1:-1:-1;;;4842:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4973:12;4987:23;5014:6;:11;;5034:5;5042:4;5014:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7574:145;7764:12;7757:20;;-1:-1:-1;;;7757:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:138:21;84:20;;113:33;84:20;113:33;:::i;157:142::-;238:13;;260:33;238:13;260:33;:::i;304:377::-;;;421:3;414:4;406:6;402:17;398:27;388:2;;446:8;436;429:26;388:2;-1:-1:-1;476:20:21;;519:18;508:30;;505:2;;;558:8;548;541:26;505:2;602:4;594:6;590:17;578:29;;654:3;647:4;638:6;630;626:19;622:30;619:39;616:2;;;671:1;668;661:12;616:2;378:303;;;;;:::o;686:563::-;;794:3;787:4;779:6;775:17;771:27;761:2;;816:5;809;802:20;761:2;849:6;843:13;875:18;871:2;868:26;865:2;;;897:9;865:2;932:113;1039:4;970:66;963:4;959:2;955:13;951:86;947:97;932:113;:::i;:::-;1070:2;1061:7;1054:19;1116:3;1109:4;1104:2;1096:6;1092:15;1088:26;1085:35;1082:2;;;1137:5;1130;1123:20;1082:2;1154:64;1215:2;1208:4;1199:7;1195:18;1188:4;1180:6;1176:17;1154:64;:::i;1254:136::-;1323:20;;1352:32;1323:20;1352:32;:::i;1395:140::-;1475:13;;1497:32;1475:13;1497:32;:::i;1540:136::-;1609:20;;1638:32;1609:20;1638:32;:::i;1681:140::-;1761:13;;1783:32;1761:13;1783:32;:::i;1826:259::-;;1938:2;1926:9;1917:7;1913:23;1909:32;1906:2;;;1959:6;1951;1944:22;1906:2;2003:9;1990:23;2022:33;2049:5;2022:33;:::i;2362:335::-;;;2499:2;2487:9;2478:7;2474:23;2470:32;2467:2;;;2520:6;2512;2505:22;2467:2;2564:9;2551:23;2583:33;2610:5;2583:33;:::i;:::-;2635:5;2687:2;2672:18;;;;2659:32;;-1:-1:-1;;;2457:240:21:o;2702:400::-;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2851:6;2843;2836:22;2798:2;2895:9;2882:23;2914:33;2941:5;2914:33;:::i;:::-;2966:5;-1:-1:-1;3023:2:21;3008:18;;2995:32;3036:34;2995:32;3036:34;:::i;:::-;3089:7;3079:17;;;2788:314;;;;;:::o;3107:537::-;;;;;3269:3;3257:9;3248:7;3244:23;3240:33;3237:2;;;3291:6;3283;3276:22;3237:2;3335:9;3322:23;3354:33;3381:5;3354:33;:::i;:::-;3406:5;-1:-1:-1;3463:2:21;3448:18;;3435:32;3476:34;3435:32;3476:34;:::i;:::-;3227:417;;3529:7;;-1:-1:-1;;;;3583:2:21;3568:18;;3555:32;;3634:2;3619:18;3606:32;;3227:417::o;3649:327::-;;;3778:2;3766:9;3757:7;3753:23;3749:32;3746:2;;;3799:6;3791;3784:22;3981:1424;;;;;;;;;;;;4276:3;4264:9;4255:7;4251:23;4247:33;4244:2;;;4298:6;4290;4283:22;4244:2;4326:31;4347:9;4326:31;:::i;:::-;4316:41;;4376:39;4411:2;4400:9;4396:18;4376:39;:::i;:::-;4366:49;;4434:39;4469:2;4458:9;4454:18;4434:39;:::i;:::-;4424:49;;4492:18;4559:2;4553;4542:9;4538:18;4525:32;4522:40;4519:2;;;4580:6;4572;4565:22;4519:2;4624:86;4702:7;4695:2;4684:9;4680:18;4667:32;4656:9;4652:48;4624:86;:::i;:::-;4729:8;;-1:-1:-1;4756:8:21;-1:-1:-1;4807:3:21;4792:19;;4779:33;4776:41;-1:-1:-1;4773:2:21;;;4835:6;4827;4820:22;4773:2;4879:87;4958:7;4950:3;4939:9;4935:19;4922:33;4911:9;4907:49;4879:87;:::i;:::-;4985:8;;-1:-1:-1;5012:8:21;-1:-1:-1;5039:41:21;5075:3;5060:19;;5039:41;:::i;:::-;5029:51;;5099:41;5135:3;5124:9;5120:19;5099:41;:::i;:::-;5089:51;;5190:2;5183:3;5172:9;5168:19;5155:33;5152:41;5149:2;;;5211:6;5203;5196:22;5149:2;;5256:87;5335:7;5327:3;5316:9;5312:19;5299:33;5288:9;5284:49;5256:87;:::i;:::-;5362:8;5352:18;;5390:9;5379:20;;;;4234:1171;;;;;;;;;;;;;;:::o;5410:1205::-;;5557:2;5545:9;5536:7;5532:23;5528:32;5525:2;;;5578:6;5570;5563:22;5525:2;5616:9;5610:16;5645:18;5686:2;5678:6;5675:14;5672:2;;;5707:6;5699;5692:22;5672:2;5735:22;;;;5791:4;5773:16;;;5769:27;5766:2;;;5814:6;5806;5799:22;5766:2;5845:20;5860:4;5845:20;:::i;:::-;5888:34;5919:2;5888:34;:::i;:::-;5881:5;5874:49;5955:43;5994:2;5990;5986:11;5955:43;:::i;:::-;5950:2;5943:5;5939:14;5932:67;6031:43;6070:2;6066;6062:11;6031:43;:::i;:::-;6026:2;6019:5;6015:14;6008:67;6107:44;6147:2;6143;6139:11;6107:44;:::i;:::-;6102:2;6095:5;6091:14;6084:68;6191:3;6187:2;6183:12;6177:19;6221:2;6211:8;6208:16;6205:2;;;6242:6;6234;6227:22;6205:2;6284:57;6333:7;6322:8;6318:2;6314:17;6284:57;:::i;:::-;6278:3;6271:5;6267:15;6260:82;;6389:3;6385:2;6381:12;6375:19;6369:3;6362:5;6358:15;6351:44;6434:3;6430:2;6426:12;6420:19;6464:2;6454:8;6451:16;6448:2;;;6485:6;6477;6470:22;6448:2;6527:57;6576:7;6565:8;6561:2;6557:17;6527:57;:::i;:::-;6521:3;6510:15;;6503:82;-1:-1:-1;6514:5:21;5515:1100;-1:-1:-1;;;;;5515:1100:21:o;6620:257::-;;6731:2;6719:9;6710:7;6706:23;6702:32;6699:2;;;6752:6;6744;6737:22;6699:2;6796:9;6783:23;6815:32;6841:5;6815:32;:::i;6882:400::-;;;7010:2;6998:9;6989:7;6985:23;6981:32;6978:2;;;7031:6;7023;7016:22;6978:2;7075:9;7062:23;7094:32;7120:5;7094:32;:::i;:::-;7145:5;-1:-1:-1;7202:2:21;7187:18;;7174:32;7215:35;7174:32;7215:35;:::i;7287:1210::-;;;;;;;;7501:3;7489:9;7480:7;7476:23;7472:33;7469:2;;;7523:6;7515;7508:22;7469:2;7567:9;7554:23;7586:32;7612:5;7586:32;:::i;:::-;7637:5;-1:-1:-1;7694:2:21;7679:18;;7666:32;7707:35;7666:32;7707:35;:::i;:::-;7761:7;-1:-1:-1;7819:2:21;7804:18;;7791:32;7842:18;7872:14;;;7869:2;;;7904:6;7896;7889:22;7869:2;7948:60;8000:7;7991:6;7980:9;7976:22;7948:60;:::i;:::-;8027:8;;-1:-1:-1;7922:86:21;-1:-1:-1;8114:2:21;8099:18;;8086:32;;-1:-1:-1;8156:15:21;;8149:23;8137:36;;8127:2;;8192:6;8184;8177:22;8127:2;8220:7;;-1:-1:-1;8280:3:21;8265:19;;8252:33;;8297:16;;;8294:2;;;8331:6;8323;8316:22;8294:2;;8375:62;8429:7;8418:8;8407:9;8403:24;8375:62;:::i;:::-;7459:1038;;;;-1:-1:-1;7459:1038:21;;-1:-1:-1;7459:1038:21;;;;8349:88;;-1:-1:-1;;;7459:1038:21:o;8502:468::-;;;;8647:2;8635:9;8626:7;8622:23;8618:32;8615:2;;;8668:6;8660;8653:22;8615:2;8712:9;8699:23;8731:32;8757:5;8731:32;:::i;:::-;8782:5;-1:-1:-1;8839:2:21;8824:18;;8811:32;8852:35;8811:32;8852:35;:::i;:::-;8605:365;;8906:7;;-1:-1:-1;;;8960:2:21;8945:18;;;;8932:32;;8605:365::o;8975:916::-;;;;;;;;9190:3;9178:9;9169:7;9165:23;9161:33;9158:2;;;9212:6;9204;9197:22;9158:2;9256:9;9243:23;9275:32;9301:5;9275:32;:::i;:::-;9326:5;-1:-1:-1;9383:2:21;9368:18;;9355:32;9396:35;9355:32;9396:35;:::i;:::-;9450:7;-1:-1:-1;9504:2:21;9489:18;;9476:32;;-1:-1:-1;9555:2:21;9540:18;;9527:32;;-1:-1:-1;9606:3:21;9591:19;;9578:33;;-1:-1:-1;9662:3:21;9647:19;;9634:33;9690:18;9679:30;;9676:2;;;9727:6;9719;9712:22;9676:2;9771:60;9823:7;9814:6;9803:9;9799:22;9771:60;:::i;9896:778::-;;;;;;10077:3;10065:9;10056:7;10052:23;10048:33;10045:2;;;10099:6;10091;10084:22;10045:2;10143:9;10130:23;10162:32;10188:5;10162:32;:::i;:::-;10213:5;-1:-1:-1;10270:2:21;10255:18;;10242:32;10283:35;10242:32;10283:35;:::i;:::-;10337:7;-1:-1:-1;10391:2:21;10376:18;;10363:32;;-1:-1:-1;10446:2:21;10431:18;;10418:32;10473:18;10462:30;;10459:2;;;10510:6;10502;10495:22;10459:2;10554:60;10606:7;10597:6;10586:9;10582:22;10554:60;:::i;:::-;10035:639;;;;-1:-1:-1;10035:639:21;;-1:-1:-1;10633:8:21;;10528:86;10035:639;-1:-1:-1;;;10035:639:21:o;10679:325::-;;;10807:2;10795:9;10786:7;10782:23;10778:32;10775:2;;;10828:6;10820;10813:22;10775:2;10872:9;10859:23;10891:32;10917:5;10891:32;:::i;11009:462::-;;;;;11171:3;11159:9;11150:7;11146:23;11142:33;11139:2;;;11193:6;11185;11178:22;11139:2;11237:9;11224:23;11256:32;11282:5;11256:32;:::i;:::-;11307:5;11359:2;11344:18;;11331:32;;-1:-1:-1;11410:2:21;11395:18;;11382:32;;11461:2;11446:18;11433:32;;-1:-1:-1;11129:342:21;-1:-1:-1;;;11129:342:21:o;11476:566::-;;;;11623:2;11611:9;11602:7;11598:23;11594:32;11591:2;;;11644:6;11636;11629:22;11591:2;11688:9;11675:23;11707:32;11733:5;11707:32;:::i;:::-;11758:5;-1:-1:-1;11814:2:21;11799:18;;11786:32;11841:18;11830:30;;11827:2;;;11878:6;11870;11863:22;11827:2;11922:60;11974:7;11965:6;11954:9;11950:22;11922:60;:::i;:::-;11581:461;;12001:8;;-1:-1:-1;11896:86:21;;-1:-1:-1;;;;11581:461:21:o;12047:398::-;;;12174:2;12162:9;12153:7;12149:23;12145:32;12142:2;;;12195:6;12187;12180:22;12142:2;12239:9;12226:23;12258:32;12284:5;12258:32;:::i;12450:707::-;;;;;12613:2;12601:9;12592:7;12588:23;12584:32;12581:2;;;12634:6;12626;12619:22;12581:2;12678:9;12665:23;12697:32;12723:5;12697:32;:::i;:::-;12748:5;-1:-1:-1;12805:2:21;12790:18;;12777:32;12818:34;12777:32;12818:34;:::i;:::-;12871:7;-1:-1:-1;12929:2:21;12914:18;;12901:32;12956:18;12945:30;;12942:2;;;12993:6;12985;12978:22;12942:2;13037:60;13089:7;13080:6;13069:9;13065:22;13037:60;:::i;:::-;12571:586;;;;-1:-1:-1;13116:8:21;-1:-1:-1;;;;12571:586:21:o;13162:1111::-;;;;;;;;13371:3;13359:9;13350:7;13346:23;13342:33;13339:2;;;13393:6;13385;13378:22;13339:2;13437:9;13424:23;13456:32;13482:5;13456:32;:::i;:::-;13507:5;-1:-1:-1;13564:2:21;13549:18;;13536:32;13577:34;13536:32;13577:34;:::i;:::-;13630:7;-1:-1:-1;13689:2:21;13674:18;;13661:32;13702:34;13661:32;13702:34;:::i;:::-;13755:7;-1:-1:-1;13814:2:21;13799:18;;13786:32;13827:35;13786:32;13827:35;:::i;:::-;13881:7;-1:-1:-1;13940:3:21;13925:19;;13912:33;13954:34;13912:33;13954:34;:::i;:::-;14007:7;-1:-1:-1;14066:3:21;14051:19;;14038:33;14080:34;14038:33;14080:34;:::i;:::-;14133:7;-1:-1:-1;14192:3:21;14177:19;;14164:33;14206:35;14164:33;14206:35;:::i;:::-;14260:7;14250:17;;;13329:944;;;;;;;;;;:::o;14608:194::-;;14731:2;14719:9;14710:7;14706:23;14702:32;14699:2;;;14752:6;14744;14737:22;14699:2;-1:-1:-1;14780:16:21;;14689:113;-1:-1:-1;14689:113:21:o;14807:257::-;;14918:2;14906:9;14897:7;14893:23;14889:32;14886:2;;;14939:6;14931;14924:22;14886:2;14983:9;14970:23;15002:32;15028:5;15002:32;:::i;15069:261::-;;15191:2;15179:9;15170:7;15166:23;15162:32;15159:2;;;15212:6;15204;15197:22;15159:2;15249:9;15243:16;15268:32;15294:5;15268:32;:::i;15335:329::-;;15425:6;15420:3;15413:19;15477:6;15470:5;15463:4;15458:3;15454:14;15441:43;15529:3;15522:4;15513:6;15508:3;15504:16;15500:27;15493:40;15653:4;15583:66;15578:2;15570:6;15566:15;15562:88;15557:3;15553:98;15549:109;15542:116;;15403:261;;;;;:::o;15669:318::-;;15750:5;15744:12;15777:6;15772:3;15765:19;15793:63;15849:6;15842:4;15837:3;15833:14;15826:4;15819:5;15815:16;15793:63;:::i;:::-;15901:2;15889:15;15906:66;15885:88;15876:98;;;;15976:4;15872:109;;15720:267;-1:-1:-1;;15720:267:21:o;15992:450::-;;16187:6;16181:13;16203:53;16249:6;16244:3;16237:4;16229:6;16225:17;16203:53;:::i;:::-;16325:2;16321:15;;;;16338:66;16317:88;16278:16;;;;16303:103;;;16433:2;16422:14;;16157:285;-1:-1:-1;;16157:285:21:o;16447:205::-;16647:3;16638:14::o;16657:1012::-;;16990:66;16981:6;16976:3;16972:16;16968:89;16963:3;16956:102;17077:66;17194:2;17185:6;17180:3;17176:16;17172:25;17168:1;17163:3;17159:11;17152:46;17249:66;17240:6;17236:2;17232:15;17228:88;17223:2;17218:3;17214:12;17207:110;17369:2;17360:6;17355:3;17351:16;17347:25;17342:2;17337:3;17333:12;17326:47;;17402:6;17396:13;17418:60;17471:6;17466:2;17461:3;17457:12;17452:2;17444:6;17440:15;17418:60;:::i;:::-;17506:6;17501:3;17497:16;17487:26;;17544:6;17538:13;17560:61;17612:8;17607:2;17603;17599:11;17594:2;17586:6;17582:15;17560:61;:::i;:::-;17641:17;17660:2;17637:26;;16946:723;-1:-1:-1;;;;;;;;16946:723:21:o;17674:226::-;17850:42;17838:55;;;;17820:74;;17808:2;17793:18;;17775:125::o;17905:187::-;18070:14;;18063:22;18045:41;;18033:2;18018:18;;18000:92::o;18097:329::-;18318:14;;18311:22;18293:41;;18365:2;18350:18;;18343:34;;;;18408:2;18393:18;;18386:34;18281:2;18266:18;;18248:178::o;18431:177::-;18577:25;;;18565:2;18550:18;;18532:76::o;18613:319::-;18815:25;;;18871:2;18856:18;;18849:34;;;;18914:2;18899:18;;18892:34;18803:2;18788:18;;18770:162::o;18937:388::-;;19150:6;19139:9;19132:25;19193:2;19188;19177:9;19173:18;19166:30;19213:63;19272:2;19261:9;19257:18;19249:6;19241;19213:63;:::i;:::-;19205:71;;19312:6;19307:2;19296:9;19292:18;19285:34;19122:203;;;;;;;:::o;19330:246::-;;19487:2;19476:9;19469:21;19507:63;19566:2;19555:9;19551:18;19543:6;19535;19507:63;:::i;19581:219::-;;19728:2;19717:9;19710:21;19748:46;19790:2;19779:9;19775:18;19767:6;19748:46;:::i;19805:301::-;;19978:2;19967:9;19960:21;19998:46;20040:2;20029:9;20025:18;20017:6;19998:46;:::i;:::-;19990:54;;20092:6;20084;20080:19;20075:2;20064:9;20060:18;20053:47;19950:156;;;;;:::o;20111:384::-;;20312:2;20301:9;20294:21;20332:46;20374:2;20363:9;20359:18;20351:6;20332:46;:::i;:::-;20426:18;20414:31;;;;20409:2;20394:18;;20387:59;-1:-1:-1;20477:2:21;20462:18;20455:34;20324:54;20284:211;-1:-1:-1;20284:211:21:o;21512:402::-;21714:2;21696:21;;;21753:2;21733:18;;;21726:30;21792:34;21787:2;21772:18;;21765:62;21863:8;21858:2;21843:18;;21836:36;21904:3;21889:19;;21686:228::o;21919:400::-;22121:2;22103:21;;;22160:2;22140:18;;;22133:30;22199:34;22194:2;22179:18;;22172:62;22270:6;22265:2;22250:18;;22243:34;22309:3;22294:19;;22093:226::o;22324:348::-;22526:2;22508:21;;;22565:2;22545:18;;;22538:30;22604:26;22599:2;22584:18;;22577:54;22663:2;22648:18;;22498:174::o;22677:354::-;22879:2;22861:21;;;22918:2;22898:18;;;22891:30;22957:32;22952:2;22937:18;;22930:60;23022:2;23007:18;;22851:180::o;23036:350::-;23238:2;23220:21;;;23277:2;23257:18;;;23250:30;23316:28;23311:2;23296:18;;23289:56;23377:2;23362:18;;23210:176::o;23391:401::-;23593:2;23575:21;;;23632:2;23612:18;;;23605:30;23671:34;23666:2;23651:18;;23644:62;23742:7;23737:2;23722:18;;23715:35;23782:3;23767:19;;23565:227::o;23797:401::-;23999:2;23981:21;;;24038:2;24018:18;;;24011:30;24077:34;24072:2;24057:18;;24050:62;24148:7;24143:2;24128:18;;24121:35;24188:3;24173:19;;23971:227::o;24203:413::-;24405:2;24387:21;;;24444:2;24424:18;;;24417:30;24483:34;24478:2;24463:18;;24456:62;24554:19;24549:2;24534:18;;24527:47;24606:3;24591:19;;24377:239::o;24621:398::-;24823:2;24805:21;;;24862:2;24842:18;;;24835:30;24901:34;24896:2;24881:18;;24874:62;24972:4;24967:2;24952:18;;24945:32;25009:3;24994:19;;24795:224::o;25024:351::-;25226:2;25208:21;;;25265:2;25245:18;;;25238:30;25304:29;25299:2;25284:18;;25277:57;25366:2;25351:18;;25198:177::o;25380:407::-;25582:2;25564:21;;;25621:2;25601:18;;;25594:30;25660:34;25655:2;25640:18;;25633:62;25731:13;25726:2;25711:18;;25704:41;25777:3;25762:19;;25554:233::o;25792:353::-;25994:2;25976:21;;;26033:2;26013:18;;;26006:30;26072:31;26067:2;26052:18;;26045:59;26136:2;26121:18;;25966:179::o;26150:397::-;26352:2;26334:21;;;26391:2;26371:18;;;26364:30;26430:34;26425:2;26410:18;;26403:62;26501:3;26496:2;26481:18;;26474:31;26537:3;26522:19;;26324:223::o;26552:401::-;26754:2;26736:21;;;26793:2;26773:18;;;26766:30;26832:34;26827:2;26812:18;;26805:62;26903:7;26898:2;26883:18;;26876:35;26943:3;26928:19;;26726:227::o;26958:354::-;27160:2;27142:21;;;27199:2;27179:18;;;27172:30;27238:32;27233:2;27218:18;;27211:60;27303:2;27288:18;;27132:180::o;27317:350::-;27519:2;27501:21;;;27558:2;27538:18;;;27531:30;27597:28;27592:2;27577:18;;27570:56;27658:2;27643:18;;27491:176::o;27672:350::-;27874:2;27856:21;;;27913:2;27893:18;;;27886:30;27952:28;27947:2;27932:18;;27925:56;28013:2;27998:18;;27846:176::o;28027:405::-;28229:2;28211:21;;;28268:2;28248:18;;;28241:30;28307:34;28302:2;28287:18;;28280:62;28378:11;28373:2;28358:18;;28351:39;28422:3;28407:19;;28201:231::o;28437:471::-;28639:2;28621:21;;;28678:2;28658:18;;;28651:30;28717:34;28712:2;28697:18;;28690:62;28788:34;28783:2;28768:18;;28761:62;28860:5;28854:3;28839:19;;28832:34;28898:3;28883:19;;28611:297::o;28913:354::-;29115:2;29097:21;;;29154:2;29134:18;;;29127:30;29193:32;29188:2;29173:18;;29166:60;29258:2;29243:18;;29087:180::o;29272:412::-;29474:2;29456:21;;;29513:2;29493:18;;;29486:30;29552:34;29547:2;29532:18;;29525:62;29623:18;29618:2;29603:18;;29596:46;29674:3;29659:19;;29446:238::o;29689:398::-;29891:2;29873:21;;;29930:2;29910:18;;;29903:30;29969:34;29964:2;29949:18;;29942:62;30040:4;30035:2;30020:18;;30013:32;30077:3;30062:19;;29863:224::o;30092:406::-;30294:2;30276:21;;;30333:2;30313:18;;;30306:30;30372:34;30367:2;30352:18;;30345:62;30443:12;30438:2;30423:18;;30416:40;30488:3;30473:19;;30266:232::o;30503:397::-;30705:2;30687:21;;;30744:2;30724:18;;;30717:30;30783:34;30778:2;30763:18;;30756:62;30854:3;30849:2;30834:18;;30827:31;30890:3;30875:19;;30677:223::o;30905:398::-;31107:2;31089:21;;;31146:2;31126:18;;;31119:30;31185:34;31180:2;31165:18;;31158:62;31256:4;31251:2;31236:18;;31229:32;31293:3;31278:19;;31079:224::o;31308:348::-;31510:2;31492:21;;;31549:2;31529:18;;;31522:30;31588:26;31583:2;31568:18;;31561:54;31647:2;31632:18;;31482:174::o;31661:410::-;31863:2;31845:21;;;31902:2;31882:18;;;31875:30;31941:34;31936:2;31921:18;;31914:62;32012:16;32007:2;31992:18;;31985:44;32061:3;32046:19;;31835:236::o;32076:404::-;32278:2;32260:21;;;32317:2;32297:18;;;32290:30;32356:34;32351:2;32336:18;;32329:62;32427:10;32422:2;32407:18;;32400:38;32470:3;32455:19;;32250:230::o;32485:412::-;32687:2;32669:21;;;32726:2;32706:18;;;32699:30;32765:34;32760:2;32745:18;;32738:62;32836:18;32831:2;32816:18;;32809:46;32887:3;32872:19;;32659:238::o;32902:409::-;33104:2;33086:21;;;33143:2;33123:18;;;33116:30;33182:34;33177:2;33162:18;;33155:62;33253:15;33248:2;33233:18;;33226:43;33301:3;33286:19;;33076:235::o;33316:405::-;33518:2;33500:21;;;33557:2;33537:18;;;33530:30;33596:34;33591:2;33576:18;;33569:62;33667:11;33662:2;33647:18;;33640:39;33711:3;33696:19;;33490:231::o;33726:847::-;;33944:3;33933:9;33929:19;33921:27;;33967:6;34019:2;34010:6;34004:13;34000:22;33989:9;33982:41;34070:4;34062:6;34058:17;34052:24;34095:18;34169:2;34155:12;34151:21;34144:4;34133:9;34129:20;34122:51;34222:4;34214:6;34210:17;34204:24;34182:46;;34247:42;34347:2;34331:14;34327:23;34320:4;34309:9;34305:20;34298:53;34419:2;34411:4;34403:6;34399:17;34393:24;34389:33;34382:4;34371:9;34367:20;34360:63;34491:2;34483:4;34475:6;34471:17;34465:24;34461:33;34454:4;34443:9;34439:20;34432:63;34563:2;34555:4;34547:6;34543:17;34537:24;34533:33;34526:4;34515:9;34511:20;34504:63;;;;;33911:662;;;;:::o;34578:188::-;34752:6;34740:19;;;;34722:38;;34710:2;34695:18;;34677:89::o;34771:421::-;;34984:6;34976;34972:19;34961:9;34954:38;35040:42;35032:6;35028:55;35023:2;35012:9;35008:18;35001:83;35120:2;35115;35104:9;35100:18;35093:30;35140:46;35182:2;35171:9;35167:18;35159:6;35140:46;:::i;:::-;35132:54;34944:248;-1:-1:-1;;;;;34944:248:21:o;35197:328::-;;35392:6;35384;35380:19;35369:9;35362:38;35436:2;35431;35420:9;35416:18;35409:30;35456:63;35515:2;35504:9;35500:18;35492:6;35484;35456:63;:::i;35530:752::-;;35843:6;35835;35831:19;35820:9;35813:38;35887:3;35882:2;35871:9;35867:18;35860:31;35914:47;35956:3;35945:9;35941:19;35933:6;35914:47;:::i;:::-;36009:42;36001:6;35997:55;35992:2;35981:9;35977:18;35970:83;36101:18;36093:6;36089:31;36084:2;36073:9;36069:18;36062:59;36158:6;36152:3;36141:9;36137:19;36130:35;36214:9;36206:6;36202:22;36196:3;36185:9;36181:19;36174:51;36242:34;36269:6;36261;36242:34;:::i;:::-;36234:42;35803:479;-1:-1:-1;;;;;;;;;35803:479:21:o;36287:594::-;;36534:6;36579:2;36571:6;36567:15;36556:9;36549:34;36631:2;36623:6;36619:15;36614:2;36603:9;36599:18;36592:43;;36683:42;36675:6;36671:55;36666:2;36655:9;36651:18;36644:83;36763:6;36758:2;36747:9;36743:18;36736:34;36807:3;36801;36790:9;36786:19;36779:32;36828:47;36870:3;36859:9;36855:19;36847:6;36828:47;:::i;36886:502::-;37121:6;37154:15;;;37136:34;;37206:15;;;;37201:2;37186:18;;37179:43;37270:18;37258:31;37253:2;37238:18;;37231:59;37338:42;37326:55;;;37321:2;37306:18;;37299:83;37098:3;37083:19;;37065:323::o;37393:704::-;37682:6;37715:15;;;37697:34;;37750:18;37804:15;;;37799:2;37784:18;;37777:43;37839:42;37917:15;;;37912:2;37897:18;;37890:43;37969:15;;;;37964:2;37949:18;;37942:43;38022:15;;;38016:3;38001:19;;37994:44;38075:15;;;;38069:3;38054:19;;38047:44;37659:3;37644:19;;37626:471::o;38284:248::-;38458:25;;;38514:2;38499:18;;38492:34;38446:2;38431:18;;38413:119::o;38537:200::-;38711:18;38699:31;;;;38681:50;;38669:2;38654:18;;38636:101::o;38742:242::-;38812:2;38806:9;38842:17;;;38889:18;38874:34;;38910:22;;;38871:62;38868:2;;;38936:9;38868:2;38963;38956:22;38786:198;;-1:-1:-1;38786:198:21:o;38989:363::-;;;39147:8;39135:10;39132:24;39129:2;;;39177:9;39166;39159:28;39129:2;39214:6;39204:8;39201:20;39198:2;;;39242:9;39231;39224:28;39198:2;-1:-1:-1;;39276:23:21;;;39321:25;;;;;-1:-1:-1;39119:233:21:o;39357:258::-;39429:1;39439:113;39453:6;39450:1;39447:13;39439:113;;;39529:11;;;39523:18;39510:11;;;39503:39;39475:2;39468:10;39439:113;;;39570:6;39567:1;39564:13;39561:2;;;-1:-1:-1;;39605:1:21;39587:16;;39580:27;39410:205::o;39620:156::-;39708:42;39701:5;39697:54;39690:5;39687:65;39677:2;;39766:1;39763;39756:12;39677:2;39667:109;:::o;39781:119::-;39868:6;39861:5;39857:18;39850:5;39847:29;39837:2;;39890:1;39887;39880:12;39905:131;39992:18;39985:5;39981:30;39974:5;39971:41;39961:2;;40026:1;40023;40016:12
Swarm Source
ipfs://fec2950ded16215c7cfa48e61f5136dfa2770dd4f696d7deb0a7a636056c3509
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 39.03% | $41.96 | 5,701.7175 | $239,267.99 | |
ARB | 30.58% | $3,313.77 | 56.5768 | $187,482.47 | |
BSC | 21.78% | $629.08 | 212.2 | $133,489.81 | |
ETH | Ether (ETH) | 4.83% | $3,313.17 | 8.9424 | $29,627.71 |
OP | 2.58% | $3,315.15 | 4.7626 | $15,788.57 | |
POL | 1.18% | $0.484637 | 14,897.8966 | $7,220.07 | |
POL | <0.01% | $0.000599 | 200 | $0.1198 | |
FTM | 0.02% | $0.726992 | 201.6531 | $146.6 | |
GLMR | <0.01% | $0.242306 | 35.6402 | $8.64 | |
ZKSYNC | <0.01% | $3,313.17 | 0.00002 | $0.066263 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.