Source Code
Latest 25 from a total of 303 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Update Signers | 38432388 | 31 hrs ago | IN | 0 ETH | 0.00000023 | ||||
| Relay | 38183077 | 4 days ago | IN | 0 ETH | 0.0000002 | ||||
| Update Signers | 37972128 | 6 days ago | IN | 0 ETH | 0.00000014 | ||||
| Update Signers | 37623893 | 10 days ago | IN | 0 ETH | 0.00000014 | ||||
| Update Signers | 37354423 | 13 days ago | IN | 0 ETH | 0.00000014 | ||||
| Relay | 37230671 | 15 days ago | IN | 0 ETH | 0.00000018 | ||||
| Add Native Liqui... | 37126438 | 16 days ago | IN | 0.0000112 ETH | 0 | ||||
| Withdraw | 37085425 | 16 days ago | IN | 0 ETH | 0.00000002 | ||||
| Send | 37058034 | 17 days ago | IN | 0 ETH | 0.00000015 | ||||
| Send | 37054890 | 17 days ago | IN | 0 ETH | 0.00000015 | ||||
| Send | 37054262 | 17 days ago | IN | 0 ETH | 0.0000001 | ||||
| Send | 37053835 | 17 days ago | IN | 0 ETH | 0.00000015 | ||||
| Send | 37053814 | 17 days ago | IN | 0 ETH | 0.00000016 | ||||
| Update Signers | 36986701 | 18 days ago | IN | 0 ETH | 0.00000015 | ||||
| Withdraw | 36951269 | 18 days ago | IN | 0 ETH | 0 | ||||
| Update Signers | 36716216 | 21 days ago | IN | 0 ETH | 0.00000015 | ||||
| Update Signers | 36608004 | 22 days ago | IN | 0 ETH | 0.00000014 | ||||
| Update Signers | 36325086 | 25 days ago | IN | 0 ETH | 0.00000014 | ||||
| Unpause | 36091814 | 28 days ago | IN | 0 ETH | 0.00000002 | ||||
| Pause | 36091335 | 28 days ago | IN | 0 ETH | 0.00000004 | ||||
| Update Signers | 36050193 | 28 days ago | IN | 0 ETH | 0.00000014 | ||||
| Unpause | 35982209 | 29 days ago | IN | 0 ETH | 0.00000002 | ||||
| Pause | 35981522 | 29 days ago | IN | 0 ETH | 0.00000004 | ||||
| Withdraw | 35821669 | 31 days ago | IN | 0 ETH | 0.00000002 | ||||
| Withdraw | 35736838 | 32 days ago | IN | 0 ETH | 0.00000001 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 38183077 | 4 days ago | 2.99969643 ETH | ||||
| 38183077 | 4 days ago | 2.99969643 ETH | ||||
| 37230671 | 15 days ago | 2.99969659 ETH | ||||
| 37230671 | 15 days ago | 2.99969659 ETH | ||||
| 37126438 | 16 days ago | 0.0000112 ETH | ||||
| 37085425 | 16 days ago | 41.59961951 ETH | ||||
| 37085425 | 16 days ago | 41.59961951 ETH | ||||
| 36951269 | 18 days ago | 0.54548052 ETH | ||||
| 36951269 | 18 days ago | 0.54548052 ETH | ||||
| 35821669 | 31 days ago | 2.88560707 ETH | ||||
| 35821669 | 31 days ago | 2.88560707 ETH | ||||
| 35736838 | 32 days ago | 0.32626308 ETH | ||||
| 35736838 | 32 days ago | 0.32626308 ETH | ||||
| 35378115 | 36 days ago | 0.000012 ETH | ||||
| 35367843 | 36 days ago | 0.5 ETH | ||||
| 35343711 | 37 days ago | 4.99949614 ETH | ||||
| 35343711 | 37 days ago | 4.99949614 ETH | ||||
| 35343110 | 37 days ago | 14.99849616 ETH | ||||
| 35343110 | 37 days ago | 14.99849616 ETH | ||||
| 35248697 | 38 days ago | 4.07973398 ETH | ||||
| 35248697 | 38 days ago | 4.07973398 ETH | ||||
| 35189315 | 38 days ago | 2.000718 ETH | ||||
| 35168145 | 39 days ago | 1.98857643 ETH | ||||
| 35168145 | 39 days ago | 1.98857643 ETH | ||||
| 35153137 | 39 days ago | 3.00894963 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Bridge
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../libraries/PbBridge.sol";
import "./Pool.sol";
/**
* @title The liquidity-pool based bridge.
*/
contract Bridge is Pool {
using SafeERC20 for IERC20;
// liquidity events
event Send(
bytes32 transferId,
address sender,
address receiver,
address token,
uint256 amount,
uint64 dstChainId,
uint64 nonce,
uint32 maxSlippage
);
event Relay(
bytes32 transferId,
address sender,
address receiver,
address token,
uint256 amount,
uint64 srcChainId,
bytes32 srcTransferId
);
// gov events
event MinSendUpdated(address token, uint256 amount);
event MaxSendUpdated(address token, uint256 amount);
mapping(bytes32 => bool) public transfers;
mapping(address => uint256) public minSend; // send _amount must > minSend
mapping(address => uint256) public maxSend;
// min allowed max slippage uint32 value is slippage * 1M, eg. 0.5% -> 5000
uint32 public minimalMaxSlippage;
/**
* @notice Send a cross-chain transfer via the liquidity pool-based bridge.
* NOTE: This function DOES NOT SUPPORT fee-on-transfer / rebasing tokens.
* @param _receiver The address of the receiver.
* @param _token The address of the token.
* @param _amount The amount of the transfer.
* @param _dstChainId The destination chain ID.
* @param _nonce A number input to guarantee uniqueness of transferId. Can be timestamp in practice.
* @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
* Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least (100% - max slippage percentage) * amount or the
* transfer can be refunded.
*/
function send(
address _receiver,
address _token,
uint256 _amount,
uint64 _dstChainId,
uint64 _nonce,
uint32 _maxSlippage // slippage * 1M, eg. 0.5% -> 5000
) external nonReentrant whenNotPaused {
bytes32 transferId = _send(_receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit Send(transferId, msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, _maxSlippage);
}
/**
* @notice Send a cross-chain transfer via the liquidity pool-based bridge using the native token.
* @param _receiver The address of the receiver.
* @param _amount The amount of the transfer.
* @param _dstChainId The destination chain ID.
* @param _nonce A unique number. Can be timestamp in practice.
* @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
* Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least (100% - max slippage percentage) * amount or the
* transfer can be refunded.
*/
function sendNative(
address _receiver,
uint256 _amount,
uint64 _dstChainId,
uint64 _nonce,
uint32 _maxSlippage
) external payable nonReentrant whenNotPaused {
require(msg.value == _amount, "Amount mismatch");
require(nativeWrap != address(0), "Native wrap not set");
bytes32 transferId = _send(_receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
IWETH(nativeWrap).deposit{value: _amount}();
emit Send(transferId, msg.sender, _receiver, nativeWrap, _amount, _dstChainId, _nonce, _maxSlippage);
}
function _send(
address _receiver,
address _token,
uint256 _amount,
uint64 _dstChainId,
uint64 _nonce,
uint32 _maxSlippage
) private returns (bytes32) {
require(_amount > minSend[_token], "amount too small");
require(maxSend[_token] == 0 || _amount <= maxSend[_token], "amount too large");
require(_maxSlippage > minimalMaxSlippage, "max slippage too small");
bytes32 transferId = keccak256(
// uint64(block.chainid) for consistency as entire system uses uint64 for chain id
// len = 20 + 20 + 20 + 32 + 8 + 8 + 8 = 116
abi.encodePacked(msg.sender, _receiver, _token, _amount, _dstChainId, _nonce, uint64(block.chainid))
);
require(transfers[transferId] == false, "transfer exists");
transfers[transferId] = true;
return transferId;
}
/**
* @notice Relay a cross-chain transfer sent from a liquidity pool-based bridge on another chain.
* @param _relayRequest The serialized Relay protobuf.
* @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by
* +2/3 of the bridge's current signing power to be delivered.
* @param _signers The sorted list of signers.
* @param _powers The signing powers of the signers.
*/
function relay(
bytes calldata _relayRequest,
bytes[] calldata _sigs,
address[] calldata _signers,
uint256[] calldata _powers
) external whenNotPaused {
bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "Relay"));
verifySigs(abi.encodePacked(domain, _relayRequest), _sigs, _signers, _powers);
PbBridge.Relay memory request = PbBridge.decRelay(_relayRequest);
// len = 20 + 20 + 20 + 32 + 8 + 8 + 32 = 140
bytes32 transferId = keccak256(
abi.encodePacked(
request.sender,
request.receiver,
request.token,
request.amount,
request.srcChainId,
request.dstChainId,
request.srcTransferId
)
);
require(transfers[transferId] == false, "transfer exists");
transfers[transferId] = true;
_updateVolume(request.token, request.amount);
uint256 delayThreshold = delayThresholds[request.token];
if (delayThreshold > 0 && request.amount > delayThreshold) {
_addDelayedTransfer(transferId, request.receiver, request.token, request.amount);
} else {
_sendToken(request.receiver, request.token, request.amount);
}
emit Relay(
transferId,
request.sender,
request.receiver,
request.token,
request.amount,
request.srcChainId,
request.srcTransferId
);
}
function setMinSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
require(_tokens.length == _amounts.length, "length mismatch");
for (uint256 i = 0; i < _tokens.length; i++) {
minSend[_tokens[i]] = _amounts[i];
emit MinSendUpdated(_tokens[i], _amounts[i]);
}
}
function setMaxSend(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
require(_tokens.length == _amounts.length, "length mismatch");
for (uint256 i = 0; i < _tokens.length; i++) {
maxSend[_tokens[i]] = _amounts[i];
emit MaxSendUpdated(_tokens[i], _amounts[i]);
}
}
function setMinimalMaxSlippage(uint32 _minimalMaxSlippage) external onlyGovernor {
minimalMaxSlippage = _minimalMaxSlippage;
}
// This is needed to receive ETH when calling `IWETH.withdraw`
receive() external payable {}
}// SPDX-License-Identifier: GPL-3.0-only
// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: bridge.proto
pragma solidity 0.8.17;
import "./Pb.sol";
library PbBridge {
using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj
struct Relay {
address sender; // tag: 1
address receiver; // tag: 2
address token; // tag: 3
uint256 amount; // tag: 4
uint64 srcChainId; // tag: 5
uint64 dstChainId; // tag: 6
bytes32 srcTransferId; // tag: 7
} // end struct Relay
function decRelay(bytes memory raw) internal pure returns (Relay memory m) {
Pb.Buffer memory buf = Pb.fromBytes(raw);
uint256 tag;
Pb.WireType wire;
while (buf.hasMore()) {
(tag, wire) = buf.decKey();
if (false) {}
// solidity has no switch/case
else if (tag == 1) {
m.sender = Pb._address(buf.decBytes());
} else if (tag == 2) {
m.receiver = Pb._address(buf.decBytes());
} else if (tag == 3) {
m.token = Pb._address(buf.decBytes());
} else if (tag == 4) {
m.amount = Pb._uint256(buf.decBytes());
} else if (tag == 5) {
m.srcChainId = uint64(buf.decVarint());
} else if (tag == 6) {
m.dstChainId = uint64(buf.decVarint());
} else if (tag == 7) {
m.srcTransferId = Pb._bytes32(buf.decBytes());
} else {
buf.skipValue(wire);
} // skip value of unknown tag
}
} // end decoder Relay
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
// runtime proto sol library
library Pb {
enum WireType {
Varint,
Fixed64,
LengthDelim,
StartGroup,
EndGroup,
Fixed32
}
struct Buffer {
uint256 idx; // the start index of next read. when idx=b.length, we're done
bytes b; // hold serialized proto msg, readonly
}
// create a new in-memory Buffer object from raw msg bytes
function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) {
buf.b = raw;
buf.idx = 0;
}
// whether there are unread bytes
function hasMore(Buffer memory buf) internal pure returns (bool) {
return buf.idx < buf.b.length;
}
// decode current field number and wiretype
function decKey(Buffer memory buf) internal pure returns (uint256 tag, WireType wiretype) {
uint256 v = decVarint(buf);
tag = v / 8;
wiretype = WireType(v & 7);
}
// count tag occurrences, return an array due to no memory map support
// have to create array for (maxtag+1) size. cnts[tag] = occurrences
// should keep buf.idx unchanged because this is only a count function
function cntTags(Buffer memory buf, uint256 maxtag) internal pure returns (uint256[] memory cnts) {
uint256 originalIdx = buf.idx;
cnts = new uint256[](maxtag + 1); // protobuf's tags are from 1 rather than 0
uint256 tag;
WireType wire;
while (hasMore(buf)) {
(tag, wire) = decKey(buf);
cnts[tag] += 1;
skipValue(buf, wire);
}
buf.idx = originalIdx;
}
// read varint from current buf idx, move buf.idx to next read, return the int value
function decVarint(Buffer memory buf) internal pure returns (uint256 v) {
bytes10 tmp; // proto int is at most 10 bytes (7 bits can be used per byte)
bytes memory bb = buf.b; // get buf.b mem addr to use in assembly
v = buf.idx; // use v to save one additional uint variable
assembly {
tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp
}
uint256 b; // store current byte content
v = 0; // reset to 0 for return value
for (uint256 i = 0; i < 10; i++) {
assembly {
b := byte(i, tmp) // don't use tmp[i] because it does bound check and costs extra
}
v |= (b & 0x7F) << (i * 7);
if (b & 0x80 == 0) {
buf.idx += i + 1;
return v;
}
}
revert(); // i=10, invalid varint stream
}
// read length delimited field and return bytes
function decBytes(Buffer memory buf) internal pure returns (bytes memory b) {
uint256 len = decVarint(buf);
uint256 end = buf.idx + len;
require(end <= buf.b.length); // avoid overflow
b = new bytes(len);
bytes memory bufB = buf.b; // get buf.b mem addr to use in assembly
uint256 bStart;
uint256 bufBStart = buf.idx;
assembly {
bStart := add(b, 32)
bufBStart := add(add(bufB, 32), bufBStart)
}
for (uint256 i = 0; i < len; i += 32) {
assembly {
mstore(add(bStart, i), mload(add(bufBStart, i)))
}
}
buf.idx = end;
}
// return packed ints
function decPacked(Buffer memory buf) internal pure returns (uint256[] memory t) {
uint256 len = decVarint(buf);
uint256 end = buf.idx + len;
require(end <= buf.b.length); // avoid overflow
// array in memory must be init w/ known length
// so we have to create a tmp array w/ max possible len first
uint256[] memory tmp = new uint256[](len);
uint256 i = 0; // count how many ints are there
while (buf.idx < end) {
tmp[i] = decVarint(buf);
i++;
}
t = new uint256[](i); // init t with correct length
for (uint256 j = 0; j < i; j++) {
t[j] = tmp[j];
}
return t;
}
// move idx pass current value field, to beginning of next tag or msg end
function skipValue(Buffer memory buf, WireType wire) internal pure {
if (wire == WireType.Varint) {
decVarint(buf);
} else if (wire == WireType.LengthDelim) {
uint256 len = decVarint(buf);
buf.idx += len; // skip len bytes value data
require(buf.idx <= buf.b.length); // avoid overflow
} else {
revert();
} // unsupported wiretype
}
// type conversion help utils
function _bool(uint256 x) internal pure returns (bool v) {
return x != 0;
}
function _uint256(bytes memory b) internal pure returns (uint256 v) {
require(b.length <= 32); // b's length must be smaller than or equal to 32
assembly {
v := mload(add(b, 32))
} // load all 32bytes to v
v = v >> (8 * (32 - b.length)); // only first b.length is valid
}
function _address(bytes memory b) internal pure returns (address v) {
v = _addressPayable(b);
}
function _addressPayable(bytes memory b) internal pure returns (address payable v) {
require(b.length == 20);
//load 32bytes then shift right 12 bytes
assembly {
v := div(mload(add(b, 32)), 0x1000000000000000000000000)
}
}
function _bytes32(bytes memory b) internal pure returns (bytes32 v) {
require(b.length == 32);
assembly {
v := mload(add(b, 32))
}
}
// uint[] to uint8[]
function uint8s(uint256[] memory arr) internal pure returns (uint8[] memory t) {
t = new uint8[](arr.length);
for (uint256 i = 0; i < t.length; i++) {
t[i] = uint8(arr[i]);
}
}
function uint32s(uint256[] memory arr) internal pure returns (uint32[] memory t) {
t = new uint32[](arr.length);
for (uint256 i = 0; i < t.length; i++) {
t[i] = uint32(arr[i]);
}
}
function uint64s(uint256[] memory arr) internal pure returns (uint64[] memory t) {
t = new uint64[](arr.length);
for (uint256 i = 0; i < t.length; i++) {
t[i] = uint64(arr[i]);
}
}
function bools(uint256[] memory arr) internal pure returns (bool[] memory t) {
t = new bool[](arr.length);
for (uint256 i = 0; i < t.length; i++) {
t[i] = arr[i] != 0;
}
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "../interfaces/IWETH.sol";
import "../libraries/PbPool.sol";
import "../safeguard/Pauser.sol";
import "../safeguard/VolumeControl.sol";
import "../safeguard/DelayedTransfer.sol";
import "./Signers.sol";
/**
* @title Liquidity pool functions for {Bridge}.
*/
contract Pool is Signers, ReentrancyGuard, Pauser, VolumeControl, DelayedTransfer {
using SafeERC20 for IERC20;
uint64 public addseq; // ensure unique LiquidityAdded event, start from 1
mapping(address => uint256) public minAdd; // add _amount must > minAdd
// map of successful withdraws, if true means already withdrew money or added to delayedTransfers
mapping(bytes32 => bool) public withdraws;
// erc20 wrap of gas token of this chain, eg. WETH, when relay ie. pay out,
// if request.token equals this, will withdraw and send native token to receiver
// note we don't check whether it's zero address. when this isn't set, and request.token
// is all 0 address, guarantee fail
address public nativeWrap;
// when transfer native token after wrap, use this gas used config.
uint256 public nativeTokenTransferGas = 50000;
// liquidity events
event LiquidityAdded(
uint64 seqnum,
address provider,
address token,
uint256 amount // how many tokens were added
);
event WithdrawDone(
bytes32 withdrawId,
uint64 seqnum,
address receiver,
address token,
uint256 amount,
bytes32 refid
);
event MinAddUpdated(address token, uint256 amount);
/**
* @notice Add liquidity to the pool-based bridge.
* NOTE: This function DOES NOT SUPPORT fee-on-transfer / rebasing tokens.
* @param _token The address of the token.
* @param _amount The amount to add.
*/
function addLiquidity(address _token, uint256 _amount) external nonReentrant whenNotPaused {
require(_amount > minAdd[_token], "amount too small");
addseq += 1;
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
emit LiquidityAdded(addseq, msg.sender, _token, _amount);
}
/**
* @notice Add native token liquidity to the pool-based bridge.
* @param _amount The amount to add.
*/
function addNativeLiquidity(uint256 _amount) external payable nonReentrant whenNotPaused {
require(msg.value == _amount, "Amount mismatch");
require(nativeWrap != address(0), "Native wrap not set");
require(_amount > minAdd[nativeWrap], "amount too small");
addseq += 1;
IWETH(nativeWrap).deposit{value: _amount}();
emit LiquidityAdded(addseq, msg.sender, nativeWrap, _amount);
}
/**
* @notice Withdraw funds from the bridge pool.
* @param _wdmsg The serialized Withdraw protobuf.
* @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be
* signed-off by +2/3 of the bridge's current signing power to be delivered.
* @param _signers The sorted list of signers.
* @param _powers The signing powers of the signers.
*/
function withdraw(
bytes calldata _wdmsg,
bytes[] calldata _sigs,
address[] calldata _signers,
uint256[] calldata _powers
) external whenNotPaused {
bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "WithdrawMsg"));
verifySigs(abi.encodePacked(domain, _wdmsg), _sigs, _signers, _powers);
// decode and check wdmsg
PbPool.WithdrawMsg memory wdmsg = PbPool.decWithdrawMsg(_wdmsg);
// len = 8 + 8 + 20 + 20 + 32 = 88
bytes32 wdId = keccak256(
abi.encodePacked(wdmsg.chainid, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount)
);
require(withdraws[wdId] == false, "withdraw already succeeded");
withdraws[wdId] = true;
_updateVolume(wdmsg.token, wdmsg.amount);
uint256 delayThreshold = delayThresholds[wdmsg.token];
if (delayThreshold > 0 && wdmsg.amount > delayThreshold) {
_addDelayedTransfer(wdId, wdmsg.receiver, wdmsg.token, wdmsg.amount);
} else {
_sendToken(wdmsg.receiver, wdmsg.token, wdmsg.amount);
}
emit WithdrawDone(wdId, wdmsg.seqnum, wdmsg.receiver, wdmsg.token, wdmsg.amount, wdmsg.refid);
}
function executeDelayedTransfer(bytes32 id) external whenNotPaused {
delayedTransfer memory transfer = _executeDelayedTransfer(id);
_sendToken(transfer.receiver, transfer.token, transfer.amount);
}
function setMinAdd(address[] calldata _tokens, uint256[] calldata _amounts) external onlyGovernor {
require(_tokens.length == _amounts.length, "length mismatch");
for (uint256 i = 0; i < _tokens.length; i++) {
minAdd[_tokens[i]] = _amounts[i];
emit MinAddUpdated(_tokens[i], _amounts[i]);
}
}
function _sendToken(
address _receiver,
address _token,
uint256 _amount
) internal {
if (_token == nativeWrap) {
// withdraw then transfer native to receiver
IWETH(nativeWrap).withdraw(_amount);
(bool sent, ) = _receiver.call{value: _amount, gas: nativeTokenTransferGas}("");
require(sent, "failed to send native token");
} else {
IERC20(_token).safeTransfer(_receiver, _amount);
}
}
// set nativeWrap, for relay requests, if token == nativeWrap, will withdraw first then transfer native to receiver
function setWrap(address _weth) external onlyOwner {
nativeWrap = _weth;
}
// setNativeTransferGasUsed, native transfer will use this config.
function setNativeTokenTransferGas(uint256 _gasUsed) external onlyGovernor {
nativeTokenTransferGas = _gasUsed;
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
}// SPDX-License-Identifier: GPL-3.0-only
// Code generated by protoc-gen-sol. DO NOT EDIT.
// source: contracts/libraries/proto/pool.proto
pragma solidity 0.8.17;
import "./Pb.sol";
library PbPool {
using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj
struct WithdrawMsg {
uint64 chainid; // tag: 1
uint64 seqnum; // tag: 2
address receiver; // tag: 3
address token; // tag: 4
uint256 amount; // tag: 5
bytes32 refid; // tag: 6
} // end struct WithdrawMsg
function decWithdrawMsg(bytes memory raw) internal pure returns (WithdrawMsg memory m) {
Pb.Buffer memory buf = Pb.fromBytes(raw);
uint256 tag;
Pb.WireType wire;
while (buf.hasMore()) {
(tag, wire) = buf.decKey();
if (false) {}
// solidity has no switch/case
else if (tag == 1) {
m.chainid = uint64(buf.decVarint());
} else if (tag == 2) {
m.seqnum = uint64(buf.decVarint());
} else if (tag == 3) {
m.receiver = Pb._address(buf.decBytes());
} else if (tag == 4) {
m.token = Pb._address(buf.decBytes());
} else if (tag == 5) {
m.amount = Pb._uint256(buf.decBytes());
} else if (tag == 6) {
m.refid = Pb._bytes32(buf.decBytes());
} else {
buf.skipValue(wire);
} // skip value of unknown tag
}
} // end decoder WithdrawMsg
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "@openzeppelin/contracts/security/Pausable.sol";
import "./Ownable.sol";
abstract contract Pauser is Ownable, Pausable {
mapping(address => bool) public pausers;
event PauserAdded(address account);
event PauserRemoved(address account);
constructor() {
_addPauser(msg.sender);
}
modifier onlyPauser() {
require(isPauser(msg.sender), "Caller is not pauser");
_;
}
function pause() public onlyPauser {
_pause();
}
function unpause() public onlyPauser {
_unpause();
}
function isPauser(address account) public view returns (bool) {
return pausers[account];
}
function addPauser(address account) public onlyOwner {
_addPauser(account);
}
function removePauser(address account) public onlyOwner {
_removePauser(account);
}
function renouncePauser() public {
_removePauser(msg.sender);
}
function _addPauser(address account) private {
require(!isPauser(account), "Account is already pauser");
pausers[account] = true;
emit PauserAdded(account);
}
function _removePauser(address account) private {
require(isPauser(account), "Account is not pauser");
pausers[account] = false;
emit PauserRemoved(account);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*
* This adds a normal func that setOwner if _owner is address(0). So we can't allow
* renounceOwnership. So we can support Proxy based upgradable contract
*/
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(msg.sender);
}
/**
* @dev Only to be called by inherit contracts, in their init func called by Proxy
* we require _owner == address(0), which is only possible when it's a delegateCall
* because constructor sets _owner in contract state.
*/
function initOwner() internal {
require(_owner == address(0), "owner already set");
_setOwner(msg.sender);
}
/**
* @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() == msg.sender, "Ownable: caller is not the owner");
_;
}
/**
* @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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./Governor.sol";
abstract contract VolumeControl is Governor {
uint256 public epochLength; // seconds
mapping(address => uint256) public epochVolumes; // key is token
mapping(address => uint256) public epochVolumeCaps; // key is token
mapping(address => uint256) public lastOpTimestamps; // key is token
event EpochLengthUpdated(uint256 length);
event EpochVolumeUpdated(address token, uint256 cap);
function setEpochLength(uint256 _length) external onlyGovernor {
epochLength = _length;
emit EpochLengthUpdated(_length);
}
function setEpochVolumeCaps(address[] calldata _tokens, uint256[] calldata _caps) external onlyGovernor {
require(_tokens.length == _caps.length, "length mismatch");
for (uint256 i = 0; i < _tokens.length; i++) {
epochVolumeCaps[_tokens[i]] = _caps[i];
emit EpochVolumeUpdated(_tokens[i], _caps[i]);
}
}
function _updateVolume(address _token, uint256 _amount) internal {
if (epochLength == 0) {
return;
}
uint256 cap = epochVolumeCaps[_token];
if (cap == 0) {
return;
}
uint256 volume = epochVolumes[_token];
uint256 timestamp = block.timestamp;
uint256 epochStartTime = (timestamp / epochLength) * epochLength;
if (lastOpTimestamps[_token] < epochStartTime) {
volume = _amount;
} else {
volume += _amount;
}
require(volume <= cap, "volume exceeds cap");
epochVolumes[_token] = volume;
lastOpTimestamps[_token] = timestamp;
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./Ownable.sol";
abstract contract Governor is Ownable {
mapping(address => bool) public governors;
event GovernorAdded(address account);
event GovernorRemoved(address account);
modifier onlyGovernor() {
require(isGovernor(msg.sender), "Caller is not governor");
_;
}
constructor() {
_addGovernor(msg.sender);
}
function isGovernor(address _account) public view returns (bool) {
return governors[_account];
}
function addGovernor(address _account) public onlyOwner {
_addGovernor(_account);
}
function removeGovernor(address _account) public onlyOwner {
_removeGovernor(_account);
}
function renounceGovernor() public {
_removeGovernor(msg.sender);
}
function _addGovernor(address _account) private {
require(!isGovernor(_account), "Account is already governor");
governors[_account] = true;
emit GovernorAdded(_account);
}
function _removeGovernor(address _account) private {
require(isGovernor(_account), "Account is not governor");
governors[_account] = false;
emit GovernorRemoved(_account);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./Governor.sol";
abstract contract DelayedTransfer is Governor {
struct delayedTransfer {
address receiver;
address token;
uint256 amount;
uint256 timestamp;
}
mapping(bytes32 => delayedTransfer) public delayedTransfers;
mapping(address => uint256) public delayThresholds;
uint256 public delayPeriod; // in seconds
event DelayedTransferAdded(bytes32 id);
event DelayedTransferExecuted(bytes32 id, address receiver, address token, uint256 amount);
event DelayPeriodUpdated(uint256 period);
event DelayThresholdUpdated(address token, uint256 threshold);
function setDelayThresholds(address[] calldata _tokens, uint256[] calldata _thresholds) external onlyGovernor {
require(_tokens.length == _thresholds.length, "length mismatch");
for (uint256 i = 0; i < _tokens.length; i++) {
delayThresholds[_tokens[i]] = _thresholds[i];
emit DelayThresholdUpdated(_tokens[i], _thresholds[i]);
}
}
function setDelayPeriod(uint256 _period) external onlyGovernor {
delayPeriod = _period;
emit DelayPeriodUpdated(_period);
}
function _addDelayedTransfer(
bytes32 id,
address receiver,
address token,
uint256 amount
) internal {
require(delayedTransfers[id].timestamp == 0, "delayed transfer already exists");
delayedTransfers[id] = delayedTransfer({
receiver: receiver,
token: token,
amount: amount,
timestamp: block.timestamp
});
emit DelayedTransferAdded(id);
}
// caller needs to do the actual token transfer
function _executeDelayedTransfer(bytes32 id) internal returns (delayedTransfer memory) {
delayedTransfer memory transfer = delayedTransfers[id];
require(transfer.timestamp > 0, "delayed transfer not exist");
require(block.timestamp > transfer.timestamp + delayPeriod, "delayed transfer still locked");
delete delayedTransfers[id];
emit DelayedTransferExecuted(id, transfer.receiver, transfer.token, transfer.amount);
return transfer;
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "../safeguard/Ownable.sol";
import "../interfaces/ISigsVerifier.sol";
/**
* @title Multi-sig verification and management functions for {Bridge}.
*/
contract Signers is Ownable, ISigsVerifier {
using ECDSA for bytes32;
bytes32 public ssHash;
uint256 public triggerTime; // timestamp when last update was triggered
// reset can be called by the owner address for emergency recovery
uint256 public resetTime;
uint256 public noticePeriod; // advance notice period as seconds for reset
uint256 constant MAX_INT = 2**256 - 1;
event SignersUpdated(address[] _signers, uint256[] _powers);
event ResetNotification(uint256 resetTime);
/**
* @notice Verifies that a message is signed by a quorum among the signers
* The sigs must be sorted by signer addresses in ascending order.
* @param _msg signed message
* @param _sigs list of signatures sorted by signer addresses in ascending order
* @param _signers sorted list of current signers
* @param _powers powers of current signers
*/
function verifySigs(
bytes memory _msg,
bytes[] calldata _sigs,
address[] calldata _signers,
uint256[] calldata _powers
) public view override {
bytes32 h = keccak256(abi.encodePacked(_signers, _powers));
require(ssHash == h, "Mismatch current signers");
_verifySignedPowers(keccak256(_msg).toEthSignedMessageHash(), _sigs, _signers, _powers);
}
/**
* @notice Update new signers.
* @param _newSigners sorted list of new signers
* @param _curPowers powers of new signers
* @param _sigs list of signatures sorted by signer addresses in ascending order
* @param _curSigners sorted list of current signers
* @param _curPowers powers of current signers
*/
function updateSigners(
uint256 _triggerTime,
address[] calldata _newSigners,
uint256[] calldata _newPowers,
bytes[] calldata _sigs,
address[] calldata _curSigners,
uint256[] calldata _curPowers
) external {
// use trigger time for nonce protection, must be ascending
require(_triggerTime > triggerTime, "Trigger time is not increasing");
// make sure triggerTime is not too large, as it cannot be decreased once set
require(_triggerTime < block.timestamp + 3600, "Trigger time is too large");
bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "UpdateSigners"));
verifySigs(abi.encodePacked(domain, _triggerTime, _newSigners, _newPowers), _sigs, _curSigners, _curPowers);
_updateSigners(_newSigners, _newPowers);
triggerTime = _triggerTime;
}
/**
* @notice reset signers, only used for init setup and emergency recovery
*/
function resetSigners(address[] calldata _signers, uint256[] calldata _powers) external onlyOwner {
require(block.timestamp > resetTime, "not reach reset time");
resetTime = MAX_INT;
_updateSigners(_signers, _powers);
}
function notifyResetSigners() external onlyOwner {
resetTime = block.timestamp + noticePeriod;
emit ResetNotification(resetTime);
}
function increaseNoticePeriod(uint256 period) external onlyOwner {
require(period > noticePeriod, "notice period can only be increased");
noticePeriod = period;
}
// separate from verifySigs func to avoid "stack too deep" issue
function _verifySignedPowers(
bytes32 _hash,
bytes[] calldata _sigs,
address[] calldata _signers,
uint256[] calldata _powers
) private pure {
require(_signers.length == _powers.length, "signers and powers length not match");
uint256 totalPower; // sum of all signer.power
for (uint256 i = 0; i < _signers.length; i++) {
totalPower += _powers[i];
}
uint256 quorum = (totalPower * 2) / 3 + 1;
uint256 signedPower; // sum of signer powers who are in sigs
address prev = address(0);
uint256 index = 0;
for (uint256 i = 0; i < _sigs.length; i++) {
address signer = _hash.recover(_sigs[i]);
require(signer > prev, "signers not in ascending order");
prev = signer;
// now find match signer add its power
while (signer > _signers[index]) {
index += 1;
require(index < _signers.length, "signer not found");
}
if (signer == _signers[index]) {
signedPower += _powers[index];
}
if (signedPower >= quorum) {
// return early to save gas
return;
}
}
revert("quorum not reached");
}
function _updateSigners(address[] calldata _signers, uint256[] calldata _powers) private {
require(_signers.length == _powers.length, "signers and powers length not match");
address prev = address(0);
for (uint256 i = 0; i < _signers.length; i++) {
require(_signers[i] > prev, "New signers not in ascending order");
prev = _signers[i];
}
ssHash = keccak256(abi.encodePacked(_signers, _powers));
emit SignersUpdated(_signers, _powers);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface ISigsVerifier {
/**
* @notice Verifies that a message is signed by a quorum among the signers.
* @param _msg signed message
* @param _sigs list of signatures sorted by signer addresses in ascending order
* @param _signers sorted list of current signers
* @param _powers powers of current signers
*/
function verifySigs(
bytes memory _msg,
bytes[] calldata _sigs,
address[] calldata _signers,
uint256[] calldata _powers
) external view;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
/**
* @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: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/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 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'
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_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
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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");
(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");
(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");
(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");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.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 making 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
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}{
"metadata": {
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 800
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"DelayPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"DelayThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"DelayedTransferAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DelayedTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"}],"name":"EpochLengthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"EpochVolumeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"GovernorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinAddUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinSendUpdated","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTransferId","type":"bytes32"}],"name":"Relay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"resetTime","type":"uint256"}],"name":"ResetNotification","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"transferId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"dstChainId","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"uint32","name":"maxSlippage","type":"uint32"}],"name":"Send","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_signers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"SignersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"withdrawId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"seqnum","type":"uint64"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"refid","type":"bytes32"}],"name":"WithdrawDone","type":"event"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addNativeLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addseq","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delayThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"delayedTransfers","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumeCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"epochVolumes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"executeDelayedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"increaseNoticePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastOpTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minSend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimalMaxSlippage","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenTransferGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeWrap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noticePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifyResetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pausers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_relayRequest","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"relay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"resetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_dstChainId","type":"uint64"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint32","name":"_maxSlippage","type":"uint32"}],"name":"sendNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setDelayPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_thresholds","type":"uint256[]"}],"name":"setDelayThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"setEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_caps","type":"uint256[]"}],"name":"setEpochVolumeCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMaxSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMinSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minimalMaxSlippage","type":"uint32"}],"name":"setMinimalMaxSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasUsed","type":"uint256"}],"name":"setNativeTokenTransferGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"}],"name":"setWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ssHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_triggerTime","type":"uint256"},{"internalType":"address[]","name":"_newSigners","type":"address[]"},{"internalType":"uint256[]","name":"_newPowers","type":"uint256[]"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_curSigners","type":"address[]"},{"internalType":"uint256[]","name":"_curPowers","type":"uint256[]"}],"name":"updateSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_msg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"verifySigs","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_wdmsg","type":"bytes"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdraws","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405261c3506014553480156200001757600080fd5b5062000023336200004e565b60016005556006805460ff191690556200003d336200009e565b620000483362000168565b62000228565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811660009081526007602052604090205460ff16156200010d5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c7265616479207061757365720000000000000060448201526064015b60405180910390fd5b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f891015b60405180910390a150565b6001600160a01b03811660009081526008602052604090205460ff1615620001d35760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f720000000000604482015260640162000104565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b591016200015d565b6151da80620002386000396000f3fe60806040526004361061037a5760003560e01c80638456cb59116101d1578063ba2cb25c11610102578063e3eece26116100a0578063f20c922a1161006f578063f20c922a14610afb578063f2fde38b14610b1b578063f832138314610b3b578063f8b30d7d14610b6857600080fd5b8063e3eece2614610a52578063e43581b814610a82578063e999e5f414610abb578063eecdac8814610adb57600080fd5b8063cefe0df5116100dc578063cefe0df5146109d7578063d0790da9146109f7578063e026049c14610a0d578063e09ab42814610a2257600080fd5b8063ba2cb25c1461096a578063ccde517a1461098a578063cdd1b25d146109b757600080fd5b8063a21a92801161016f578063adc0d57f11610149578063adc0d57f14610897578063b1c94d9414610911578063b517b55014610927578063b5f2bc471461093d57600080fd5b8063a21a928014610837578063a5977fbb14610857578063a7bdf45a1461087757600080fd5b80638da5cb5b116101ab5780638da5cb5b146107c35780639b14d4c6146107e15780639e25fc5c146107f75780639ff9001a1461081757600080fd5b80638456cb5914610754578063878fe1ce1461076957806389e391271461078957600080fd5b806352532faa116102ab57806365a114f1116102495780636ef8d66d116102235780636ef8d66d146106dc5780637044c89e146106f157806380f51c121461070457806382dc1ec41461073457600080fd5b806365a114f114610686578063682dbc221461069c5780636b2c0f55146106bc57600080fd5b806357d775f81161028557806357d775f8146105fe5780635c975abb1461061457806360216b001461062c578063618ee0551461065957600080fd5b806352532faa1461059157806354eea796146105be57806356688700146105de57600080fd5b80633d57210711610318578063457bfa2f116102f2578063457bfa2f146104e057806346fbf68e1461051857806347b16c6c14610551578063482341261461057157600080fd5b80633d572107146104985780633f2e5fc3146104b85780633f4ba83a146104cb57600080fd5b80632fd1b0a4116103545780632fd1b0a4146103dd578063370fb47b146104145780633c4a25d0146104385780633c64f04b1461045857600080fd5b8063089927411461038657806317bdbae5146103a857806325c38b9f146103c857600080fd5b3661038157005b600080fd5b34801561039257600080fd5b506103a66103a1366004614954565b610b95565b005b3480156103b457600080fd5b506103a66103c3366004614954565b610d38565b3480156103d457600080fd5b506103a6610ecf565b3480156103e957600080fd5b506018546103fa9063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561042057600080fd5b5061042a60025481565b60405190815260200161040b565b34801561044457600080fd5b506103a66104533660046149dc565b610f6e565b34801561046457600080fd5b506104886104733660046149f7565b60156020526000908152604090205460ff1681565b604051901515815260200161040b565b3480156104a457600080fd5b506103a66104b33660046149f7565b610fd1565b6103a66104c6366004614a3c565b611065565b3480156104d757600080fd5b506103a66112ba565b3480156104ec57600080fd5b50601354610500906001600160a01b031681565b6040516001600160a01b03909116815260200161040b565b34801561052457600080fd5b506104886105333660046149dc565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561055d57600080fd5b506103a661056c366004614954565b611323565b34801561057d57600080fd5b506103a661058c366004614a9a565b6114ba565b34801561059d57600080fd5b5061042a6105ac3660046149dc565b600e6020526000908152604090205481565b3480156105ca57600080fd5b506103a66105d93660046149f7565b61152e565b3480156105ea57600080fd5b506103a66105f9366004614ab5565b6115bb565b34801561060a57600080fd5b5061042a60095481565b34801561062057600080fd5b5060065460ff16610488565b34801561063857600080fd5b5061042a6106473660046149dc565b600a6020526000908152604090205481565b34801561066557600080fd5b5061042a6106743660046149dc565b60176020526000908152604090205481565b34801561069257600080fd5b5061042a60035481565b3480156106a857600080fd5b506103a66106b7366004614af5565b61177c565b3480156106c857600080fd5b506103a66106d73660046149dc565b611868565b3480156106e857600080fd5b506103a66118c8565b6103a66106ff3660046149f7565b6118d1565b34801561071057600080fd5b5061048861071f3660046149dc565b60076020526000908152604090205460ff1681565b34801561074057600080fd5b506103a661074f3660046149dc565b611b82565b34801561076057600080fd5b506103a6611be2565b34801561077557600080fd5b506103a6610784366004614954565b611c49565b34801561079557600080fd5b506010546107aa9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161040b565b3480156107cf57600080fd5b506000546001600160a01b0316610500565b3480156107ed57600080fd5b5061042a60045481565b34801561080357600080fd5b506103a66108123660046149f7565b611de0565b34801561082357600080fd5b506103a66108323660046149dc565b611e4e565b34801561084357600080fd5b506103a6610852366004614c23565b611ec7565b34801561086357600080fd5b506103a6610872366004614d12565b61220e565b34801561088357600080fd5b506103a6610892366004614954565b61235b565b3480156108a357600080fd5b506108e66108b23660046149f7565b600d6020526000908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169184565b604080516001600160a01b03958616815294909316602085015291830152606082015260800161040b565b34801561091d57600080fd5b5061042a600f5481565b34801561093357600080fd5b5061042a60145481565b34801561094957600080fd5b5061042a6109583660046149dc565b600b6020526000908152604090205481565b34801561097657600080fd5b506103a6610985366004614d7f565b61241b565b34801561099657600080fd5b5061042a6109a53660046149dc565b60116020526000908152604090205481565b3480156109c357600080fd5b506103a66109d2366004614c23565b612571565b3480156109e357600080fd5b506103a66109f23660046149f7565b612896565b348015610a0357600080fd5b5061042a60015481565b348015610a1957600080fd5b506103a66128f3565b348015610a2e57600080fd5b50610488610a3d3660046149f7565b60126020526000908152604090205460ff1681565b348015610a5e57600080fd5b50610488610a6d3660046149dc565b60086020526000908152604090205460ff1681565b348015610a8e57600080fd5b50610488610a9d3660046149dc565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610ac757600080fd5b506103a6610ad6366004614954565b6128fc565b348015610ae757600080fd5b506103a6610af63660046149dc565b612a93565b348015610b0757600080fd5b506103a6610b163660046149f7565b612af3565b348015610b2757600080fd5b506103a6610b363660046149dc565b612bac565b348015610b4757600080fd5b5061042a610b563660046149dc565b600c6020526000908152604090205481565b348015610b7457600080fd5b5061042a610b833660046149dc565b60166020526000908152604090205481565b3360009081526008602052604090205460ff16610bf25760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b60448201526064015b60405180910390fd5b828114610c335760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110610c5057610c50614e7f565b9050602002013560166000878785818110610c6d57610c6d614e7f565b9050602002016020810190610c8291906149dc565b6001600160a01b031681526020810191909152604001600020557f8b59d386e660418a48d742213ad5ce7c4dd51ae81f30e4e2c387f17d907010c9858583818110610ccf57610ccf614e7f565b9050602002016020810190610ce491906149dc565b848484818110610cf657610cf6614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610d2981614eab565b915050610c36565b5050505050565b3360009081526008602052604090205460ff16610d905760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b828114610dd15760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110610dee57610dee614e7f565b90506020020135600e6000878785818110610e0b57610e0b614e7f565b9050602002016020810190610e2091906149dc565b6001600160a01b031681526020810191909152604001600020557fceaad6533bfb481492fb3e08ef19297f46611b8fa9de5ef4cf8dc23a56ad09ce858583818110610e6d57610e6d614e7f565b9050602002016020810190610e8291906149dc565b848484818110610e9457610e94614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610ec781614eab565b915050610dd4565b33610ee26000546001600160a01b031690565b6001600160a01b031614610f265760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b600454610f339042614ec4565b60038190556040519081527f68e825132f7d4bc837dea2d64ac9fc19912bf0224b67f9317d8f1a917f5304a1906020015b60405180910390a1565b33610f816000546001600160a01b031690565b6001600160a01b031614610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81612c88565b50565b3360009081526008602052604090205460ff166110295760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b600f8190556040518181527fc0a39f234199b125fb93713c4d067bdcebbf691087f87b79c0feb92b156ba8b6906020015b60405180910390a150565b6002600554036110b75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156111025760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b8334146111435760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610be9565b6013546001600160a01b031661119b5760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610be9565b6013546000906111b99087906001600160a01b031687878787612d45565b9050601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561120b57600080fd5b505af115801561121f573d6000803e3d6000fd5b5050601354604080518681523360208201526001600160a01b03808d1692820192909252911660608201526080810189905267ffffffffffffffff80891660a0830152871660c082015263ffffffff861660e08201527f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f0193506101000191506112a59050565b60405180910390a15050600160055550505050565b3360009081526007602052604090205460ff166113195760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610be9565b611321612f78565b565b3360009081526008602052604090205460ff1661137b5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b8281146113bc5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d31578282828181106113d9576113d9614e7f565b90506020020135600b60008787858181106113f6576113f6614e7f565b905060200201602081019061140b91906149dc565b6001600160a01b031681526020810191909152604001600020557f608e49c22994f20b5d3496dca088b88dfd81b4a3e8cc3809ea1e10a320107e8985858381811061145857611458614e7f565b905060200201602081019061146d91906149dc565b84848481811061147f5761147f614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a1806114b281614eab565b9150506113bf565b3360009081526008602052604090205460ff166115125760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b6018805463ffffffff191663ffffffff92909216919091179055565b3360009081526008602052604090205460ff166115865760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b60098190556040518181527f2664fec2ff76486ac58ed087310855b648b15b9d19f3de8529e95f7c46b7d6b39060200161105a565b60026005540361160d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156116585760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6001600160a01b03821660009081526011602052604090205481116116b25760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b60108054600191906000906116d290849067ffffffffffffffff16614ed7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611718333083856001600160a01b031661300f909392919063ffffffff16565b6010546040805167ffffffffffffffff90921682523360208301526001600160a01b0384168282015260608201839052517fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce7649181900360800190a150506001600555565b6000848484846040516020016117959493929190614f67565b60405160208183030381529060405280519060200120905080600154146117fe5760405162461bcd60e51b815260206004820152601860248201527f4d69736d617463682063757272656e74207369676e65727300000000000000006044820152606401610be9565b87516020808a0191909120604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082019390935281518082039093018352605c019052805191012061185e908888888888886130a7565b5050505050505050565b3361187b6000546001600160a01b031690565b6001600160a01b0316146118bf5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce816133dc565b611321336133dc565b6002600554036119235760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff161561196e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b8034146119af5760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610be9565b6013546001600160a01b0316611a075760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610be9565b6013546001600160a01b03166000908152601160205260409020548111611a635760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b6010805460019190600090611a8390849067ffffffffffffffff16614ed7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611af957600080fd5b505af1158015611b0d573d6000803e3d6000fd5b50506010546013546040805167ffffffffffffffff90931683523360208401526001600160a01b0390911690820152606081018590527fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce76493506080019150611b729050565b60405180910390a1506001600555565b33611b956000546001600160a01b031690565b6001600160a01b031614611bd95760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81613495565b3360009081526007602052604090205460ff16611c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610be9565b611321613552565b3360009081526008602052604090205460ff16611ca15760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b828114611ce25760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110611cff57611cff614e7f565b9050602002013560176000878785818110611d1c57611d1c614e7f565b9050602002016020810190611d3191906149dc565b6001600160a01b031681526020810191909152604001600020557f4f12d1a5bfb3ccd3719255d4d299d808d50cdca9a0a5c2b3a5aaa7edde73052c858583818110611d7e57611d7e614e7f565b9050602002016020810190611d9391906149dc565b848484818110611da557611da5614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180611dd881614eab565b915050611ce5565b60065460ff1615611e265760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6000611e31826135cd565b9050611e4a816000015182602001518360400151613792565b5050565b33611e616000546001600160a01b031690565b6001600160a01b031614611ea55760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60065460ff1615611f0d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b60004630604051602001611f6392919091825260601b6bffffffffffffffffffffffff191660208201527f57697468647261774d73670000000000000000000000000000000000000000006034820152603f0190565b604051602081830303815290604052805190602001209050611fad818a8a604051602001611f9393929190614f88565b60405160208183030381529060405288888888888861177c565b6000611fee8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138c492505050565b905060008160000151826020015183604001518460600151856080015160405160200161206795949392919060c095861b6001600160c01b031990811682529490951b9093166008850152606091821b6bffffffffffffffffffffffff199081166010860152911b166024830152603882015260580190565b60408051601f1981840301815291815281516020928301206000818152601290935291205490915060ff16156120df5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720616c7265616479207375636365656465640000000000006044820152606401610be9565b6000818152601260205260409020805460ff191660011790556060820151608083015161210c9190613a1e565b60608201516001600160a01b03166000908152600e6020526040902054801580159061213b5750808360800151115b1561215d5761215882846040015185606001518660800151613b3c565b612174565b612174836040015184606001518560800151613792565b7f48a1ab26f3aa7b62bb6b6e8eed182f292b84eb7b006c0254386b268af20774be8284602001518560400151866060015187608001518860a001516040516121f89695949392919095865267ffffffffffffffff9490941660208601526001600160a01b03928316604086015291166060840152608083015260a082015260c00190565b60405180910390a1505050505050505050505050565b6002600554036122605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156122ab5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b60006122bb878787878787612d45565b90506122d26001600160a01b03871633308861300f565b604080518281523360208201526001600160a01b0389811682840152881660608201526080810187905267ffffffffffffffff86811660a0830152851660c082015263ffffffff841660e082015290517f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f01918190036101000190a1505060016005555050505050565b3361236e6000546001600160a01b031690565b6001600160a01b0316146123b25760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b60035442116124035760405162461bcd60e51b815260206004820152601460248201527f6e6f742072656163682072657365742074696d650000000000000000000000006044820152606401610be9565b60001960035561241584848484613c4f565b50505050565b6002548b1161246c5760405162461bcd60e51b815260206004820152601e60248201527f547269676765722074696d65206973206e6f7420696e6372656173696e6700006044820152606401610be9565b61247842610e10614ec4565b8b106124c65760405162461bcd60e51b815260206004820152601960248201527f547269676765722074696d6520697320746f6f206c61726765000000000000006044820152606401610be9565b6000463060405160200161251c92919091825260601b6bffffffffffffffffffffffff191660208201527f5570646174655369676e65727300000000000000000000000000000000000000603482015260410190565b604051602081830303815290604052805190602001209050612552818d8d8d8d8d604051602001611f9396959493929190614fa2565b61255e8b8b8b8b613c4f565b5050506002989098555050505050505050565b60065460ff16156125b75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6000463060405160200161260d92919091825260601b6bffffffffffffffffffffffff191660208201527f52656c6179000000000000000000000000000000000000000000000000000000603482015260390190565b60405160208183030381529060405280519060200120905061263d818a8a604051602001611f9393929190614f88565b600061267e8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613df992505050565b8051602080830151604080850151606080870151608088015160a089015160c0808b015187519a861b6bffffffffffffffffffffffff199081168c8c015298861b891660348c01529590941b9096166048890152605c880191909152811b6001600160c01b0319908116607c88015293901b9092166084850152608c808501929092528051808503909201825260ac909301835280519082012060008181526015909252919020549192509060ff161561276c5760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610be9565b60008181526015602052604090819020805460ff1916600117905582015160608301516127999190613a1e565b6040808301516001600160a01b03166000908152600e602052205480158015906127c65750808360600151115b156127e8576127e382846020015185604001518660600151613b3c565b6127ff565b6127ff836020015184604001518560600151613792565b7f79fa08de5149d912dce8e5e8da7a7c17ccdf23dd5d3bfe196802e6eb86347c7c82846000015185602001518660400151876060015188608001518960c001516040516121f897969594939291909687526001600160a01b0395861660208801529385166040870152919093166060850152608084019290925267ffffffffffffffff9190911660a083015260c082015260e00190565b3360009081526008602052604090205460ff166128ee5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b601455565b61132133613f6a565b3360009081526008602052604090205460ff166129545760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b8281146129955760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d31578282828181106129b2576129b2614e7f565b90506020020135601160008787858181106129cf576129cf614e7f565b90506020020160208101906129e491906149dc565b6001600160a01b031681526020810191909152604001600020557fc56b0d14c4940515800d94ebbd0f3f5d8cc58ba1109c12536bd993b72e466e4f858583818110612a3157612a31614e7f565b9050602002016020810190612a4691906149dc565b848484818110612a5857612a58614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180612a8b81614eab565b915050612998565b33612aa66000546001600160a01b031690565b6001600160a01b031614612aea5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81613f6a565b33612b066000546001600160a01b031690565b6001600160a01b031614612b4a5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b6004548111612ba75760405162461bcd60e51b815260206004820152602360248201527f6e6f7469636520706572696f642063616e206f6e6c7920626520696e637265616044820152621cd95960ea1b6064820152608401610be9565b600455565b33612bbf6000546001600160a01b031690565b6001600160a01b031614612c035760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b6001600160a01b038116612c7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610be9565b610fce81614023565b6001600160a01b03811660009081526008602052604090205460ff1615612cf15760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401610be9565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b5910161105a565b6001600160a01b0385166000908152601660205260408120548511612d9f5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b6001600160a01b0386166000908152601760205260409020541580612ddc57506001600160a01b0386166000908152601760205260409020548511155b612e285760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f206c61726765000000000000000000000000000000006044820152606401610be9565b60185463ffffffff90811690831611612e835760405162461bcd60e51b815260206004820152601660248201527f6d617820736c69707061676520746f6f20736d616c6c000000000000000000006044820152606401610be9565b6040516bffffffffffffffffffffffff1933606090811b8216602084015289811b8216603484015288901b166048820152605c81018690526001600160c01b031960c086811b8216607c84015285811b8216608484015246901b16608c82015260009060940160408051601f1981840301815291815281516020928301206000818152601590935291205490915060ff1615612f535760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610be9565b6000818152601560205260409020805460ff1916600117905590509695505050505050565b60065460ff16612fca5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610be9565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610f64565b6040516001600160a01b03808516602483015283166044820152606481018290526124159085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614073565b8281146131025760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610be9565b6000805b848110156131465783838281811061312057613120614e7f565b90506020020135826131329190614ec4565b91508061313e81614eab565b915050613106565b5060006003613156836002614fca565b6131609190614fe1565b61316b906001614ec4565b905060008080805b8a81101561338a5760006131f68d8d8481811061319257613192614e7f565b90506020028101906131a49190615003565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508f61415890919063ffffffff16565b9050836001600160a01b0316816001600160a01b0316116132595760405162461bcd60e51b815260206004820152601e60248201527f7369676e657273206e6f7420696e20617363656e64696e67206f7264657200006044820152606401610be9565b8093505b8a8a8481811061326f5761326f614e7f565b905060200201602081019061328491906149dc565b6001600160a01b0316816001600160a01b031611156132fe576132a8600184614ec4565b92508983106132f95760405162461bcd60e51b815260206004820152601060248201527f7369676e6572206e6f7420666f756e64000000000000000000000000000000006044820152606401610be9565b61325d565b8a8a8481811061331057613310614e7f565b905060200201602081019061332591906149dc565b6001600160a01b0316816001600160a01b0316036133645788888481811061334f5761334f614e7f565b90506020020135856133619190614ec4565b94505b85851061337757505050505050506133d3565b508061338281614eab565b915050613173565b5060405162461bcd60e51b815260206004820152601260248201527f71756f72756d206e6f74207265616368656400000000000000000000000000006044820152606401610be9565b50505050505050565b6001600160a01b03811660009081526007602052604090205460ff166134445760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f742070617573657200000000000000000000006044820152606401610be9565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e910161105a565b6001600160a01b03811660009081526007602052604090205460ff16156134fe5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c726561647920706175736572000000000000006044820152606401610be9565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f8910161105a565b60065460ff16156135985760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ff73390565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600d6020908152604091829020825160808101845281546001600160a01b039081168252600183015416928101929092526002810154928201929092526003909101546060820181905261368c5760405162461bcd60e51b815260206004820152601a60248201527f64656c61796564207472616e73666572206e6f742065786973740000000000006044820152606401610be9565b600f54816060015161369e9190614ec4565b42116136ec5760405162461bcd60e51b815260206004820152601d60248201527f64656c61796564207472616e73666572207374696c6c206c6f636b65640000006044820152606401610be9565b6000838152600d6020908152604080832080546001600160a01b03199081168255600182018054909116905560028101849055600301929092558251908301518383015192517f3b40e5089937425d14cdd96947e5661868357e224af59bd8b24a4b8a330d44269361378493889390929091909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a192915050565b6013546001600160a01b03908116908316036138ab57601354604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b1580156137ee57600080fd5b505af1158015613802573d6000803e3d6000fd5b5050601454604051600093506001600160a01b0387169250849084818181858888f193505050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b50509050806124155760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e64206e617469766520746f6b656e00000000006044820152606401610be9565b6138bf6001600160a01b038316848361417e565b505050565b6040805160c08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905283518085019094528184528301849052909190805b60208301515183511015613a1657613922836141ae565b90925090508160010361394957613938836141e8565b67ffffffffffffffff16845261390b565b8160020361396e5761395a836141e8565b67ffffffffffffffff16602085015261390b565b8160030361399a5761398761398284614263565b614320565b6001600160a01b0316604085015261390b565b816004036139c1576139ae61398284614263565b6001600160a01b0316606085015261390b565b816005036139e4576139da6139d584614263565b61432b565b608085015261390b565b81600603613a07576139fd6139f884614263565b614362565b60a085015261390b565b613a11838261437a565b61390b565b505050919050565b600954600003613a2c575050565b6001600160a01b0382166000908152600b602052604081205490819003613a5257505050565b6001600160a01b0383166000908152600a602052604081205460095490914291613a7c8184614fe1565b613a869190614fca565b6001600160a01b0387166000908152600c6020526040902054909150811115613ab157849250613abe565b613abb8584614ec4565b92505b83831115613b0e5760405162461bcd60e51b815260206004820152601260248201527f766f6c756d6520657863656564732063617000000000000000000000000000006044820152606401610be9565b506001600160a01b039094166000908152600a6020908152604080832093909355600c905220929092555050565b6000848152600d602052604090206003015415613b9b5760405162461bcd60e51b815260206004820152601f60248201527f64656c61796564207472616e7366657220616c726561647920657869737473006044820152606401610be9565b604080516080810182526001600160a01b0380861682528481166020808401918252838501868152426060860190815260008b8152600d90935291869020945185549085166001600160a01b031991821617865592516001860180549190951693169290921790925551600283015551600390910155517fcbcfffe5102114216a85d3aceb14ad4b81a3935b1b5c468fadf3889eb9c5dce690613c419086815260200190565b60405180910390a150505050565b828114613caa5760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610be9565b6000805b84811015613d8357816001600160a01b0316868683818110613cd257613cd2614e7f565b9050602002016020810190613ce791906149dc565b6001600160a01b031611613d485760405162461bcd60e51b815260206004820152602260248201527f4e6577207369676e657273206e6f7420696e20617363656e64696e67206f726460448201526132b960f11b6064820152608401610be9565b858582818110613d5a57613d5a614e7f565b9050602002016020810190613d6f91906149dc565b915080613d7b81614eab565b915050613cae565b5084848484604051602001613d9b9493929190614f67565b60408051601f198184030181529082905280516020909101206001557ff126123539a68393c55697f617e7d1148e371988daed246c2f41da99965a23f890613dea90879087908790879061504a565b60405180910390a15050505050565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905283518085019094528184528301849052909190805b60208301515183511015613a1657613e5e836141ae565b909250905081600103613e8757613e7761398284614263565b6001600160a01b03168452613e47565b81600203613eae57613e9b61398284614263565b6001600160a01b03166020850152613e47565b81600303613ed557613ec261398284614263565b6001600160a01b03166040850152613e47565b81600403613ef357613ee96139d584614263565b6060850152613e47565b81600503613f1857613f04836141e8565b67ffffffffffffffff166080850152613e47565b81600603613f3d57613f29836141e8565b67ffffffffffffffff1660a0850152613e47565b81600703613f5b57613f516139f884614263565b60c0850152613e47565b613f65838261437a565b613e47565b6001600160a01b03811660009081526008602052604090205460ff16613fd25760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420676f7665726e6f720000000000000000006044820152606401610be9565b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f1ebe834e73d60a5fec822c1e1727d34bc79f2ad977ed504581cc1822fe20fb5b910161105a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006140c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143ea9092919063ffffffff16565b8051909150156138bf57808060200190518101906140e691906150c6565b6138bf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610be9565b60008060006141678585614403565b9150915061417481614471565b5090505b92915050565b6040516001600160a01b0383166024820152604481018290526138bf90849063a9059cbb60e01b90606401613043565b60008060006141bc846141e8565b90506141c9600882614fe1565b92508060071660058111156141e0576141e06150e8565b915050915091565b602080820151825181019091015160009182805b600a8110156103815783811a9150614215816007614fca565b82607f16901b851794508160801660000361425157614235816001614ec4565b86518790614244908390614ec4565b9052509395945050505050565b8061425b81614eab565b9150506141fc565b60606000614270836141e8565b905060008184600001516142849190614ec4565b905083602001515181111561429857600080fd5b8167ffffffffffffffff8111156142b1576142b1614adf565b6040519080825280601f01601f1916602001820160405280156142db576020820181803683370190505b50602080860151865192955091818601919083010160005b8581101561431557818101518382015261430e602082614ec4565b90506142f3565b505050935250919050565b600061417882614627565b600060208251111561433c57600080fd5b602082015190508151602061435191906150fe565b61435c906008614fca565b1c919050565b6000815160201461437257600080fd5b506020015190565b600081600581111561438e5761438e6150e8565b0361439c576138bf826141e8565b60028160058111156143b0576143b06150e8565b036103815760006143c0836141e8565b905080836000018181516143d49190614ec4565b905250602083015151835111156138bf57600080fd5b60606143f9848460008561464f565b90505b9392505050565b60008082516041036144395760208301516040840151606085015160001a61442d87828585614797565b9450945050505061446a565b82516040036144625760208301516040840151614457868383614884565b93509350505061446a565b506000905060025b9250929050565b6000816004811115614485576144856150e8565b0361448d5750565b60018160048111156144a1576144a16150e8565b036144ee5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610be9565b6002816004811115614502576145026150e8565b0361454f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610be9565b6003816004811115614563576145636150e8565b036145bb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610be9565b60048160048111156145cf576145cf6150e8565b03610fce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610be9565b6000815160141461463757600080fd5b50602001516c01000000000000000000000000900490565b6060824710156146c75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610be9565b6001600160a01b0385163b61471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610be9565b600080866001600160a01b0316858760405161473a9190615135565b60006040518083038185875af1925050503d8060008114614777576040519150601f19603f3d011682016040523d82523d6000602084013e61477c565b606091505b509150915061478c8282866148d6565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156147ce575060009050600361487b565b8460ff16601b141580156147e657508460ff16601c14155b156147f7575060009050600461487b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561484b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166148745760006001925092505061487b565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816148ba60ff86901c601b614ec4565b90506148c887828885614797565b935093505050935093915050565b606083156148e55750816143fc565b8251156148f55782518084602001fd5b8160405162461bcd60e51b8152600401610be99190615151565b60008083601f84011261492157600080fd5b50813567ffffffffffffffff81111561493957600080fd5b6020830191508360208260051b850101111561446a57600080fd5b6000806000806040858703121561496a57600080fd5b843567ffffffffffffffff8082111561498257600080fd5b61498e8883890161490f565b909650945060208701359150808211156149a757600080fd5b506149b48782880161490f565b95989497509550505050565b80356001600160a01b03811681146149d757600080fd5b919050565b6000602082840312156149ee57600080fd5b6143fc826149c0565b600060208284031215614a0957600080fd5b5035919050565b803567ffffffffffffffff811681146149d757600080fd5b803563ffffffff811681146149d757600080fd5b600080600080600060a08688031215614a5457600080fd5b614a5d866149c0565b945060208601359350614a7260408701614a10565b9250614a8060608701614a10565b9150614a8e60808701614a28565b90509295509295909350565b600060208284031215614aac57600080fd5b6143fc82614a28565b60008060408385031215614ac857600080fd5b614ad1836149c0565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060006080888a031215614b1057600080fd5b873567ffffffffffffffff80821115614b2857600080fd5b818a0191508a601f830112614b3c57600080fd5b813581811115614b4e57614b4e614adf565b604051601f8201601f19908116603f01168101908382118183101715614b7657614b76614adf565b816040528281528d6020848701011115614b8f57600080fd5b82602086016020830137600094508460208483010152809b5050505060208a013581811115614bbc578283fd5b614bc88c828d0161490f565b90995097505060408a013581811115614bdf578283fd5b614beb8c828d0161490f565b90975095505060608a013581811115614c02578283fd5b614c0e8c828d0161490f565b9a9d999c50979a509598949794955050505050565b6000806000806000806000806080898b031215614c3f57600080fd5b883567ffffffffffffffff80821115614c5757600080fd5b818b0191508b601f830112614c6b57600080fd5b813581811115614c7a57600080fd5b8c6020828501011115614c8c57600080fd5b60209283019a509850908a01359080821115614ca757600080fd5b614cb38c838d0161490f565b909850965060408b0135915080821115614ccc57600080fd5b614cd88c838d0161490f565b909650945060608b0135915080821115614cf157600080fd5b50614cfe8b828c0161490f565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614d2b57600080fd5b614d34876149c0565b9550614d42602088016149c0565b945060408701359350614d5760608801614a10565b9250614d6560808801614a10565b9150614d7360a08801614a28565b90509295509295509295565b600080600080600080600080600080600060c08c8e031215614da057600080fd5b8b359a5067ffffffffffffffff8060208e01351115614dbe57600080fd5b614dce8e60208f01358f0161490f565b909b50995060408d0135811015614de457600080fd5b614df48e60408f01358f0161490f565b909950975060608d0135811015614e0a57600080fd5b614e1a8e60608f01358f0161490f565b909750955060808d0135811015614e3057600080fd5b614e408e60808f01358f0161490f565b909550935060a08d0135811015614e5657600080fd5b50614e678d60a08e01358e0161490f565b81935080925050509295989b509295989b9093969950565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614ebd57614ebd614e95565b5060010190565b8082018082111561417857614178614e95565b67ffffffffffffffff818116838216019080821115614ef857614ef8614e95565b5092915050565b60008160005b84811015614f34576001600160a01b03614f1e836149c0565b1686526020958601959190910190600101614f05565b5093949350505050565b60006001600160fb1b03831115614f5457600080fd5b8260051b80838637939093019392505050565b6000614f7e614f77838789614eff565b8486614f3e565b9695505050505050565b838152818360208301376000910160200190815292915050565b8681528560208201526000614fbe614f77604084018789614eff565b98975050505050505050565b808202811582820484141761417857614178614e95565b600082614ffe57634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e1984360301811261501a57600080fd5b83018035915067ffffffffffffffff82111561503557600080fd5b60200191503681900382131561446a57600080fd5b6040808252810184905260008560608301825b8781101561508b576001600160a01b03615076846149c0565b1682526020928301929091019060010161505d565b5083810360208501528481526001600160fb1b038511156150ab57600080fd5b8460051b915081866020830137016020019695505050505050565b6000602082840312156150d857600080fd5b815180151581146143fc57600080fd5b634e487b7160e01b600052602160045260246000fd5b8181038181111561417857614178614e95565b60005b8381101561512c578181015183820152602001615114565b50506000910152565b60008251615147818460208701615111565b9190910192915050565b6020815260008251806020840152615170816040850160208701615111565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122060ea66ba1a2b5d10486435a221e9cff33147bf5a7a4ee413ee5e8dce0f50121f64736f6c63430008110033
Deployed Bytecode
0x60806040526004361061037a5760003560e01c80638456cb59116101d1578063ba2cb25c11610102578063e3eece26116100a0578063f20c922a1161006f578063f20c922a14610afb578063f2fde38b14610b1b578063f832138314610b3b578063f8b30d7d14610b6857600080fd5b8063e3eece2614610a52578063e43581b814610a82578063e999e5f414610abb578063eecdac8814610adb57600080fd5b8063cefe0df5116100dc578063cefe0df5146109d7578063d0790da9146109f7578063e026049c14610a0d578063e09ab42814610a2257600080fd5b8063ba2cb25c1461096a578063ccde517a1461098a578063cdd1b25d146109b757600080fd5b8063a21a92801161016f578063adc0d57f11610149578063adc0d57f14610897578063b1c94d9414610911578063b517b55014610927578063b5f2bc471461093d57600080fd5b8063a21a928014610837578063a5977fbb14610857578063a7bdf45a1461087757600080fd5b80638da5cb5b116101ab5780638da5cb5b146107c35780639b14d4c6146107e15780639e25fc5c146107f75780639ff9001a1461081757600080fd5b80638456cb5914610754578063878fe1ce1461076957806389e391271461078957600080fd5b806352532faa116102ab57806365a114f1116102495780636ef8d66d116102235780636ef8d66d146106dc5780637044c89e146106f157806380f51c121461070457806382dc1ec41461073457600080fd5b806365a114f114610686578063682dbc221461069c5780636b2c0f55146106bc57600080fd5b806357d775f81161028557806357d775f8146105fe5780635c975abb1461061457806360216b001461062c578063618ee0551461065957600080fd5b806352532faa1461059157806354eea796146105be57806356688700146105de57600080fd5b80633d57210711610318578063457bfa2f116102f2578063457bfa2f146104e057806346fbf68e1461051857806347b16c6c14610551578063482341261461057157600080fd5b80633d572107146104985780633f2e5fc3146104b85780633f4ba83a146104cb57600080fd5b80632fd1b0a4116103545780632fd1b0a4146103dd578063370fb47b146104145780633c4a25d0146104385780633c64f04b1461045857600080fd5b8063089927411461038657806317bdbae5146103a857806325c38b9f146103c857600080fd5b3661038157005b600080fd5b34801561039257600080fd5b506103a66103a1366004614954565b610b95565b005b3480156103b457600080fd5b506103a66103c3366004614954565b610d38565b3480156103d457600080fd5b506103a6610ecf565b3480156103e957600080fd5b506018546103fa9063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561042057600080fd5b5061042a60025481565b60405190815260200161040b565b34801561044457600080fd5b506103a66104533660046149dc565b610f6e565b34801561046457600080fd5b506104886104733660046149f7565b60156020526000908152604090205460ff1681565b604051901515815260200161040b565b3480156104a457600080fd5b506103a66104b33660046149f7565b610fd1565b6103a66104c6366004614a3c565b611065565b3480156104d757600080fd5b506103a66112ba565b3480156104ec57600080fd5b50601354610500906001600160a01b031681565b6040516001600160a01b03909116815260200161040b565b34801561052457600080fd5b506104886105333660046149dc565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561055d57600080fd5b506103a661056c366004614954565b611323565b34801561057d57600080fd5b506103a661058c366004614a9a565b6114ba565b34801561059d57600080fd5b5061042a6105ac3660046149dc565b600e6020526000908152604090205481565b3480156105ca57600080fd5b506103a66105d93660046149f7565b61152e565b3480156105ea57600080fd5b506103a66105f9366004614ab5565b6115bb565b34801561060a57600080fd5b5061042a60095481565b34801561062057600080fd5b5060065460ff16610488565b34801561063857600080fd5b5061042a6106473660046149dc565b600a6020526000908152604090205481565b34801561066557600080fd5b5061042a6106743660046149dc565b60176020526000908152604090205481565b34801561069257600080fd5b5061042a60035481565b3480156106a857600080fd5b506103a66106b7366004614af5565b61177c565b3480156106c857600080fd5b506103a66106d73660046149dc565b611868565b3480156106e857600080fd5b506103a66118c8565b6103a66106ff3660046149f7565b6118d1565b34801561071057600080fd5b5061048861071f3660046149dc565b60076020526000908152604090205460ff1681565b34801561074057600080fd5b506103a661074f3660046149dc565b611b82565b34801561076057600080fd5b506103a6611be2565b34801561077557600080fd5b506103a6610784366004614954565b611c49565b34801561079557600080fd5b506010546107aa9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161040b565b3480156107cf57600080fd5b506000546001600160a01b0316610500565b3480156107ed57600080fd5b5061042a60045481565b34801561080357600080fd5b506103a66108123660046149f7565b611de0565b34801561082357600080fd5b506103a66108323660046149dc565b611e4e565b34801561084357600080fd5b506103a6610852366004614c23565b611ec7565b34801561086357600080fd5b506103a6610872366004614d12565b61220e565b34801561088357600080fd5b506103a6610892366004614954565b61235b565b3480156108a357600080fd5b506108e66108b23660046149f7565b600d6020526000908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169184565b604080516001600160a01b03958616815294909316602085015291830152606082015260800161040b565b34801561091d57600080fd5b5061042a600f5481565b34801561093357600080fd5b5061042a60145481565b34801561094957600080fd5b5061042a6109583660046149dc565b600b6020526000908152604090205481565b34801561097657600080fd5b506103a6610985366004614d7f565b61241b565b34801561099657600080fd5b5061042a6109a53660046149dc565b60116020526000908152604090205481565b3480156109c357600080fd5b506103a66109d2366004614c23565b612571565b3480156109e357600080fd5b506103a66109f23660046149f7565b612896565b348015610a0357600080fd5b5061042a60015481565b348015610a1957600080fd5b506103a66128f3565b348015610a2e57600080fd5b50610488610a3d3660046149f7565b60126020526000908152604090205460ff1681565b348015610a5e57600080fd5b50610488610a6d3660046149dc565b60086020526000908152604090205460ff1681565b348015610a8e57600080fd5b50610488610a9d3660046149dc565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610ac757600080fd5b506103a6610ad6366004614954565b6128fc565b348015610ae757600080fd5b506103a6610af63660046149dc565b612a93565b348015610b0757600080fd5b506103a6610b163660046149f7565b612af3565b348015610b2757600080fd5b506103a6610b363660046149dc565b612bac565b348015610b4757600080fd5b5061042a610b563660046149dc565b600c6020526000908152604090205481565b348015610b7457600080fd5b5061042a610b833660046149dc565b60166020526000908152604090205481565b3360009081526008602052604090205460ff16610bf25760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b60448201526064015b60405180910390fd5b828114610c335760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110610c5057610c50614e7f565b9050602002013560166000878785818110610c6d57610c6d614e7f565b9050602002016020810190610c8291906149dc565b6001600160a01b031681526020810191909152604001600020557f8b59d386e660418a48d742213ad5ce7c4dd51ae81f30e4e2c387f17d907010c9858583818110610ccf57610ccf614e7f565b9050602002016020810190610ce491906149dc565b848484818110610cf657610cf6614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610d2981614eab565b915050610c36565b5050505050565b3360009081526008602052604090205460ff16610d905760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b828114610dd15760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110610dee57610dee614e7f565b90506020020135600e6000878785818110610e0b57610e0b614e7f565b9050602002016020810190610e2091906149dc565b6001600160a01b031681526020810191909152604001600020557fceaad6533bfb481492fb3e08ef19297f46611b8fa9de5ef4cf8dc23a56ad09ce858583818110610e6d57610e6d614e7f565b9050602002016020810190610e8291906149dc565b848484818110610e9457610e94614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180610ec781614eab565b915050610dd4565b33610ee26000546001600160a01b031690565b6001600160a01b031614610f265760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b600454610f339042614ec4565b60038190556040519081527f68e825132f7d4bc837dea2d64ac9fc19912bf0224b67f9317d8f1a917f5304a1906020015b60405180910390a1565b33610f816000546001600160a01b031690565b6001600160a01b031614610fc55760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81612c88565b50565b3360009081526008602052604090205460ff166110295760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b600f8190556040518181527fc0a39f234199b125fb93713c4d067bdcebbf691087f87b79c0feb92b156ba8b6906020015b60405180910390a150565b6002600554036110b75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156111025760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b8334146111435760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610be9565b6013546001600160a01b031661119b5760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610be9565b6013546000906111b99087906001600160a01b031687878787612d45565b9050601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b15801561120b57600080fd5b505af115801561121f573d6000803e3d6000fd5b5050601354604080518681523360208201526001600160a01b03808d1692820192909252911660608201526080810189905267ffffffffffffffff80891660a0830152871660c082015263ffffffff861660e08201527f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f0193506101000191506112a59050565b60405180910390a15050600160055550505050565b3360009081526007602052604090205460ff166113195760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610be9565b611321612f78565b565b3360009081526008602052604090205460ff1661137b5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b8281146113bc5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d31578282828181106113d9576113d9614e7f565b90506020020135600b60008787858181106113f6576113f6614e7f565b905060200201602081019061140b91906149dc565b6001600160a01b031681526020810191909152604001600020557f608e49c22994f20b5d3496dca088b88dfd81b4a3e8cc3809ea1e10a320107e8985858381811061145857611458614e7f565b905060200201602081019061146d91906149dc565b84848481811061147f5761147f614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a1806114b281614eab565b9150506113bf565b3360009081526008602052604090205460ff166115125760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b6018805463ffffffff191663ffffffff92909216919091179055565b3360009081526008602052604090205460ff166115865760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b60098190556040518181527f2664fec2ff76486ac58ed087310855b648b15b9d19f3de8529e95f7c46b7d6b39060200161105a565b60026005540361160d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156116585760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6001600160a01b03821660009081526011602052604090205481116116b25760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b60108054600191906000906116d290849067ffffffffffffffff16614ed7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611718333083856001600160a01b031661300f909392919063ffffffff16565b6010546040805167ffffffffffffffff90921682523360208301526001600160a01b0384168282015260608201839052517fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce7649181900360800190a150506001600555565b6000848484846040516020016117959493929190614f67565b60405160208183030381529060405280519060200120905080600154146117fe5760405162461bcd60e51b815260206004820152601860248201527f4d69736d617463682063757272656e74207369676e65727300000000000000006044820152606401610be9565b87516020808a0191909120604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082019390935281518082039093018352605c019052805191012061185e908888888888886130a7565b5050505050505050565b3361187b6000546001600160a01b031690565b6001600160a01b0316146118bf5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce816133dc565b611321336133dc565b6002600554036119235760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff161561196e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b8034146119af5760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840dad2e6dac2e8c6d608b1b6044820152606401610be9565b6013546001600160a01b0316611a075760405162461bcd60e51b815260206004820152601360248201527f4e61746976652077726170206e6f7420736574000000000000000000000000006044820152606401610be9565b6013546001600160a01b03166000908152601160205260409020548111611a635760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b6010805460019190600090611a8390849067ffffffffffffffff16614ed7565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550601360009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611af957600080fd5b505af1158015611b0d573d6000803e3d6000fd5b50506010546013546040805167ffffffffffffffff90931683523360208401526001600160a01b0390911690820152606081018590527fd5d28426c3248963b1719df49aa4c665120372e02c8249bbea03d019c39ce76493506080019150611b729050565b60405180910390a1506001600555565b33611b956000546001600160a01b031690565b6001600160a01b031614611bd95760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81613495565b3360009081526007602052604090205460ff16611c415760405162461bcd60e51b815260206004820152601460248201527f43616c6c6572206973206e6f74207061757365720000000000000000000000006044820152606401610be9565b611321613552565b3360009081526008602052604090205460ff16611ca15760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b828114611ce25760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d3157828282818110611cff57611cff614e7f565b9050602002013560176000878785818110611d1c57611d1c614e7f565b9050602002016020810190611d3191906149dc565b6001600160a01b031681526020810191909152604001600020557f4f12d1a5bfb3ccd3719255d4d299d808d50cdca9a0a5c2b3a5aaa7edde73052c858583818110611d7e57611d7e614e7f565b9050602002016020810190611d9391906149dc565b848484818110611da557611da5614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180611dd881614eab565b915050611ce5565b60065460ff1615611e265760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6000611e31826135cd565b9050611e4a816000015182602001518360400151613792565b5050565b33611e616000546001600160a01b031690565b6001600160a01b031614611ea55760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60065460ff1615611f0d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b60004630604051602001611f6392919091825260601b6bffffffffffffffffffffffff191660208201527f57697468647261774d73670000000000000000000000000000000000000000006034820152603f0190565b604051602081830303815290604052805190602001209050611fad818a8a604051602001611f9393929190614f88565b60405160208183030381529060405288888888888861177c565b6000611fee8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138c492505050565b905060008160000151826020015183604001518460600151856080015160405160200161206795949392919060c095861b6001600160c01b031990811682529490951b9093166008850152606091821b6bffffffffffffffffffffffff199081166010860152911b166024830152603882015260580190565b60408051601f1981840301815291815281516020928301206000818152601290935291205490915060ff16156120df5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720616c7265616479207375636365656465640000000000006044820152606401610be9565b6000818152601260205260409020805460ff191660011790556060820151608083015161210c9190613a1e565b60608201516001600160a01b03166000908152600e6020526040902054801580159061213b5750808360800151115b1561215d5761215882846040015185606001518660800151613b3c565b612174565b612174836040015184606001518560800151613792565b7f48a1ab26f3aa7b62bb6b6e8eed182f292b84eb7b006c0254386b268af20774be8284602001518560400151866060015187608001518860a001516040516121f89695949392919095865267ffffffffffffffff9490941660208601526001600160a01b03928316604086015291166060840152608083015260a082015260c00190565b60405180910390a1505050505050505050505050565b6002600554036122605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610be9565b600260055560065460ff16156122ab5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b60006122bb878787878787612d45565b90506122d26001600160a01b03871633308861300f565b604080518281523360208201526001600160a01b0389811682840152881660608201526080810187905267ffffffffffffffff86811660a0830152851660c082015263ffffffff841660e082015290517f89d8051e597ab4178a863a5190407b98abfeff406aa8db90c59af76612e58f01918190036101000190a1505060016005555050505050565b3361236e6000546001600160a01b031690565b6001600160a01b0316146123b25760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b60035442116124035760405162461bcd60e51b815260206004820152601460248201527f6e6f742072656163682072657365742074696d650000000000000000000000006044820152606401610be9565b60001960035561241584848484613c4f565b50505050565b6002548b1161246c5760405162461bcd60e51b815260206004820152601e60248201527f547269676765722074696d65206973206e6f7420696e6372656173696e6700006044820152606401610be9565b61247842610e10614ec4565b8b106124c65760405162461bcd60e51b815260206004820152601960248201527f547269676765722074696d6520697320746f6f206c61726765000000000000006044820152606401610be9565b6000463060405160200161251c92919091825260601b6bffffffffffffffffffffffff191660208201527f5570646174655369676e65727300000000000000000000000000000000000000603482015260410190565b604051602081830303815290604052805190602001209050612552818d8d8d8d8d604051602001611f9396959493929190614fa2565b61255e8b8b8b8b613c4f565b5050506002989098555050505050505050565b60065460ff16156125b75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6000463060405160200161260d92919091825260601b6bffffffffffffffffffffffff191660208201527f52656c6179000000000000000000000000000000000000000000000000000000603482015260390190565b60405160208183030381529060405280519060200120905061263d818a8a604051602001611f9393929190614f88565b600061267e8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613df992505050565b8051602080830151604080850151606080870151608088015160a089015160c0808b015187519a861b6bffffffffffffffffffffffff199081168c8c015298861b891660348c01529590941b9096166048890152605c880191909152811b6001600160c01b0319908116607c88015293901b9092166084850152608c808501929092528051808503909201825260ac909301835280519082012060008181526015909252919020549192509060ff161561276c5760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610be9565b60008181526015602052604090819020805460ff1916600117905582015160608301516127999190613a1e565b6040808301516001600160a01b03166000908152600e602052205480158015906127c65750808360600151115b156127e8576127e382846020015185604001518660600151613b3c565b6127ff565b6127ff836020015184604001518560600151613792565b7f79fa08de5149d912dce8e5e8da7a7c17ccdf23dd5d3bfe196802e6eb86347c7c82846000015185602001518660400151876060015188608001518960c001516040516121f897969594939291909687526001600160a01b0395861660208801529385166040870152919093166060850152608084019290925267ffffffffffffffff9190911660a083015260c082015260e00190565b3360009081526008602052604090205460ff166128ee5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b601455565b61132133613f6a565b3360009081526008602052604090205460ff166129545760405162461bcd60e51b815260206004820152601660248201527521b0b63632b91034b9903737ba1033b7bb32b93737b960511b6044820152606401610be9565b8281146129955760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610be9565b60005b83811015610d31578282828181106129b2576129b2614e7f565b90506020020135601160008787858181106129cf576129cf614e7f565b90506020020160208101906129e491906149dc565b6001600160a01b031681526020810191909152604001600020557fc56b0d14c4940515800d94ebbd0f3f5d8cc58ba1109c12536bd993b72e466e4f858583818110612a3157612a31614e7f565b9050602002016020810190612a4691906149dc565b848484818110612a5857612a58614e7f565b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180612a8b81614eab565b915050612998565b33612aa66000546001600160a01b031690565b6001600160a01b031614612aea5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b610fce81613f6a565b33612b066000546001600160a01b031690565b6001600160a01b031614612b4a5760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b6004548111612ba75760405162461bcd60e51b815260206004820152602360248201527f6e6f7469636520706572696f642063616e206f6e6c7920626520696e637265616044820152621cd95960ea1b6064820152608401610be9565b600455565b33612bbf6000546001600160a01b031690565b6001600160a01b031614612c035760405162461bcd60e51b815260206004820181905260248201526000805160206151858339815191526044820152606401610be9565b6001600160a01b038116612c7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610be9565b610fce81614023565b6001600160a01b03811660009081526008602052604090205460ff1615612cf15760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920676f7665726e6f7200000000006044820152606401610be9565b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527fdc5a48d79e2e147530ff63ecdbed5a5a66adb9d5cf339384d5d076da197c40b5910161105a565b6001600160a01b0385166000908152601660205260408120548511612d9f5760405162461bcd60e51b815260206004820152601060248201526f185b5bdd5b9d081d1bdbc81cdb585b1b60821b6044820152606401610be9565b6001600160a01b0386166000908152601760205260409020541580612ddc57506001600160a01b0386166000908152601760205260409020548511155b612e285760405162461bcd60e51b815260206004820152601060248201527f616d6f756e7420746f6f206c61726765000000000000000000000000000000006044820152606401610be9565b60185463ffffffff90811690831611612e835760405162461bcd60e51b815260206004820152601660248201527f6d617820736c69707061676520746f6f20736d616c6c000000000000000000006044820152606401610be9565b6040516bffffffffffffffffffffffff1933606090811b8216602084015289811b8216603484015288901b166048820152605c81018690526001600160c01b031960c086811b8216607c84015285811b8216608484015246901b16608c82015260009060940160408051601f1981840301815291815281516020928301206000818152601590935291205490915060ff1615612f535760405162461bcd60e51b815260206004820152600f60248201526e7472616e736665722065786973747360881b6044820152606401610be9565b6000818152601560205260409020805460ff1916600117905590509695505050505050565b60065460ff16612fca5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610be9565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610f64565b6040516001600160a01b03808516602483015283166044820152606481018290526124159085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614073565b8281146131025760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610be9565b6000805b848110156131465783838281811061312057613120614e7f565b90506020020135826131329190614ec4565b91508061313e81614eab565b915050613106565b5060006003613156836002614fca565b6131609190614fe1565b61316b906001614ec4565b905060008080805b8a81101561338a5760006131f68d8d8481811061319257613192614e7f565b90506020028101906131a49190615003565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508f61415890919063ffffffff16565b9050836001600160a01b0316816001600160a01b0316116132595760405162461bcd60e51b815260206004820152601e60248201527f7369676e657273206e6f7420696e20617363656e64696e67206f7264657200006044820152606401610be9565b8093505b8a8a8481811061326f5761326f614e7f565b905060200201602081019061328491906149dc565b6001600160a01b0316816001600160a01b031611156132fe576132a8600184614ec4565b92508983106132f95760405162461bcd60e51b815260206004820152601060248201527f7369676e6572206e6f7420666f756e64000000000000000000000000000000006044820152606401610be9565b61325d565b8a8a8481811061331057613310614e7f565b905060200201602081019061332591906149dc565b6001600160a01b0316816001600160a01b0316036133645788888481811061334f5761334f614e7f565b90506020020135856133619190614ec4565b94505b85851061337757505050505050506133d3565b508061338281614eab565b915050613173565b5060405162461bcd60e51b815260206004820152601260248201527f71756f72756d206e6f74207265616368656400000000000000000000000000006044820152606401610be9565b50505050505050565b6001600160a01b03811660009081526007602052604090205460ff166134445760405162461bcd60e51b815260206004820152601560248201527f4163636f756e74206973206e6f742070617573657200000000000000000000006044820152606401610be9565b6001600160a01b038116600081815260076020908152604091829020805460ff1916905590519182527fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e910161105a565b6001600160a01b03811660009081526007602052604090205460ff16156134fe5760405162461bcd60e51b815260206004820152601960248201527f4163636f756e7420697320616c726561647920706175736572000000000000006044820152606401610be9565b6001600160a01b038116600081815260076020908152604091829020805460ff1916600117905590519182527f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f8910161105a565b60065460ff16156135985760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610be9565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ff73390565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600d6020908152604091829020825160808101845281546001600160a01b039081168252600183015416928101929092526002810154928201929092526003909101546060820181905261368c5760405162461bcd60e51b815260206004820152601a60248201527f64656c61796564207472616e73666572206e6f742065786973740000000000006044820152606401610be9565b600f54816060015161369e9190614ec4565b42116136ec5760405162461bcd60e51b815260206004820152601d60248201527f64656c61796564207472616e73666572207374696c6c206c6f636b65640000006044820152606401610be9565b6000838152600d6020908152604080832080546001600160a01b03199081168255600182018054909116905560028101849055600301929092558251908301518383015192517f3b40e5089937425d14cdd96947e5661868357e224af59bd8b24a4b8a330d44269361378493889390929091909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a192915050565b6013546001600160a01b03908116908316036138ab57601354604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b1580156137ee57600080fd5b505af1158015613802573d6000803e3d6000fd5b5050601454604051600093506001600160a01b0387169250849084818181858888f193505050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b50509050806124155760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e64206e617469766520746f6b656e00000000006044820152606401610be9565b6138bf6001600160a01b038316848361417e565b505050565b6040805160c08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905283518085019094528184528301849052909190805b60208301515183511015613a1657613922836141ae565b90925090508160010361394957613938836141e8565b67ffffffffffffffff16845261390b565b8160020361396e5761395a836141e8565b67ffffffffffffffff16602085015261390b565b8160030361399a5761398761398284614263565b614320565b6001600160a01b0316604085015261390b565b816004036139c1576139ae61398284614263565b6001600160a01b0316606085015261390b565b816005036139e4576139da6139d584614263565b61432b565b608085015261390b565b81600603613a07576139fd6139f884614263565b614362565b60a085015261390b565b613a11838261437a565b61390b565b505050919050565b600954600003613a2c575050565b6001600160a01b0382166000908152600b602052604081205490819003613a5257505050565b6001600160a01b0383166000908152600a602052604081205460095490914291613a7c8184614fe1565b613a869190614fca565b6001600160a01b0387166000908152600c6020526040902054909150811115613ab157849250613abe565b613abb8584614ec4565b92505b83831115613b0e5760405162461bcd60e51b815260206004820152601260248201527f766f6c756d6520657863656564732063617000000000000000000000000000006044820152606401610be9565b506001600160a01b039094166000908152600a6020908152604080832093909355600c905220929092555050565b6000848152600d602052604090206003015415613b9b5760405162461bcd60e51b815260206004820152601f60248201527f64656c61796564207472616e7366657220616c726561647920657869737473006044820152606401610be9565b604080516080810182526001600160a01b0380861682528481166020808401918252838501868152426060860190815260008b8152600d90935291869020945185549085166001600160a01b031991821617865592516001860180549190951693169290921790925551600283015551600390910155517fcbcfffe5102114216a85d3aceb14ad4b81a3935b1b5c468fadf3889eb9c5dce690613c419086815260200190565b60405180910390a150505050565b828114613caa5760405162461bcd60e51b815260206004820152602360248201527f7369676e65727320616e6420706f77657273206c656e677468206e6f74206d616044820152620e8c6d60eb1b6064820152608401610be9565b6000805b84811015613d8357816001600160a01b0316868683818110613cd257613cd2614e7f565b9050602002016020810190613ce791906149dc565b6001600160a01b031611613d485760405162461bcd60e51b815260206004820152602260248201527f4e6577207369676e657273206e6f7420696e20617363656e64696e67206f726460448201526132b960f11b6064820152608401610be9565b858582818110613d5a57613d5a614e7f565b9050602002016020810190613d6f91906149dc565b915080613d7b81614eab565b915050613cae565b5084848484604051602001613d9b9493929190614f67565b60408051601f198184030181529082905280516020909101206001557ff126123539a68393c55697f617e7d1148e371988daed246c2f41da99965a23f890613dea90879087908790879061504a565b60405180910390a15050505050565b6040805160e08101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905283518085019094528184528301849052909190805b60208301515183511015613a1657613e5e836141ae565b909250905081600103613e8757613e7761398284614263565b6001600160a01b03168452613e47565b81600203613eae57613e9b61398284614263565b6001600160a01b03166020850152613e47565b81600303613ed557613ec261398284614263565b6001600160a01b03166040850152613e47565b81600403613ef357613ee96139d584614263565b6060850152613e47565b81600503613f1857613f04836141e8565b67ffffffffffffffff166080850152613e47565b81600603613f3d57613f29836141e8565b67ffffffffffffffff1660a0850152613e47565b81600703613f5b57613f516139f884614263565b60c0850152613e47565b613f65838261437a565b613e47565b6001600160a01b03811660009081526008602052604090205460ff16613fd25760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420676f7665726e6f720000000000000000006044820152606401610be9565b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f1ebe834e73d60a5fec822c1e1727d34bc79f2ad977ed504581cc1822fe20fb5b910161105a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006140c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143ea9092919063ffffffff16565b8051909150156138bf57808060200190518101906140e691906150c6565b6138bf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610be9565b60008060006141678585614403565b9150915061417481614471565b5090505b92915050565b6040516001600160a01b0383166024820152604481018290526138bf90849063a9059cbb60e01b90606401613043565b60008060006141bc846141e8565b90506141c9600882614fe1565b92508060071660058111156141e0576141e06150e8565b915050915091565b602080820151825181019091015160009182805b600a8110156103815783811a9150614215816007614fca565b82607f16901b851794508160801660000361425157614235816001614ec4565b86518790614244908390614ec4565b9052509395945050505050565b8061425b81614eab565b9150506141fc565b60606000614270836141e8565b905060008184600001516142849190614ec4565b905083602001515181111561429857600080fd5b8167ffffffffffffffff8111156142b1576142b1614adf565b6040519080825280601f01601f1916602001820160405280156142db576020820181803683370190505b50602080860151865192955091818601919083010160005b8581101561431557818101518382015261430e602082614ec4565b90506142f3565b505050935250919050565b600061417882614627565b600060208251111561433c57600080fd5b602082015190508151602061435191906150fe565b61435c906008614fca565b1c919050565b6000815160201461437257600080fd5b506020015190565b600081600581111561438e5761438e6150e8565b0361439c576138bf826141e8565b60028160058111156143b0576143b06150e8565b036103815760006143c0836141e8565b905080836000018181516143d49190614ec4565b905250602083015151835111156138bf57600080fd5b60606143f9848460008561464f565b90505b9392505050565b60008082516041036144395760208301516040840151606085015160001a61442d87828585614797565b9450945050505061446a565b82516040036144625760208301516040840151614457868383614884565b93509350505061446a565b506000905060025b9250929050565b6000816004811115614485576144856150e8565b0361448d5750565b60018160048111156144a1576144a16150e8565b036144ee5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610be9565b6002816004811115614502576145026150e8565b0361454f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610be9565b6003816004811115614563576145636150e8565b036145bb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610be9565b60048160048111156145cf576145cf6150e8565b03610fce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610be9565b6000815160141461463757600080fd5b50602001516c01000000000000000000000000900490565b6060824710156146c75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610be9565b6001600160a01b0385163b61471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610be9565b600080866001600160a01b0316858760405161473a9190615135565b60006040518083038185875af1925050503d8060008114614777576040519150601f19603f3d011682016040523d82523d6000602084013e61477c565b606091505b509150915061478c8282866148d6565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156147ce575060009050600361487b565b8460ff16601b141580156147e657508460ff16601c14155b156147f7575060009050600461487b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561484b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166148745760006001925092505061487b565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816148ba60ff86901c601b614ec4565b90506148c887828885614797565b935093505050935093915050565b606083156148e55750816143fc565b8251156148f55782518084602001fd5b8160405162461bcd60e51b8152600401610be99190615151565b60008083601f84011261492157600080fd5b50813567ffffffffffffffff81111561493957600080fd5b6020830191508360208260051b850101111561446a57600080fd5b6000806000806040858703121561496a57600080fd5b843567ffffffffffffffff8082111561498257600080fd5b61498e8883890161490f565b909650945060208701359150808211156149a757600080fd5b506149b48782880161490f565b95989497509550505050565b80356001600160a01b03811681146149d757600080fd5b919050565b6000602082840312156149ee57600080fd5b6143fc826149c0565b600060208284031215614a0957600080fd5b5035919050565b803567ffffffffffffffff811681146149d757600080fd5b803563ffffffff811681146149d757600080fd5b600080600080600060a08688031215614a5457600080fd5b614a5d866149c0565b945060208601359350614a7260408701614a10565b9250614a8060608701614a10565b9150614a8e60808701614a28565b90509295509295909350565b600060208284031215614aac57600080fd5b6143fc82614a28565b60008060408385031215614ac857600080fd5b614ad1836149c0565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060006080888a031215614b1057600080fd5b873567ffffffffffffffff80821115614b2857600080fd5b818a0191508a601f830112614b3c57600080fd5b813581811115614b4e57614b4e614adf565b604051601f8201601f19908116603f01168101908382118183101715614b7657614b76614adf565b816040528281528d6020848701011115614b8f57600080fd5b82602086016020830137600094508460208483010152809b5050505060208a013581811115614bbc578283fd5b614bc88c828d0161490f565b90995097505060408a013581811115614bdf578283fd5b614beb8c828d0161490f565b90975095505060608a013581811115614c02578283fd5b614c0e8c828d0161490f565b9a9d999c50979a509598949794955050505050565b6000806000806000806000806080898b031215614c3f57600080fd5b883567ffffffffffffffff80821115614c5757600080fd5b818b0191508b601f830112614c6b57600080fd5b813581811115614c7a57600080fd5b8c6020828501011115614c8c57600080fd5b60209283019a509850908a01359080821115614ca757600080fd5b614cb38c838d0161490f565b909850965060408b0135915080821115614ccc57600080fd5b614cd88c838d0161490f565b909650945060608b0135915080821115614cf157600080fd5b50614cfe8b828c0161490f565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614d2b57600080fd5b614d34876149c0565b9550614d42602088016149c0565b945060408701359350614d5760608801614a10565b9250614d6560808801614a10565b9150614d7360a08801614a28565b90509295509295509295565b600080600080600080600080600080600060c08c8e031215614da057600080fd5b8b359a5067ffffffffffffffff8060208e01351115614dbe57600080fd5b614dce8e60208f01358f0161490f565b909b50995060408d0135811015614de457600080fd5b614df48e60408f01358f0161490f565b909950975060608d0135811015614e0a57600080fd5b614e1a8e60608f01358f0161490f565b909750955060808d0135811015614e3057600080fd5b614e408e60808f01358f0161490f565b909550935060a08d0135811015614e5657600080fd5b50614e678d60a08e01358e0161490f565b81935080925050509295989b509295989b9093969950565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614ebd57614ebd614e95565b5060010190565b8082018082111561417857614178614e95565b67ffffffffffffffff818116838216019080821115614ef857614ef8614e95565b5092915050565b60008160005b84811015614f34576001600160a01b03614f1e836149c0565b1686526020958601959190910190600101614f05565b5093949350505050565b60006001600160fb1b03831115614f5457600080fd5b8260051b80838637939093019392505050565b6000614f7e614f77838789614eff565b8486614f3e565b9695505050505050565b838152818360208301376000910160200190815292915050565b8681528560208201526000614fbe614f77604084018789614eff565b98975050505050505050565b808202811582820484141761417857614178614e95565b600082614ffe57634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e1984360301811261501a57600080fd5b83018035915067ffffffffffffffff82111561503557600080fd5b60200191503681900382131561446a57600080fd5b6040808252810184905260008560608301825b8781101561508b576001600160a01b03615076846149c0565b1682526020928301929091019060010161505d565b5083810360208501528481526001600160fb1b038511156150ab57600080fd5b8460051b915081866020830137016020019695505050505050565b6000602082840312156150d857600080fd5b815180151581146143fc57600080fd5b634e487b7160e01b600052602160045260246000fd5b8181038181111561417857614178614e95565b60005b8381101561512c578181015183820152602001615114565b50506000910152565b60008251615147818460208701615111565b9190910192915050565b6020815260008251806020840152615170816040850160208701615111565b601f01601f1916919091016040019291505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122060ea66ba1a2b5d10486435a221e9cff33147bf5a7a4ee413ee5e8dce0f50121f64736f6c63430008110033
Deployed Bytecode Sourcemap
299:7365:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6716:347;;;;;;;;;;-1:-1:-1;6716:347:5;;;;;:::i;:::-;;:::i;:::-;;703:382:8;;;;;;;;;;-1:-1:-1;703:382:8;;;;;:::i;:::-;;:::i;3195:151:7:-;;;;;;;;;;;;;:::i;1204:32:5:-;;;;;;;;;;-1:-1:-1;1204:32:5;;;;;;;;;;;1338:10:21;1326:23;;;1308:42;;1296:2;1281:18;1204:32:5;;;;;;;;394:26:7;;;;;;;;;;;;;;;;;;;1507:25:21;;;1495:2;1480:18;394:26:7;1361:177:21;561:95:9;;;;;;;;;;-1:-1:-1;561:95:9;;;;;:::i;:::-;;:::i;949:41:5:-;;;;;;;;;;-1:-1:-1;949:41:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2285:14:21;;2278:22;2260:41;;2248:2;2233:18;949:41:5;2120:187:21;1091:143:8;;;;;;;;;;-1:-1:-1;1091:143:8;;;;;:::i;:::-;;:::i;3177:599:5:-;;;;;;:::i;:::-;;:::i;563:64:11:-;;;;;;;;;;;;;:::i;1245:25:6:-;;;;;;;;;;-1:-1:-1;1245:25:6;;;;-1:-1:-1;;;;;1245:25:6;;;;;;-1:-1:-1;;;;;3482:55:21;;;3464:74;;3452:2;3437:18;1245:25:6;3318:226:21;633:102:11;;;;;;;;;;-1:-1:-1;633:102:11;;;;;:::i;:::-;-1:-1:-1;;;;;712:16:11;689:4;712:16;;;:7;:16;;;;;;;;;633:102;655:355:12;;;;;;;;;;-1:-1:-1;655:355:12;;;;;:::i;:::-;;:::i;7422:138:5:-;;;;;;;;;;-1:-1:-1;7422:138:5;;;;;:::i;:::-;;:::i;345:50:8:-;;;;;;;;;;-1:-1:-1;345:50:8;;;;;:::i;:::-;;;;;;;;;;;;;;506:143:12;;;;;;;;;;-1:-1:-1;506:143:12;;;;;:::i;:::-;;:::i;2055:325:6:-;;;;;;;;;;-1:-1:-1;2055:325:6;;;;;:::i;:::-;;:::i;143:26:12:-;;;;;;;;;;;;;;;;1098:84:13;;;;;;;;;;-1:-1:-1;1168:7:13;;;;1098:84;;186:47:12;;;;;;;;;;-1:-1:-1;186:47:12;;;;;:::i;:::-;;;;;;;;;;;;;;1075:42:5;;;;;;;;;;-1:-1:-1;1075:42:5;;;;;:::i;:::-;;;;;;;;;;;;;;542:24:7;;;;;;;;;;;;;;;;1197:409;;;;;;;;;;-1:-1:-1;1197:409:7;;;;;:::i;:::-;;:::i;836:95:11:-;;;;;;;;;;-1:-1:-1;836:95:11;;;;;:::i;:::-;;:::i;937:75::-;;;;;;;;;;;;;:::i;2511:431:6:-;;;;;;:::i;:::-;;:::i;200:39:11:-;;;;;;;;;;-1:-1:-1;200:39:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;741:89;;;;;;;;;;-1:-1:-1;741:89:11;;;;;:::i;:::-;;:::i;497:60::-;;;;;;;;;;;;;:::i;7069:347:5:-;;;;;;;;;;-1:-1:-1;7069:347:5;;;;;:::i;:::-;;:::i;642:20:6:-;;;;;;;;;;-1:-1:-1;642:20:6;;;;;;;;;;;6223:18:21;6211:31;;;6193:50;;6181:2;6166:18;642:20:6;6049:200:21;1479:85:10;;;;;;;;;;-1:-1:-1;1525:7:10;1551:6;-1:-1:-1;;;;;1551:6:10;1479:85;;572:27:7;;;;;;;;;;;;;;;;4607:217:6;;;;;;;;;;-1:-1:-1;4607:217:6;;;;;:::i;:::-;;:::i;5805:86::-;;;;;;;;;;-1:-1:-1;5805:86:6;;;;;:::i;:::-;;:::i;3372:1229::-;;;;;;;;;;-1:-1:-1;3372:1229:6;;;;;:::i;:::-;;:::i;2009:536:5:-;;;;;;;;;;-1:-1:-1;2009:536:5;;;;;:::i;:::-;;:::i;2942:247:7:-;;;;;;;;;;-1:-1:-1;2942:247:7;;;;;:::i;:::-;;:::i;280:59:8:-;;;;;;;;;;-1:-1:-1;280:59:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;280:59:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;8675:15:21;;;8657:34;;8727:15;;;;8722:2;8707:18;;8700:43;8759:18;;;8752:34;8817:2;8802:18;;8795:34;8583:3;8568:19;280:59:8;8365:470:21;401:26:8;;;;;;;;;;;;;;;;1349:45:6;;;;;;;;;;;;;;;;255:50:12;;;;;;;;;;-1:-1:-1;255:50:12;;;;;:::i;:::-;;;;;;;;;;;;;;1956:886:7;;;;;;;;;;-1:-1:-1;1956:886:7;;;;;:::i;:::-;;:::i;720:41:6:-;;;;;;;;;;-1:-1:-1;720:41:6;;;;;:::i;:::-;;;;;;;;;;;;;;5151:1559:5;;;;;;;;;;-1:-1:-1;5151:1559:5;;;;;:::i;:::-;;:::i;5968:125:6:-;;;;;;;;;;-1:-1:-1;5968:125:6;;;;;:::i;:::-;;:::i;367:21:7:-;;;;;;;;;;;;;;;;769:79:9;;;;;;;;;;;;;:::i;899:41:6:-;;;;;;;;;;-1:-1:-1;899:41:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;136::9;;;;;;;;;;-1:-1:-1;136:41:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;447:108;;;;;;;;;;-1:-1:-1;447:108:9;;;;;:::i;:::-;-1:-1:-1;;;;;529:19:9;506:4;529:19;;;:9;:19;;;;;;;;;447:108;4830:344:6;;;;;;;;;;-1:-1:-1;4830:344:6;;;;;:::i;:::-;;:::i;662:101:9:-;;;;;;;;;;-1:-1:-1;662:101:9;;;;;:::i;:::-;;:::i;3352:182:7:-;;;;;;;;;;-1:-1:-1;3352:182:7;;;;;:::i;:::-;;:::i;1916:189:10:-;;;;;;;;;;-1:-1:-1;1916:189:10;;;;;:::i;:::-;;:::i;327:51:12:-;;;;;;;;;;-1:-1:-1;327:51:12;;;;;:::i;:::-;;;;;;;;;;;;;;996:42:5;;;;;;;;;;-1:-1:-1;996:42:5;;;;;:::i;:::-;;;;;;;;;;;;;;6716:347;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;;;;;;;;;6833:33:5;;::::1;6825:61;;;::::0;-1:-1:-1;;;6825:61:5;;11347:2:21;6825:61:5::1;::::0;::::1;11329:21:21::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:21;;;11398:45;11460:18;;6825:61:5::1;11145:339:21::0;6825:61:5::1;6901:9;6896:161;6916:18:::0;;::::1;6896:161;;;6977:8;;6986:1;6977:11;;;;;;;:::i;:::-;;;;;;;6955:7;:19;6963:7;;6971:1;6963:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6955:19:5::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;6955:19:5;:33;7007:39:::1;7022:7:::0;;7030:1;7022:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7034:8;;7043:1;7034:11;;;;;;;:::i;:::-;7007:39;::::0;;-1:-1:-1;;;;;11813:55:21;;;11795:74;;7034:11:5::1;::::0;;::::1;::::0;;;::::1;;11885:18:21::0;;;11878:34;-1:-1:-1;11768:18:21;7007:39:5::1;;;;;;;6936:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6896:161;;;;6716:347:::0;;;;:::o;703:382:8:-;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;831:36:8;;::::1;823:64;;;::::0;-1:-1:-1;;;823:64:8;;11347:2:21;823:64:8::1;::::0;::::1;11329:21:21::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:21;;;11398:45;11460:18;;823:64:8::1;11145:339:21::0;823:64:8::1;902:9;897:182;917:18:::0;;::::1;897:182;;;986:11;;998:1;986:14;;;;;;;:::i;:::-;;;;;;;956:15;:27;972:7;;980:1;972:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;956:27:8::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;956:27:8;:44;1019:49:::1;1041:7:::0;;1049:1;1041:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1053:11;;1065:1;1053:14;;;;;;;:::i;:::-;1019:49;::::0;;-1:-1:-1;;;;;11813:55:21;;;11795:74;;1053:14:8::1;::::0;;::::1;::::0;;;::::1;;11885:18:21::0;;;11878:34;-1:-1:-1;11768:18:21;1019:49:8::1;;;;;;;937:3:::0;::::1;::::0;::::1;:::i;:::-;;;;897:182;;3195:151:7::0;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;3284:12:7::1;::::0;3266:30:::1;::::0;:15:::1;:30;:::i;:::-;3254:9;:42:::0;;;3311:28:::1;::::0;1507:25:21;;;3311:28:7::1;::::0;1495:2:21;1480:18;3311:28:7::1;;;;;;;;3195:151::o:0;561:95:9:-;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;627:22:9::1;640:8;627:12;:22::i;:::-;561:95:::0;:::o;1091:143:8:-;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;1164:11:8::1;:21:::0;;;1200:27:::1;::::0;1507:25:21;;;1200:27:8::1;::::0;1495:2:21;1480:18;1200:27:8::1;;;;;;;;1091:143:::0;:::o;3177:599:5:-;1744:1:14;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:14;;12888:2:21;2317:63:14;;;12870:21:21;12927:2;12907:18;;;12900:30;12966:33;12946:18;;;12939:61;13017:18;;2317:63:14;12686:355:21;2317:63:14;1744:1;2455:7;:18;1168:7:13;;;;1411:9:::1;1403:38;;;::::0;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13::1;::::0;::::1;13230:21:21::0;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13::1;13046:340:21::0;1403:38:13::1;3410:7:5::2;3397:9;:20;3389:48;;;::::0;-1:-1:-1;;;3389:48:5;;13593:2:21;3389:48:5::2;::::0;::::2;13575:21:21::0;13632:2;13612:18;;;13605:30;-1:-1:-1;;;13651:18:21;;;13644:45;13706:18;;3389:48:5::2;13391:339:21::0;3389:48:5::2;3455:10;::::0;-1:-1:-1;;;;;3455:10:5::2;3447:56;;;::::0;-1:-1:-1;;;3447:56:5;;13937:2:21;3447:56:5::2;::::0;::::2;13919:21:21::0;13976:2;13956:18;;;13949:30;14015:21;13995:18;;;13988:49;14054:18;;3447:56:5::2;13735:343:21::0;3447:56:5::2;3551:10;::::0;3513:18:::2;::::0;3534:72:::2;::::0;3540:9;;-1:-1:-1;;;;;3551:10:5::2;3563:7:::0;3572:11;3585:6;3593:12;3534:5:::2;:72::i;:::-;3513:93;;3622:10;;;;;;;;;-1:-1:-1::0;;;;;3622:10:5::2;-1:-1:-1::0;;;;;3616:25:5::2;;3649:7;3616:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;3714:10:5::2;::::0;3674:95:::2;::::0;;14420:25:21;;;3691:10:5::2;14537:2:21::0;14522:18;;14515:43;-1:-1:-1;;;;;14594:15:21;;;14574:18;;;14567:43;;;;3714:10:5;::::2;14641:2:21::0;14626:18;;14619:43;14693:3;14678:19;;14671:35;;;14725:18;14780:15;;;14774:3;14759:19;;14752:44;14833:15;;14827:3;14812:19;;14805:44;14898:10;14886:23;;14880:3;14865:19;;14858:52;3674:95:5::2;::::0;-1:-1:-1;14407:3:21;14392:19;;-1:-1:-1;3674:95:5::2;::::0;-1:-1:-1;14083:833:21;3674:95:5::2;;;;;;;;-1:-1:-1::0;;1701:1:14;2628:7;:22;-1:-1:-1;;;;3177:599:5:o;563:64:11:-;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:11;;15123:2:21;420:53:11;;;15105:21:21;15162:2;15142:18;;;15135:30;15201:22;15181:18;;;15174:50;15241:18;;420:53:11;14921:344:21;420:53:11;610:10:::1;:8;:10::i;:::-;563:64::o:0;655:355:12:-;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;777:30:12;;::::1;769:58;;;::::0;-1:-1:-1;;;769:58:12;;11347:2:21;769:58:12::1;::::0;::::1;11329:21:21::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:21;;;11398:45;11460:18;;769:58:12::1;11145:339:21::0;769:58:12::1;842:9;837:167;857:18:::0;;::::1;837:167;;;926:5;;932:1;926:8;;;;;;;:::i;:::-;;;;;;;896:15;:27;912:7;;920:1;912:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;896:27:12::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;896:27:12;:38;953:40:::1;972:7:::0;;980:1;972:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;984:5;;990:1;984:8;;;;;;;:::i;:::-;953:40;::::0;;-1:-1:-1;;;;;11813:55:21;;;11795:74;;984:8:12::1;::::0;;::::1;::::0;;;::::1;;11885:18:21::0;;;11878:34;-1:-1:-1;11768:18:21;953:40:12::1;;;;;;;877:3:::0;::::1;::::0;::::1;:::i;:::-;;;;837:167;;7422:138:5::0;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;7513:18:5::1;:40:::0;;-1:-1:-1;;7513:40:5::1;;::::0;;;::::1;::::0;;;::::1;::::0;;7422:138::o;506:143:12:-;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;579:11:12::1;:21:::0;;;615:27:::1;::::0;1507:25:21;;;615:27:12::1;::::0;1495:2:21;1480:18;615:27:12::1;1361:177:21::0;2055:325:6;1744:1:14;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:14;;12888:2:21;2317:63:14;;;12870:21:21;12927:2;12907:18;;;12900:30;12966:33;12946:18;;;12939:61;13017:18;;2317:63:14;12686:355:21;2317:63:14;1744:1;2455:7;:18;1168:7:13;;;;1411:9:::1;1403:38;;;::::0;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13::1;::::0;::::1;13230:21:21::0;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13::1;13046:340:21::0;1403:38:13::1;-1:-1:-1::0;;;;;2174:14:6;::::2;;::::0;;;:6:::2;:14;::::0;;;;;2164:24;::::2;2156:53;;;::::0;-1:-1:-1;;;2156:53:6;;15472:2:21;2156:53:6::2;::::0;::::2;15454:21:21::0;15511:2;15491:18;;;15484:30;-1:-1:-1;;;15530:18:21;;;15523:46;15586:18;;2156:53:6::2;15270:340:21::0;2156:53:6::2;2219:6;:11:::0;;2229:1:::2;::::0;2219:6;::::2;::::0;:11:::2;::::0;2229:1;;2219:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2240:67;2272:10;2292:4;2299:7;2247:6;-1:-1:-1::0;;;;;2240:31:6::2;;;:67;;;;;;:::i;:::-;2337:6;::::0;2322:51:::2;::::0;;2337:6:::2;::::0;;::::2;16029:50:21::0;;2345:10:6::2;16171:2:21::0;16156:18;;16149:43;-1:-1:-1;;;;;16228:15:21;;16208:18;;;16201:43;16275:2;16260:18;;16253:34;;;2322:51:6;::::2;::::0;;;;16016:3:21;2322:51:6;;::::2;-1:-1:-1::0;;1701:1:14;2628:7;:22;2055:325:6:o;1197:409:7:-;1386:9;1425:8;;1435:7;;1408:35;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1398:46;;;;;;1386:58;;1472:1;1462:6;;:11;1454:48;;;;-1:-1:-1;;;1454:48:7;;17663:2:21;1454:48:7;;;17645:21:21;17702:2;17682:18;;;17675:30;17741:26;17721:18;;;17714:54;17785:18;;1454:48:7;17461:348:21;1454:48:7;1532:15;;;;;;;;;;8211:58:20;;;28287:66:21;8211:58:20;;;28275:79:21;28370:12;;;;28363:28;;;;8211:58:20;;;;;;;;;;28407:12:21;;8211:58:20;;8201:69;;;;;1512:87:7;;1574:5;;1581:8;;1591:7;;1512:19;:87::i;:::-;1376:230;1197:409;;;;;;;:::o;836:95:11:-;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;902:22:11::1;916:7;902:13;:22::i;937:75::-:0;980:25;994:10;980:13;:25::i;2511:431:6:-;1744:1:14;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:14;;12888:2:21;2317:63:14;;;12870:21:21;12927:2;12907:18;;;12900:30;12966:33;12946:18;;;12939:61;13017:18;;2317:63:14;12686:355:21;2317:63:14;1744:1;2455:7;:18;1168:7:13;;;;1411:9:::1;1403:38;;;::::0;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13::1;::::0;::::1;13230:21:21::0;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13::1;13046:340:21::0;1403:38:13::1;2631:7:6::2;2618:9;:20;2610:48;;;::::0;-1:-1:-1;;;2610:48:6;;13593:2:21;2610:48:6::2;::::0;::::2;13575:21:21::0;13632:2;13612:18;;;13605:30;-1:-1:-1;;;13651:18:21;;;13644:45;13706:18;;2610:48:6::2;13391:339:21::0;2610:48:6::2;2676:10;::::0;-1:-1:-1;;;;;2676:10:6::2;2668:56;;;::::0;-1:-1:-1;;;2668:56:6;;13937:2:21;2668:56:6::2;::::0;::::2;13919:21:21::0;13976:2;13956:18;;;13949:30;14015:21;13995:18;;;13988:49;14054:18;;2668:56:6::2;13735:343:21::0;2668:56:6::2;2759:10;::::0;-1:-1:-1;;;;;2759:10:6::2;2752:18;::::0;;;:6:::2;:18;::::0;;;;;2742:28;::::2;2734:57;;;::::0;-1:-1:-1;;;2734:57:6;;15472:2:21;2734:57:6::2;::::0;::::2;15454:21:21::0;15511:2;15491:18;;;15484:30;-1:-1:-1;;;15530:18:21;;;15523:46;15586:18;;2734:57:6::2;15270:340:21::0;2734:57:6::2;2801:6;:11:::0;;2811:1:::2;::::0;2801:6;::::2;::::0;:11:::2;::::0;2811:1;;2801:11:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2828:10;;;;;;;;;-1:-1:-1::0;;;;;2828:10:6::2;-1:-1:-1::0;;;;;2822:25:6::2;;2855:7;2822:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;2895:6:6::2;::::0;2915:10:::2;::::0;2880:55:::2;::::0;;2895:6:::2;::::0;;::::2;16029:50:21::0;;2903:10:6::2;16171:2:21::0;16156:18;;16149:43;-1:-1:-1;;;;;2915:10:6;;::::2;16208:18:21::0;;;16201:43;16275:2;16260:18;;16253:34;;;2880:55:6::2;::::0;-1:-1:-1;16016:3:21;16001:19;;-1:-1:-1;2880:55:6::2;::::0;-1:-1:-1;15800:493:21;2880:55:6::2;;;;;;;;-1:-1:-1::0;1701:1:14;2628:7;:22;2511:431:6:o;741:89:11:-;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;804:19:11::1;815:7;804:10;:19::i;497:60::-:0;437:10;689:4;712:16;;;:7;:16;;;;;;;;420:53;;;;-1:-1:-1;;;420:53:11;;15123:2:21;420:53:11;;;15105:21:21;15162:2;15142:18;;;15135:30;15201:22;15181:18;;;15174:50;15241:18;;420:53:11;14921:344:21;420:53:11;542:8:::1;:6;:8::i;7069:347:5:-:0;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;7186:33:5;;::::1;7178:61;;;::::0;-1:-1:-1;;;7178:61:5;;11347:2:21;7178:61:5::1;::::0;::::1;11329:21:21::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:21;;;11398:45;11460:18;;7178:61:5::1;11145:339:21::0;7178:61:5::1;7254:9;7249:161;7269:18:::0;;::::1;7249:161;;;7330:8;;7339:1;7330:11;;;;;;;:::i;:::-;;;;;;;7308:7;:19;7316:7;;7324:1;7316:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7308:19:5::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7308:19:5;:33;7360:39:::1;7375:7:::0;;7383:1;7375:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7387:8;;7396:1;7387:11;;;;;;;:::i;:::-;7360:39;::::0;;-1:-1:-1;;;;;11813:55:21;;;11795:74;;7387:11:5::1;::::0;;::::1;::::0;;;::::1;;11885:18:21::0;;;11878:34;-1:-1:-1;11768:18:21;7360:39:5::1;;;;;;;7289:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7249:161;;4607:217:6::0;1168:7:13;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13;;;13230:21:21;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13;13046:340:21;1403:38:13;4684:31:6::1;4718:27;4742:2;4718:23;:27::i;:::-;4684:61;;4755:62;4766:8;:17;;;4785:8;:14;;;4801:8;:15;;;4755:10;:62::i;:::-;4674:150;4607:217:::0;:::o;5805:86::-;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;5866:10:6::1;:18:::0;;-1:-1:-1;;;;;;5866:18:6::1;-1:-1:-1::0;;;;;5866:18:6;;;::::1;::::0;;;::::1;::::0;;5805:86::o;3372:1229::-;1168:7:13;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13;;;13230:21:21;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13;13046:340:21;1403:38:13;3565:14:6::1;3609:13;3632:4;3592:61;;;;;;;;18072:19:21::0;;;18129:2;18125:15;-1:-1:-1;;18121:53:21;18116:2;18107:12;;18100:75;18205:13;18200:2;18191:12;;18184:35;18244:2;18235:12;;17814:439;3592:61:6::1;;;;;;;;;;;;;3582:72;;;;;;3565:89;;3664:70;3692:6;3700;;3675:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3709:5;;3716:8;;3726:7;;3664:10;:70::i;:::-;3778:31;3812:29;3834:6;;3812:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3812:21:6::1;::::0;-1:-1:-1;;;3812:29:6:i:1;:::-;3778:63;;3894:12;3949:5;:13;;;3964:5;:12;;;3978:5;:14;;;3994:5;:11;;;4007:5;:12;;;3932:88;;;;;;;;;;;18950:3:21::0;18946:16;;;-1:-1:-1;;;;;;18942:25:21;;;18930:38;;19001:16;;;;18997:25;;;18993:1;18984:11;;18977:46;19111:2;19107:15;;;-1:-1:-1;;19103:24:21;;;19098:2;19089:12;;19082:46;19162:15;;19158:24;19153:2;19144:12;;19137:46;19208:2;19199:12;;19192:28;19245:2;19236:12;;18608:646;3932:88:6::1;;::::0;;-1:-1:-1;;3932:88:6;;::::1;::::0;;;;;;3909:121;;3932:88:::1;3909:121:::0;;::::1;::::0;4048:15:::1;::::0;;;:9:::1;:15:::0;;;;;;3909:121;;-1:-1:-1;4048:15:6::1;;:24;4040:63;;;::::0;-1:-1:-1;;;4040:63:6;;19461:2:21;4040:63:6::1;::::0;::::1;19443:21:21::0;19500:2;19480:18;;;19473:30;19539:28;19519:18;;;19512:56;19585:18;;4040:63:6::1;19259:350:21::0;4040:63:6::1;4113:15;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;4113:22:6::1;4131:4;4113:22;::::0;;4159:11:::1;::::0;::::1;::::0;4172:12:::1;::::0;::::1;::::0;4145:40:::1;::::0;4159:11;4145:13:::1;:40::i;:::-;4236:11;::::0;::::1;::::0;-1:-1:-1;;;;;4220:28:6::1;4195:22;4220:28:::0;;;:15:::1;:28;::::0;;;;;4262:18;;;;;:51:::1;;;4299:14;4284:5;:12;;;:29;4262:51;4258:234;;;4329:68;4349:4;4355:5;:14;;;4371:5;:11;;;4384:5;:12;;;4329:19;:68::i;:::-;4258:234;;;4428:53;4439:5;:14;;;4455:5;:11;;;4468:5;:12;;;4428:10;:53::i;:::-;4506:88;4519:4;4525:5;:12;;;4539:5;:14;;;4555:5;:11;;;4568:5;:12;;;4582:5;:11;;;4506:88;;;;;;;;;;19899:25:21::0;;;19972:18;19960:31;;;;19955:2;19940:18;;19933:59;-1:-1:-1;;;;;20089:15:21;;;20084:2;20069:18;;20062:43;20141:15;;20136:2;20121:18;;20114:43;20188:3;20173:19;;20166:35;20232:3;20217:19;;20210:35;19886:3;19871:19;;19614:637;4506:88:6::1;;;;;;;;3555:1046;;;;3372:1229:::0;;;;;;;;:::o;2009:536:5:-;1744:1:14;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:14;;12888:2:21;2317:63:14;;;12870:21:21;12927:2;12907:18;;;12900:30;12966:33;12946:18;;;12939:61;13017:18;;2317:63:14;12686:355:21;2317:63:14;1744:1;2455:7;:18;1168:7:13;;;;1411:9:::1;1403:38;;;::::0;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13::1;::::0;::::1;13230:21:21::0;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13::1;13046:340:21::0;1403:38:13::1;2266:18:5::2;2287:68;2293:9;2304:6;2312:7;2321:11;2334:6;2342:12;2287:5;:68::i;:::-;2266:89:::0;-1:-1:-1;2365:67:5::2;-1:-1:-1::0;;;;;2365:31:5;::::2;2397:10;2417:4;2424:7:::0;2365:31:::2;:67::i;:::-;2447:91;::::0;;14420:25:21;;;2464:10:5::2;14537:2:21::0;14522:18;;14515:43;-1:-1:-1;;;;;14594:15:21;;;14574:18;;;14567:43;14646:15;;14641:2;14626:18;;14619:43;14693:3;14678:19;;14671:35;;;14725:18;14780:15;;;14774:3;14759:19;;14752:44;14833:15;;14827:3;14812:19;;14805:44;14898:10;14886:23;;14880:3;14865:19;;14858:52;2447:91:5;;::::2;::::0;;;;14407:3:21;2447:91:5;;::::2;-1:-1:-1::0;;1701:1:14;2628:7;:22;-1:-1:-1;;;;;2009:536:5:o;2942:247:7:-;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;3076:9:7::1;;3058:15;:27;3050:60;;;::::0;-1:-1:-1;;;3050:60:7;;20458:2:21;3050:60:7::1;::::0;::::1;20440:21:21::0;20497:2;20477:18;;;20470:30;20536:22;20516:18;;;20509:50;20576:18;;3050:60:7::1;20256:344:21::0;3050:60:7::1;-1:-1:-1::0;;3120:9:7::1;:19:::0;3149:33:::1;3164:8:::0;;3174:7;;3149:14:::1;:33::i;:::-;2942:247:::0;;;;:::o;1956:886::-;2315:11;;2300:12;:26;2292:69;;;;-1:-1:-1;;;2292:69:7;;20807:2:21;2292:69:7;;;20789:21:21;20846:2;20826:18;;;20819:30;20885:32;20865:18;;;20858:60;20935:18;;2292:69:7;20605:354:21;2292:69:7;2480:22;:15;2498:4;2480:22;:::i;:::-;2465:12;:37;2457:75;;;;-1:-1:-1;;;2457:75:7;;21166:2:21;2457:75:7;;;21148:21:21;21205:2;21185:18;;;21178:30;21244:27;21224:18;;;21217:55;21289:18;;2457:75:7;20964:349:21;2457:75:7;2542:14;2586:13;2609:4;2569:63;;;;;;;;21576:19:21;;;21633:2;21629:15;-1:-1:-1;;21625:53:21;21620:2;21611:12;;21604:75;21709:15;21704:2;21695:12;;21688:37;21750:2;21741:12;;21318:441;2569:63:7;;;;;;;;;;;;;2559:74;;;;;;2542:91;;2643:107;2671:6;2679:12;2693:11;;2706:10;;2654:63;;;;;;;;;;;;;:::i;2643:107::-;2760:39;2775:11;;2788:10;;2760:14;:39::i;:::-;-1:-1:-1;;;2809:11:7;:26;;;;-1:-1:-1;;;;;;;;1956:886:7:o;5151:1559:5:-;1168:7:13;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13;;;13230:21:21;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13;13046:340:21;1403:38:13;5348:14:5::1;5392:13;5415:4;5375:55;;;;;;;;22560:19:21::0;;;22617:2;22613:15;-1:-1:-1;;22609:53:21;22604:2;22595:12;;22588:75;22693:7;22688:2;22679:12;;22672:29;22726:2;22717:12;;22302:433;5375:55:5::1;;;;;;;;;;;;;5365:66;;;;;;5348:83;;5441:77;5469:6;5477:13;;5452:39;;;;;;;;;;:::i;5441:77::-;5528:29;5560:32;5578:13;;5560:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5560:17:5::1;::::0;-1:-1:-1;;;5560:32:5:i:1;:::-;5734:14:::0;;5766:16:::1;::::0;;::::1;::::0;5800:13:::1;::::0;;::::1;::::0;5831:14:::1;::::0;;::::1;::::0;5863:18:::1;::::0;::::1;::::0;5899::::1;::::0;::::1;::::0;5935:21:::1;::::0;;::::1;::::0;5700:270;;23099:15:21;;;-1:-1:-1;;23095:24:21;;;5700:270:5;;::::1;23083:37:21::0;23154:15;;;23150:24;;23136:12;;;23129:46;23209:15;;;;23205:24;;;23191:12;;;23184:46;23246:12;;;23239:28;;;;23386:16;;-1:-1:-1;;;;;;23382:25:21;;;23368:12;;;23361:47;23443:16;;;23439:25;;;23424:13;;;23417:48;23481:13;;;;23474:29;;;;5700:270:5;;;;;;;;;;23519:13:21;;;;5700:270:5;;5677:303;;;;::::1;::::0;-1:-1:-1;5998:21:5;;;:9:::1;:21:::0;;;;;;;5734:14;;-1:-1:-1;5677:303:5;5998:21:::1;;:30;5990:58;;;::::0;-1:-1:-1;;;5990:58:5;;23745:2:21;5990:58:5::1;::::0;::::1;23727:21:21::0;23784:2;23764:18;;;23757:30;-1:-1:-1;;;23803:18:21;;;23796:45;23858:18;;5990:58:5::1;23543:339:21::0;5990:58:5::1;6058:21;::::0;;;:9:::1;:21;::::0;;;;;;:28;;-1:-1:-1;;6058:28:5::1;6082:4;6058:28;::::0;;6110:13;::::1;::::0;6125:14:::1;::::0;::::1;::::0;6096:44:::1;::::0;6110:13;6096::::1;:44::i;:::-;6191:13;::::0;;::::1;::::0;-1:-1:-1;;;;;6175:30:5::1;6150:22;6175:30:::0;;;:15:::1;:30;::::0;;;6219:18;;;;;:53:::1;;;6258:14;6241:7;:14;;;:31;6219:53;6215:254;;;6288:80;6308:10;6320:7;:16;;;6338:7;:13;;;6353:7;:14;;;6288:19;:80::i;:::-;6215:254;;;6399:59;6410:7;:16;;;6428:7;:13;;;6443:7;:14;;;6399:10;:59::i;:::-;6484:219;6503:10;6527:7;:14;;;6555:7;:16;;;6585:7;:13;;;6612:7;:14;;;6640:7;:18;;;6672:7;:21;;;6484:219;;;;;;;;;;;24200:25:21::0;;;-1:-1:-1;;;;;24322:15:21;;;24317:2;24302:18;;24295:43;24374:15;;;24369:2;24354:18;;24347:43;24426:15;;;;24421:2;24406:18;;24399:43;24473:3;24458:19;;24451:35;;;;24535:18;24523:31;;;;24517:3;24502:19;;24495:60;24586:3;24571:19;;24564:35;24187:3;24172:19;;23887:718;5968:125:6;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;6053:22:6::1;:33:::0;5968:125::o;769:79:9:-;814:27;830:10;814:15;:27::i;4830:344:6:-;324:10:9;506:4;529:19;;;:9;:19;;;;;;;;305:57;;;;-1:-1:-1;;;305:57:9;;10996:2:21;305:57:9;;;10978:21:21;11035:2;11015:18;;;11008:30;-1:-1:-1;;;11054:18:21;;;11047:52;11116:18;;305:57:9;10794:346:21;305:57:9;4946:33:6;;::::1;4938:61;;;::::0;-1:-1:-1;;;4938:61:6;;11347:2:21;4938:61:6::1;::::0;::::1;11329:21:21::0;11386:2;11366:18;;;11359:30;-1:-1:-1;;;11405:18:21;;;11398:45;11460:18;;4938:61:6::1;11145:339:21::0;4938:61:6::1;5014:9;5009:159;5029:18:::0;;::::1;5009:159;;;5089:8;;5098:1;5089:11;;;;;;;:::i;:::-;;;;;;;5068:6;:18;5075:7;;5083:1;5075:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5068:18:6::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5068:18:6;:32;5119:38:::1;5133:7:::0;;5141:1;5133:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5145:8;;5154:1;5145:11;;;;;;;:::i;:::-;5119:38;::::0;;-1:-1:-1;;;;;11813:55:21;;;11795:74;;5145:11:6::1;::::0;;::::1;::::0;;;::::1;;11885:18:21::0;;;11878:34;-1:-1:-1;11768:18:21;5119:38:6::1;;;;;;;5049:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5009:159;;662:101:9::0;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;731:25:9::1;747:8;731:15;:25::i;3352:182:7:-:0;1702:10:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;3444:12:7::1;;3435:6;:21;3427:69;;;::::0;-1:-1:-1;;;3427:69:7;;24812:2:21;3427:69:7::1;::::0;::::1;24794:21:21::0;24851:2;24831:18;;;24824:30;24890:34;24870:18;;;24863:62;-1:-1:-1;;;24941:18:21;;;24934:33;24984:19;;3427:69:7::1;24610:399:21::0;3427:69:7::1;3506:12;:21:::0;3352:182::o;1916:189:10:-;1702:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:10;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:10;;1683:66;;;;-1:-1:-1;;;1683:66:10;;12397:2:21;1683:66:10;;;12379:21:21;;;12416:18;;;12409:30;-1:-1:-1;;;;;;;;;;;12455:18:21;;;12448:62;12527:18;;1683:66:10;12195:356:21;1683:66:10;-1:-1:-1;;;;;2004:22:10;::::1;1996:73;;;::::0;-1:-1:-1;;;1996:73:10;;25216:2:21;1996:73:10::1;::::0;::::1;25198:21:21::0;25255:2;25235:18;;;25228:30;25294:34;25274:18;;;25267:62;25365:8;25345:18;;;25338:36;25391:19;;1996:73:10::1;25014:402:21::0;1996:73:10::1;2079:19;2089:8;2079:9;:19::i;854:200:9:-:0;-1:-1:-1;;;;;529:19:9;;506:4;529:19;;;:9;:19;;;;;;;;920:21;912:61;;;;-1:-1:-1;;;912:61:9;;25623:2:21;912:61:9;;;25605:21:21;25662:2;25642:18;;;25635:30;25701:29;25681:18;;;25674:57;25748:18;;912:61:9;25421:351:21;912:61:9;-1:-1:-1;;;;;983:19:9;;;;;;:9;:19;;;;;;;;;:26;;-1:-1:-1;;983:26:9;1005:4;983:26;;;1024:23;;3464:74:21;;;1024:23:9;;3437:18:21;1024:23:9;3318:226:21;3782:890:5;-1:-1:-1;;;;;4013:15:5;;3976:7;4013:15;;;:7;:15;;;;;;4003:25;;3995:54;;;;-1:-1:-1;;;3995:54:5;;15472:2:21;3995:54:5;;;15454:21:21;15511:2;15491:18;;;15484:30;-1:-1:-1;;;15530:18:21;;;15523:46;15586:18;;3995:54:5;15270:340:21;3995:54:5;-1:-1:-1;;;;;4067:15:5;;;;;;:7;:15;;;;;;:20;;:50;;-1:-1:-1;;;;;;4102:15:5;;;;;;:7;:15;;;;;;4091:26;;;4067:50;4059:79;;;;-1:-1:-1;;;4059:79:5;;25979:2:21;4059:79:5;;;25961:21:21;26018:2;25998:18;;;25991:30;26057:18;26037;;;26030:46;26093:18;;4059:79:5;25777:340:21;4059:79:5;4171:18;;;;;;4156:33;;;;4148:68;;;;-1:-1:-1;;;4148:68:5;;26324:2:21;4148:68:5;;;26306:21:21;26363:2;26343:18;;;26336:30;26402:24;26382:18;;;26375:52;26444:18;;4148:68:5;26122:346:21;4148:68:5;4422:100;;-1:-1:-1;;4439:10:5;26834:2:21;26830:15;;;26826:24;;4422:100:5;;;26814:37:21;26885:15;;;26881:24;;26867:12;;;26860:46;26940:15;;;26936:24;26922:12;;;26915:46;26977:12;;;26970:28;;;-1:-1:-1;;;;;;27121:3:21;27117:16;;;27113:25;;27099:12;;;27092:47;27174:16;;;27170:25;;27155:13;;;27148:48;4507:13:5;27231:16:21;;27227:25;27212:13;;;27205:48;4226:18:5;;27269:13:21;;4422:100:5;;;-1:-1:-1;;4422:100:5;;;;;;;;;4247:285;;4422:100;4247:285;;;;4550:21;;;;:9;:21;;;;;;4247:285;;-1:-1:-1;4550:21:5;;:30;4542:58;;;;-1:-1:-1;;;4542:58:5;;23745:2:21;4542:58:5;;;23727:21:21;23784:2;23764:18;;;23757:30;-1:-1:-1;;;23803:18:21;;;23796:45;23858:18;;4542:58:5;23543:339:21;4542:58:5;4610:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;4610:28:5;4634:4;4610:28;;;4620:10;-1:-1:-1;3782:890:5;;;;;;;;:::o;2110:117:13:-;1168:7;;;;1669:41;;;;-1:-1:-1;;;1669:41:13;;27495:2:21;1669:41:13;;;27477:21:21;27534:2;27514:18;;;27507:30;27573:22;27553:18;;;27546:50;27613:18;;1669:41:13;27293:344:21;1669:41:13;2168:7:::1;:15:::0;;-1:-1:-1;;2168:15:13::1;::::0;;2198:22:::1;719:10:18::0;2207:12:13::1;2198:22;::::0;-1:-1:-1;;;;;3482:55:21;;;3464:74;;3452:2;3437:18;2198:22:13::1;3318:226:21::0;912:241:16;1077:68;;-1:-1:-1;;;;;27923:15:21;;;1077:68:16;;;27905:34:21;27975:15;;27955:18;;;27948:43;28007:18;;;28000:34;;;1050:96:16;;1070:5;;-1:-1:-1;;;1100:27:16;27817:18:21;;1077:68:16;;;;-1:-1:-1;;1077:68:16;;;;;;;;;;;;;;;;;;;;;;;;;;;1050:19;:96::i;3609:1307:7:-;3803:33;;;3795:81;;;;-1:-1:-1;;;3795:81:7;;28632:2:21;3795:81:7;;;28614:21:21;28671:2;28651:18;;;28644:30;28710:34;28690:18;;;28683:62;-1:-1:-1;;;28761:18:21;;;28754:33;28804:19;;3795:81:7;28430:399:21;3795:81:7;3886:18;;3941:95;3961:19;;;3941:95;;;4015:7;;4023:1;4015:10;;;;;;;:::i;:::-;;;;;;;4001:24;;;;;:::i;:::-;;-1:-1:-1;3982:3:7;;;;:::i;:::-;;;;3941:95;;;-1:-1:-1;4045:14:7;4081:1;4063:14;:10;4076:1;4063:14;:::i;:::-;4062:20;;;;:::i;:::-;:24;;4085:1;4062:24;:::i;:::-;4045:41;-1:-1:-1;4097:19:7;;;;4228:644;4248:16;;;4228:644;;;4285:14;4302:23;4316:5;;4322:1;4316:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4302:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:13;;:23;;;;:::i;:::-;4285:40;;4356:4;-1:-1:-1;;;;;4347:13:7;:6;-1:-1:-1;;;;;4347:13:7;;4339:56;;;;-1:-1:-1;;;4339:56:7;;29957:2:21;4339:56:7;;;29939:21:21;29996:2;29976:18;;;29969:30;30035:32;30015:18;;;30008:60;30085:18;;4339:56:7;29755:354:21;4339:56:7;4416:6;4409:13;;4487:146;4503:8;;4512:5;4503:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4494:24:7;:6;-1:-1:-1;;;;;4494:24:7;;4487:146;;;4538:10;4547:1;4538:10;;:::i;:::-;;-1:-1:-1;4574:23:7;;;4566:52;;;;-1:-1:-1;;;4566:52:7;;30316:2:21;4566:52:7;;;30298:21:21;30355:2;30335:18;;;30328:30;30394:18;30374;;;30367:46;30430:18;;4566:52:7;30114:340:21;4566:52:7;4487:146;;;4660:8;;4669:5;4660:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4650:25:7;:6;-1:-1:-1;;;;;4650:25:7;;4646:93;;4710:7;;4718:5;4710:14;;;;;;;:::i;:::-;;;;;;;4695:29;;;;;:::i;:::-;;;4646:93;4771:6;4756:11;:21;4752:110;;4841:7;;;;;;;;;4752:110;-1:-1:-1;4266:3:7;;;;:::i;:::-;;;;4228:644;;;-1:-1:-1;4881:28:7;;-1:-1:-1;;;4881:28:7;;30661:2:21;4881:28:7;;;30643:21:21;30700:2;30680:18;;;30673:30;30739:20;30719:18;;;30712:48;30777:18;;4881:28:7;30459:342:21;3609:1307:7;;;;;;;;:::o;1210:187:11:-;-1:-1:-1;;;;;712:16:11;;689:4;712:16;;;:7;:16;;;;;;;;1268:51;;;;-1:-1:-1;;;1268:51:11;;31008:2:21;1268:51:11;;;30990:21:21;31047:2;31027:18;;;31020:30;31086:23;31066:18;;;31059:51;31127:18;;1268:51:11;30806:345:21;1268:51:11;-1:-1:-1;;;;;1329:16:11;;1348:5;1329:16;;;:7;:16;;;;;;;;;:24;;-1:-1:-1;;1329:24:11;;;1368:22;;3464:74:21;;;1368:22:11;;3437:18:21;1368:22:11;3318:226:21;1018:186:11;-1:-1:-1;;;;;712:16:11;;689:4;712:16;;;:7;:16;;;;;;;;1081:18;1073:56;;;;-1:-1:-1;;;1073:56:11;;31358:2:21;1073:56:11;;;31340:21:21;31397:2;31377:18;;;31370:30;31436:27;31416:18;;;31409:55;31481:18;;1073:56:11;31156:349:21;1073:56:11;-1:-1:-1;;;;;1139:16:11;;;;;;:7;:16;;;;;;;;;:23;;-1:-1:-1;;1139:23:11;1158:4;1139:23;;;1177:20;;3464:74:21;;;1177:20:11;;3437:18:21;1177:20:11;3318:226:21;1863:115:13;1168:7;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:13;;13248:2:21;1403:38:13;;;13230:21:21;13287:2;13267:18;;;13260:30;-1:-1:-1;;;13306:18:21;;;13299:46;13362:18;;1403:38:13;13046:340:21;1403:38:13;1922:7:::1;:14:::0;;-1:-1:-1;;1922:14:13::1;1932:4;1922:14;::::0;;1951:20:::1;1958:12;719:10:18::0;;640:96;1756:487:8;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1853:31:8;1887:20;;;:16;:20;;;;;;;;;1853:54;;;;;;;;;-1:-1:-1;;;;;1853:54:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1917:61;;;;-1:-1:-1;;;1917:61:8;;31712:2:21;1917:61:8;;;31694:21:21;31751:2;31731:18;;;31724:30;31790:28;31770:18;;;31763:56;31836:18;;1917:61:8;31510:350:21;1917:61:8;2035:11;;2014:8;:18;;;:32;;;;:::i;:::-;1996:15;:50;1988:92;;;;-1:-1:-1;;;1988:92:8;;32067:2:21;1988:92:8;;;32049:21:21;32106:2;32086:18;;;32079:30;32145:31;32125:18;;;32118:59;32194:18;;1988:92:8;31865:353:21;1988:92:8;2097:20;;;;:16;:20;;;;;;;;2090:27;;-1:-1:-1;;;;;;2090:27:8;;;;;;;;;;;;;;;;;;;;;;;;;;;2160:17;;2179:14;;;;2195:15;;;;2132:79;;;;;;2114:2;;2160:17;;2179:14;;2195:15;32454:25:21;;;-1:-1:-1;;;;;32576:15:21;;;32571:2;32556:18;;32549:43;32628:15;;32623:2;32608:18;;32601:43;32675:2;32660:18;;32653:34;32441:3;32426:19;;32223:470;2132:79:8;;;;;;;;2228:8;1756:487;-1:-1:-1;;1756:487:8:o;5180:499:6:-;5315:10;;-1:-1:-1;;;;;5315:10:6;;;5305:20;;;;5301:372;;5404:10;;5398:35;;-1:-1:-1;;;5398:35:6;;;;;1507:25:21;;;-1:-1:-1;;;;;5404:10:6;;;;5398:26;;1480:18:21;;5398:35:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5499:22:6;;5463:63;;5448:9;;-1:-1:-1;;;;;;5463:14:6;;;-1:-1:-1;5485:7:6;;5448:9;5463:63;5448:9;5463:63;5485:7;5463:14;5499:22;5463:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5447:79;;;5548:4;5540:44;;;;-1:-1:-1;;;5540:44:6;;33110:2:21;5540:44:6;;;33092:21:21;33149:2;33129:18;;;33122:30;33188:29;33168:18;;;33161:57;33235:18;;5540:44:6;32908:351:21;5301:372:6;5615:47;-1:-1:-1;;;;;5615:27:6;;5643:9;5654:7;5615:27;:47::i;:::-;5180:499;;;:::o;536:981:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:11:2;;;-1:-1:-1;;;;731:780:4;742:5:2;;;;:12;732:7;;:22;731:780:4;;;781:12;:3;:10;:12::i;:::-;767:26;;-1:-1:-1;767:26:4;-1:-1:-1;885:3:4;892:1;885:8;881:591;;932:15;:3;:13;:15::i;:::-;913:35;;;;731:780;;881:591;973:3;980:1;973:8;969:503;;1019:15;:3;:13;:15::i;:::-;1001:34;;:8;;;:34;731:780;;969:503;1060:3;1067:1;1060:8;1056:416;;1101:27;1113:14;:3;:12;:14::i;:::-;1101:11;:27::i;:::-;-1:-1:-1;;;;;1088:40:4;:10;;;:40;731:780;;1056:416;1153:3;1160:1;1153:8;1149:323;;1191:27;1203:14;:3;:12;:14::i;1191:27::-;-1:-1:-1;;;;;1181:37:4;:7;;;:37;731:780;;1149:323;1243:3;1250:1;1243:8;1239:233;;1282:27;1294:14;:3;:12;:14::i;:::-;1282:11;:27::i;:::-;1271:8;;;:38;731:780;;1239:233;1334:3;1341:1;1334:8;1330:142;;1372:27;1384:14;:3;:12;:14::i;:::-;1372:11;:27::i;:::-;1362:7;;;:37;731:780;;1330:142;1438:19;:3;1452:4;1438:13;:19::i;:::-;731:780;;;623:894;;;536:981;;;:::o;1016:685:12:-;1095:11;;1110:1;1095:16;1091:53;;1016:685;;:::o;1091:53::-;-1:-1:-1;;;;;1167:23:12;;1153:11;1167:23;;;:15;:23;;;;;;;1204:8;;;1200:45;;1228:7;1016:685;;:::o;1200:45::-;-1:-1:-1;;;;;1271:20:12;;1254:14;1271:20;;;:12;:20;;;;;;1399:11;;1271:20;;1321:15;;1372:23;1399:11;1321:15;1372:23;:::i;:::-;1371:39;;;;:::i;:::-;-1:-1:-1;;;;;1424:24:12;;;;;;:16;:24;;;;;;1346:64;;-1:-1:-1;1424:41:12;-1:-1:-1;1420:136:12;;;1490:7;1481:16;;1420:136;;;1528:17;1538:7;1528:17;;:::i;:::-;;;1420:136;1583:3;1573:6;:13;;1565:44;;;;-1:-1:-1;;;1565:44:12;;33466:2:21;1565:44:12;;;33448:21:21;33505:2;33485:18;;;33478:30;33544:20;33524:18;;;33517:48;33582:18;;1565:44:12;33264:342:21;1565:44:12;-1:-1:-1;;;;;;1619:20:12;;;;;;;:12;:20;;;;;;;;:29;;;;1658:16;:24;;;:36;;;;-1:-1:-1;;1016:685:12:o;1240:458:8:-;1395:20;;;;:16;:20;;;;;:30;;;:35;1387:79;;;;-1:-1:-1;;;1387:79:8;;33813:2:21;1387:79:8;;;33795:21:21;33852:2;33832:18;;;33825:30;33891:33;33871:18;;;33864:61;33942:18;;1387:79:8;33611:355:21;1387:79:8;1499:153;;;;;;;;-1:-1:-1;;;;;1499:153:8;;;;;;;;;;;;;;;;;;;;;1626:15;1499:153;;;;;;-1:-1:-1;1476:20:8;;;:16;:20;;;;;;;:176;;;;;;;-1:-1:-1;;;;;;1476:176:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1667:24;;;;;1493:2;1507:25:21;;1495:2;1480:18;;1361:177;1667:24:8;;;;;;;;1240:458;;;;:::o;4922:512:7:-;5029:33;;;5021:81;;;;-1:-1:-1;;;5021:81:7;;28632:2:21;5021:81:7;;;28614:21:21;28671:2;28651:18;;;28644:30;28710:34;28690:18;;;28683:62;-1:-1:-1;;;28761:18:21;;;28754:33;28804:19;;5021:81:7;28430:399:21;5021:81:7;5112:12;5152:9;5147:168;5167:19;;;5147:168;;;5229:4;-1:-1:-1;;;;;5215:18:7;:8;;5224:1;5215:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5215:18:7;;5207:65;;;;-1:-1:-1;;;5207:65:7;;34173:2:21;5207:65:7;;;34155:21:21;34212:2;34192:18;;;34185:30;34251:34;34231:18;;;34224:62;-1:-1:-1;;;34302:18:21;;;34295:32;34344:19;;5207:65:7;33971:398:21;5207:65:7;5293:8;;5302:1;5293:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5286:18;-1:-1:-1;5188:3:7;;;;:::i;:::-;;;;5147:168;;;;5360:8;;5370:7;;5343:35;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5343:35:7;;;;;;;;;;5333:46;;5343:35;5333:46;;;;5324:6;:55;5394:33;;;;5409:8;;;;5419:7;;;;5394:33;:::i;:::-;;;;;;;;5011:423;4922:512;;;;:::o;551:1075:3:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:11:2;;;-1:-1:-1;;;;734:886:3;742:5:2;;;;:12;732:7;;:22;734:886:3;;;784:12;:3;:10;:12::i;:::-;770:26;;-1:-1:-1;770:26:3;-1:-1:-1;888:3:3;895:1;888:8;884:697;;927:27;939:14;:3;:12;:14::i;927:27::-;-1:-1:-1;;;;;916:38:3;;;734:886;;884:697;979:3;986:1;979:8;975:606;;1020:27;1032:14;:3;:12;:14::i;1020:27::-;-1:-1:-1;;;;;1007:40:3;:10;;;:40;734:886;;975:606;1072:3;1079:1;1072:8;1068:513;;1110:27;1122:14;:3;:12;:14::i;1110:27::-;-1:-1:-1;;;;;1100:37:3;:7;;;:37;734:886;;1068:513;1162:3;1169:1;1162:8;1158:423;;1201:27;1213:14;:3;:12;:14::i;1201:27::-;1190:8;;;:38;734:886;;1158:423;1253:3;1260:1;1253:8;1249:332;;1303:15;:3;:13;:15::i;:::-;1281:38;;:12;;;:38;734:886;;1249:332;1344:3;1351:1;1344:8;1340:241;;1394:15;:3;:13;:15::i;:::-;1372:38;;:12;;;:38;734:886;;1340:241;1435:3;1442:1;1435:8;1431:150;;1481:27;1493:14;:3;:12;:14::i;1481:27::-;1463:15;;;:45;734:886;;1431:150;1547:19;:3;1561:4;1547:13;:19::i;:::-;734:886;;1060:201:9;-1:-1:-1;;;;;529:19:9;;506:4;529:19;;;:9;:19;;;;;;;;1121:56;;;;-1:-1:-1;;;1121:56:9;;35641:2:21;1121:56:9;;;35623:21:21;35680:2;35660:18;;;35653:30;35719:25;35699:18;;;35692:53;35762:18;;1121:56:9;35439:347:21;1121:56:9;-1:-1:-1;;;;;1187:19:9;;1209:5;1187:19;;;:9;:19;;;;;;;;;:27;;-1:-1:-1;;1187:27:9;;;1229:25;;3464:74:21;;;1229:25:9;;3437:18:21;1229:25:9;3318:226:21;2111:169:10;2166:16;2185:6;;-1:-1:-1;;;;;2201:17:10;;;-1:-1:-1;;;;;;2201:17:10;;;;;;2233:40;;2185:6;;;;;;;2233:40;;2166:16;2233:40;2156:124;2111:169;:::o;3207:706:16:-;3626:23;3652:69;3680:4;3652:69;;;;;;;;;;;;;;;;;3660:5;-1:-1:-1;;;;;3652:27:16;;;:69;;;;;:::i;:::-;3735:17;;3626:95;;-1:-1:-1;3735:21:16;3731:176;;3830:10;3819:30;;;;;;;;;;;;:::i;:::-;3811:85;;;;-1:-1:-1;;;3811:85:16;;36275:2:21;3811:85:16;;;36257:21:21;36314:2;36294:18;;;36287:30;36353:34;36333:18;;;36326:62;36424:12;36404:18;;;36397:40;36454:19;;3811:85:16;36073:406:21;4308:227:20;4386:7;4406:17;4425:18;4447:27;4458:4;4464:9;4447:10;:27::i;:::-;4405:69;;;;4484:18;4496:5;4484:11;:18::i;:::-;-1:-1:-1;4519:9:20;-1:-1:-1;4308:227:20;;;;;:::o;701:205:16:-;840:58;;-1:-1:-1;;;;;11813:55:21;;840:58:16;;;11795:74:21;11885:18;;;11878:34;;;813:86:16;;833:5;;-1:-1:-1;;;863:23:16;11768:18:21;;840:58:16;11621:297:21;815:190:2;873:11;886:17;915:9;927:14;937:3;927:9;:14::i;:::-;915:26;-1:-1:-1;957:5:2;961:1;915:26;957:5;:::i;:::-;951:11;;992:1;996;992:5;983:15;;;;;;;;:::i;:::-;972:26;;905:100;815:190;;;:::o;1776:902::-;1960:5;;;;;2020:7;;2119:19;;;;;2113:26;1837:9;;;;2297:326;2321:2;2317:1;:6;2297:326;;;2376:12;;;;-1:-1:-1;2499:5:2;2381:1;2503;2499:5;:::i;:::-;2485:1;2489:4;2485:8;2484:21;;2479:26;;;;2523:1;2527:4;2523:8;2535:1;2523:13;2519:94;;2567:5;:1;2571;2567:5;:::i;:::-;2556:16;;:3;;:16;;;;;:::i;:::-;;;-1:-1:-1;1776:902:2;;;-1:-1:-1;;;;;1776:902:2:o;2519:94::-;2325:3;;;;:::i;:::-;;;;2297:326;;2736:679;2796:14;2822:11;2836:14;2846:3;2836:9;:14::i;:::-;2822:28;;2860:11;2884:3;2874;:7;;;:13;;;;:::i;:::-;2860:27;;2912:3;:5;;;:12;2905:3;:19;;2897:28;;;;;;2967:3;2957:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2957:14:2;-1:-1:-1;3001:5:2;;;;;3101:7;;2953:18;;-1:-1:-1;3001:5:2;3151:10;;;;3187:29;;;;2981:17;3235:151;3259:3;3255:1;:7;3235:151;;;3343:17;;;3337:24;3321:14;;;3314:48;3264:7;3269:2;3358:1;3264:7;:::i;:::-;;;3235:151;;;-1:-1:-1;;;3395:13:2;;-1:-1:-1;2736:679:2;;-1:-1:-1;2736:679:2:o;5122:107::-;5179:9;5204:18;5220:1;5204:15;:18::i;4797:319::-;4854:9;4895:2;4883:1;:8;:14;;4875:23;;;;;;4999:2;4996:1;4992:10;4986:17;4981:22;;5067:1;:8;5062:2;:13;;;;:::i;:::-;5057:19;;:1;:19;:::i;:::-;5051:26;;4797:319;-1:-1:-1;4797:319:2:o;5511:172::-;5568:9;5597:1;:8;5609:2;5597:14;5589:23;;;;;;-1:-1:-1;5663:2:2;5656:10;5650:17;;5511:172::o;4236:428::-;4325:15;4317:4;:23;;;;;;;;:::i;:::-;;4313:321;;4356:14;4366:3;4356:9;:14::i;4313:321::-;4399:20;4391:4;:28;;;;;;;;:::i;:::-;;4387:247;;4435:11;4449:14;4459:3;4449:9;:14::i;:::-;4435:28;;4488:3;4477;:7;;:14;;;;;;;:::i;:::-;;;-1:-1:-1;4553:5:2;;;;:12;4542:7;;:23;;4534:32;;;;;3861:223:17;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;;:::o;2243:1279:20:-;2324:7;2333:12;2554:9;:16;2574:2;2554:22;2550:966;;2843:4;2828:20;;2822:27;2892:4;2877:20;;2871:27;2949:4;2934:20;;2928:27;2592:9;2920:36;2990:25;3001:4;2920:36;2822:27;2871;2990:10;:25::i;:::-;2983:32;;;;;;;;;2550:966;3036:9;:16;3056:2;3036:22;3032:484;;3305:4;3290:20;;3284:27;3355:4;3340:20;;3334:27;3395:23;3406:4;3284:27;3334;3395:10;:23::i;:::-;3388:30;;;;;;;;3032:484;-1:-1:-1;3465:1:20;;-1:-1:-1;3469:35:20;3032:484;2243:1279;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;;;:::i;:::-;;612:561;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;;;:::i;:::-;;708:465;;766:34;;-1:-1:-1;;;766:34:20;;36951:2:21;766:34:20;;;36933:21:21;36990:2;36970:18;;;36963:30;37029:26;37009:18;;;37002:54;37073:18;;766:34:20;36749:348:21;708:465:20;830:35;821:5;:44;;;;;;;;:::i;:::-;;817:356;;881:41;;-1:-1:-1;;;881:41:20;;37304:2:21;881:41:20;;;37286:21:21;37343:2;37323:18;;;37316:30;37382:33;37362:18;;;37355:61;37433:18;;881:41:20;37102:355:21;817:356:20;952:30;943:5;:39;;;;;;;;:::i;:::-;;939:234;;998:44;;-1:-1:-1;;;998:44:20;;37664:2:21;998:44:20;;;37646:21:21;37703:2;37683:18;;;37676:30;37742:34;37722:18;;;37715:62;-1:-1:-1;;;37793:18:21;;;37786:32;37835:19;;998:44:20;37462:398:21;939:234:20;1072:30;1063:5;:39;;;;;;;;:::i;:::-;;1059:114;;1118:44;;-1:-1:-1;;;1118:44:20;;38067:2:21;1118:44:20;;;38049:21:21;38106:2;38086:18;;;38079:30;38145:34;38125:18;;;38118:62;-1:-1:-1;;;38196:18:21;;;38189:32;38238:19;;1118:44:20;37865:398:21;5235:270:2;5299:17;5336:1;:8;5348:2;5336:14;5328:23;;;;;;-1:-1:-1;5455:2:2;5448:10;5442:17;5461:27;5438:51;;;5235:270::o;4948:499:17:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:17;;38470:2:21;5137:81:17;;;38452:21:21;38509:2;38489:18;;;38482:30;38548:34;38528:18;;;38521:62;38619:8;38599:18;;;38592:36;38645:19;;5137:81:17;38268:402:21;5137:81:17;-1:-1:-1;;;;;1465:19:17;;;5228:60;;;;-1:-1:-1;;;5228:60:17;;38877:2:21;5228:60:17;;;38859:21:21;38916:2;38896:18;;;38889:30;38955:31;38935:18;;;38928:59;39004:18;;5228:60:17;38675:353:21;5228:60:17;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:17;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:17:o;5716:1603:20:-;5842:7;;6766:66;6753:79;;6749:161;;;-1:-1:-1;6864:1:20;;-1:-1:-1;6868:30:20;6848:51;;6749:161;6923:1;:7;;6928:2;6923:7;;:18;;;;;6934:1;:7;;6939:2;6934:7;;6923:18;6919:100;;;-1:-1:-1;6973:1:20;;-1:-1:-1;6977:30:20;6957:51;;6919:100;7130:24;;;7113:14;7130:24;;;;;;;;;39807:25:21;;;39880:4;39868:17;;39848:18;;;39841:45;;;;39902:18;;;39895:34;;;39945:18;;;39938:34;;;7130:24:20;;39779:19:21;;7130:24:20;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7130:24:20;;-1:-1:-1;;7130:24:20;;;-1:-1:-1;;;;;;;7168:20:20;;7164:101;;7220:1;7224:29;7204:50;;;;;;;7164:101;7283:6;-1:-1:-1;7291:20:20;;-1:-1:-1;5716:1603:20;;;;;;;;:::o;4789:336::-;4899:7;;4957:66;4944:80;;4899:7;5050:25;5066:3;5051:18;;;5073:2;5050:25;:::i;:::-;5034:42;;5093:25;5104:4;5110:1;5113;5116;5093:10;:25::i;:::-;5086:32;;;;;;4789:336;;;;;;:::o;7561:692:17:-;7707:12;7735:7;7731:516;;;-1:-1:-1;7765:10:17;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;-1:-1:-1;;;8202:20:17;;;;;;;;:::i;14:367:21:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:21;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;386:773;508:6;516;524;532;585:2;573:9;564:7;560:23;556:32;553:52;;;601:1;598;591:12;553:52;641:9;628:23;670:18;711:2;703:6;700:14;697:34;;;727:1;724;717:12;697:34;766:70;828:7;819:6;808:9;804:22;766:70;:::i;:::-;855:8;;-1:-1:-1;740:96:21;-1:-1:-1;943:2:21;928:18;;915:32;;-1:-1:-1;959:16:21;;;956:36;;;988:1;985;978:12;956:36;;1027:72;1091:7;1080:8;1069:9;1065:24;1027:72;:::i;:::-;386:773;;;;-1:-1:-1;1118:8:21;-1:-1:-1;;;;386:773:21:o;1543:196::-;1611:20;;-1:-1:-1;;;;;1660:54:21;;1650:65;;1640:93;;1729:1;1726;1719:12;1640:93;1543:196;;;:::o;1744:186::-;1803:6;1856:2;1844:9;1835:7;1831:23;1827:32;1824:52;;;1872:1;1869;1862:12;1824:52;1895:29;1914:9;1895:29;:::i;1935:180::-;1994:6;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;-1:-1:-1;2086:23:21;;1935:180;-1:-1:-1;1935:180:21:o;2497:171::-;2564:20;;2624:18;2613:30;;2603:41;;2593:69;;2658:1;2655;2648:12;2673:163;2740:20;;2800:10;2789:22;;2779:33;;2769:61;;2826:1;2823;2816:12;2841:472;2933:6;2941;2949;2957;2965;3018:3;3006:9;2997:7;2993:23;2989:33;2986:53;;;3035:1;3032;3025:12;2986:53;3058:29;3077:9;3058:29;:::i;:::-;3048:39;;3134:2;3123:9;3119:18;3106:32;3096:42;;3157:37;3190:2;3179:9;3175:18;3157:37;:::i;:::-;3147:47;;3213:37;3246:2;3235:9;3231:18;3213:37;:::i;:::-;3203:47;;3269:38;3302:3;3291:9;3287:19;3269:38;:::i;:::-;3259:48;;2841:472;;;;;;;;:::o;3549:184::-;3607:6;3660:2;3648:9;3639:7;3635:23;3631:32;3628:52;;;3676:1;3673;3666:12;3628:52;3699:28;3717:9;3699:28;:::i;3738:254::-;3806:6;3814;3867:2;3855:9;3846:7;3842:23;3838:32;3835:52;;;3883:1;3880;3873:12;3835:52;3906:29;3925:9;3906:29;:::i;:::-;3896:39;3982:2;3967:18;;;;3954:32;;-1:-1:-1;;;3738:254:21:o;3997:127::-;4058:10;4053:3;4049:20;4046:1;4039:31;4089:4;4086:1;4079:15;4113:4;4110:1;4103:15;4129:1915;4316:6;4324;4332;4340;4348;4356;4364;4417:3;4405:9;4396:7;4392:23;4388:33;4385:53;;;4434:1;4431;4424:12;4385:53;4474:9;4461:23;4503:18;4544:2;4536:6;4533:14;4530:34;;;4560:1;4557;4550:12;4530:34;4598:6;4587:9;4583:22;4573:32;;4643:7;4636:4;4632:2;4628:13;4624:27;4614:55;;4665:1;4662;4655:12;4614:55;4701:2;4688:16;4723:2;4719;4716:10;4713:36;;;4729:18;;:::i;:::-;4804:2;4798:9;4772:2;4858:13;;-1:-1:-1;;4854:22:21;;;4878:2;4850:31;4846:40;4834:53;;;4902:18;;;4922:22;;;4899:46;4896:72;;;4948:18;;:::i;:::-;4988:10;4984:2;4977:22;5023:2;5015:6;5008:18;5065:7;5058:4;5053:2;5049;5045:11;5041:22;5038:35;5035:55;;;5086:1;5083;5076:12;5035:55;5146:2;5139:4;5135:2;5131:13;5124:4;5116:6;5112:17;5099:50;5168:1;5158:11;;5213:2;5206:4;5201:2;5193:6;5189:15;5185:26;5178:38;5235:6;5225:16;;;;;5294:4;5283:9;5279:20;5266:34;5325:2;5315:8;5312:16;5309:38;;;5342:2;5338;5331:14;5309:38;5382:72;5446:7;5435:8;5424:9;5420:24;5382:72;:::i;:::-;5473:8;;-1:-1:-1;5356:98:21;-1:-1:-1;;5561:2:21;5546:18;;5533:32;5577:16;;;5574:38;;;5607:2;5603;5596:14;5574:38;5647:72;5711:7;5700:8;5689:9;5685:24;5647:72;:::i;:::-;5738:8;;-1:-1:-1;5621:98:21;-1:-1:-1;;5826:2:21;5811:18;;5798:32;5842:16;;;5839:38;;;5872:2;5868;5861:14;5839:38;5912:72;5976:7;5965:8;5954:9;5950:24;5912:72;:::i;:::-;4129:1915;;;;-1:-1:-1;4129:1915:21;;-1:-1:-1;4129:1915:21;;;;5886:98;;-1:-1:-1;;;;;4129:1915:21:o;6254:1554::-;6443:6;6451;6459;6467;6475;6483;6491;6499;6552:3;6540:9;6531:7;6527:23;6523:33;6520:53;;;6569:1;6566;6559:12;6520:53;6609:9;6596:23;6638:18;6679:2;6671:6;6668:14;6665:34;;;6695:1;6692;6685:12;6665:34;6733:6;6722:9;6718:22;6708:32;;6778:7;6771:4;6767:2;6763:13;6759:27;6749:55;;6800:1;6797;6790:12;6749:55;6840:2;6827:16;6866:2;6858:6;6855:14;6852:34;;;6882:1;6879;6872:12;6852:34;6929:7;6922:4;6913:6;6909:2;6905:15;6901:26;6898:39;6895:59;;;6950:1;6947;6940:12;6895:59;6981:4;6973:13;;;;-1:-1:-1;7005:6:21;-1:-1:-1;7049:20:21;;;7036:34;;7082:16;;;7079:36;;;7111:1;7108;7101:12;7079:36;7150:72;7214:7;7203:8;7192:9;7188:24;7150:72;:::i;:::-;7241:8;;-1:-1:-1;7124:98:21;-1:-1:-1;7329:2:21;7314:18;;7301:32;;-1:-1:-1;7345:16:21;;;7342:36;;;7374:1;7371;7364:12;7342:36;7413:72;7477:7;7466:8;7455:9;7451:24;7413:72;:::i;:::-;7504:8;;-1:-1:-1;7387:98:21;-1:-1:-1;7592:2:21;7577:18;;7564:32;;-1:-1:-1;7608:16:21;;;7605:36;;;7637:1;7634;7627:12;7605:36;;7676:72;7740:7;7729:8;7718:9;7714:24;7676:72;:::i;:::-;6254:1554;;;;-1:-1:-1;6254:1554:21;;-1:-1:-1;6254:1554:21;;;;;;7767:8;-1:-1:-1;;;6254:1554:21:o;7813:547::-;7914:6;7922;7930;7938;7946;7954;8007:3;7995:9;7986:7;7982:23;7978:33;7975:53;;;8024:1;8021;8014:12;7975:53;8047:29;8066:9;8047:29;:::i;:::-;8037:39;;8095:38;8129:2;8118:9;8114:18;8095:38;:::i;:::-;8085:48;;8180:2;8169:9;8165:18;8152:32;8142:42;;8203:37;8236:2;8225:9;8221:18;8203:37;:::i;:::-;8193:47;;8259:38;8292:3;8281:9;8277:19;8259:38;:::i;:::-;8249:48;;8316:38;8349:3;8338:9;8334:19;8316:38;:::i;:::-;8306:48;;7813:547;;;;;;;;:::o;8840:1767::-;9090:6;9098;9106;9114;9122;9130;9138;9146;9154;9162;9170:7;9224:3;9212:9;9203:7;9199:23;9195:33;9192:53;;;9241:1;9238;9231:12;9192:53;9277:9;9264:23;9254:33;;9306:18;9373:2;9367;9356:9;9352:18;9339:32;9336:40;9333:60;;;9389:1;9386;9379:12;9333:60;9428:96;9516:7;9509:2;9498:9;9494:18;9481:32;9470:9;9466:48;9428:96;:::i;:::-;9543:8;;-1:-1:-1;9570:8:21;-1:-1:-1;9621:2:21;9606:18;;9593:32;9590:40;-1:-1:-1;9587:60:21;;;9643:1;9640;9633:12;9587:60;9682:96;9770:7;9763:2;9752:9;9748:18;9735:32;9724:9;9720:48;9682:96;:::i;:::-;9797:8;;-1:-1:-1;9824:8:21;-1:-1:-1;9875:2:21;9860:18;;9847:32;9844:40;-1:-1:-1;9841:60:21;;;9897:1;9894;9887:12;9841:60;9936:96;10024:7;10017:2;10006:9;10002:18;9989:32;9978:9;9974:48;9936:96;:::i;:::-;10051:8;;-1:-1:-1;10078:8:21;-1:-1:-1;10129:3:21;10114:19;;10101:33;10098:41;-1:-1:-1;10095:61:21;;;10152:1;10149;10142:12;10095:61;10191:97;10280:7;10272:3;10261:9;10257:19;10244:33;10233:9;10229:49;10191:97;:::i;:::-;10307:8;;-1:-1:-1;10334:8:21;-1:-1:-1;10385:3:21;10370:19;;10357:33;10354:41;-1:-1:-1;10351:61:21;;;10408:1;10405;10398:12;10351:61;;10448:97;10537:7;10529:3;10518:9;10514:19;10501:33;10490:9;10486:49;10448:97;:::i;:::-;10564:8;10554:18;;10592:9;10581:20;;;;8840:1767;;;;;;;;;;;;;;:::o;11489:127::-;11550:10;11545:3;11541:20;11538:1;11531:31;11581:4;11578:1;11571:15;11605:4;11602:1;11595:15;11923:127;11984:10;11979:3;11975:20;11972:1;11965:31;12015:4;12012:1;12005:15;12039:4;12036:1;12029:15;12055:135;12094:3;12115:17;;;12112:43;;12135:18;;:::i;:::-;-1:-1:-1;12182:1:21;12171:13;;12055:135::o;12556:125::-;12621:9;;;12642:10;;;12639:36;;;12655:18;;:::i;15615:180::-;15682:18;15720:10;;;15732;;;15716:27;;15755:11;;;15752:37;;;15769:18;;:::i;:::-;15752:37;15615:180;;;;:::o;16298:437::-;16368:3;16419:5;16442:1;16452:258;16466:6;16463:1;16460:13;16452:258;;;-1:-1:-1;;;;;16531:26:21;16550:6;16531:26;:::i;:::-;16527:75;16515:88;;16626:4;16650:12;;;;16685:15;;;;;16488:1;16481:9;16452:258;;;-1:-1:-1;16726:3:21;;16298:437;-1:-1:-1;;;;16298:437:21:o;16740:308::-;16810:3;-1:-1:-1;;;;;16834:6:21;16831:78;16828:98;;;16922:1;16919;16912:12;16828:98;16958:6;16955:1;16951:14;16999:8;16992:5;16987:3;16974:34;17024:18;;;;;16740:308;-1:-1:-1;;;16740:308:21:o;17053:403::-;17312:3;17337:113;17391:58;17445:3;17437:6;17429;17391:58;:::i;:::-;17383:6;17375;17337:113;:::i;:::-;17330:120;17053:403;-1:-1:-1;;;;;;17053:403:21:o;18258:345::-;18455:6;18450:3;18443:19;18506:6;18498;18493:2;18488:3;18484:12;18471:42;18425:3;18536:16;;18554:2;18532:25;18566:13;;;18532:25;18258:345;-1:-1:-1;;18258:345:21:o;21764:533::-;22109:6;22104:3;22097:19;22146:6;22141:2;22136:3;22132:12;22125:28;22079:3;22169:122;22223:67;22286:2;22281:3;22277:12;22269:6;22261;22223:67;:::i;22169:122::-;22162:129;21764:533;-1:-1:-1;;;;;;;;21764:533:21:o;28834:168::-;28907:9;;;28938;;28955:15;;;28949:22;;28935:37;28925:71;;28976:18;;:::i;29007:217::-;29047:1;29073;29063:132;;29117:10;29112:3;29108:20;29105:1;29098:31;29152:4;29149:1;29142:15;29180:4;29177:1;29170:15;29063:132;-1:-1:-1;29209:9:21;;29007:217::o;29229:521::-;29306:4;29312:6;29372:11;29359:25;29466:2;29462:7;29451:8;29435:14;29431:29;29427:43;29407:18;29403:68;29393:96;;29485:1;29482;29475:12;29393:96;29512:33;;29564:20;;;-1:-1:-1;29607:18:21;29596:30;;29593:50;;;29639:1;29636;29629:12;29593:50;29672:4;29660:17;;-1:-1:-1;29703:14:21;29699:27;;;29689:38;;29686:58;;;29740:1;29737;29730:12;34374:1060;34662:2;34674:21;;;34647:18;;34730:22;;;34614:4;34809:6;34783:2;34768:18;;34614:4;34843:258;34857:6;34854:1;34851:13;34843:258;;;-1:-1:-1;;;;;34922:26:21;34941:6;34922:26;:::i;:::-;34918:75;34906:88;;35017:4;35076:15;;;;35041:12;;;;34879:1;34872:9;34843:258;;;34847:3;35148:9;35143:3;35139:19;35132:4;35121:9;35117:20;35110:49;35180:6;35175:3;35168:19;-1:-1:-1;;;;;35202:6:21;35199:78;35196:98;;;35290:1;35287;35280:12;35196:98;35324:6;35321:1;35317:14;35303:28;;35377:6;35369;35362:4;35357:3;35353:14;35340:44;35405:16;35423:4;35401:27;;34374:1060;-1:-1:-1;;;;;;34374:1060:21:o;35791:277::-;35858:6;35911:2;35899:9;35890:7;35886:23;35882:32;35879:52;;;35927:1;35924;35917:12;35879:52;35959:9;35953:16;36012:5;36005:13;35998:21;35991:5;35988:32;35978:60;;36034:1;36031;36024:12;36484:127;36545:10;36540:3;36536:20;36533:1;36526:31;36576:4;36573:1;36566:15;36600:4;36597:1;36590:15;36616:128;36683:9;;;36704:11;;;36701:37;;;36718:18;;:::i;39033:250::-;39118:1;39128:113;39142:6;39139:1;39136:13;39128:113;;;39218:11;;;39212:18;39199:11;;;39192:39;39164:2;39157:10;39128:113;;;-1:-1:-1;;39275:1:21;39257:16;;39250:27;39033:250::o;39288:287::-;39417:3;39455:6;39449:13;39471:66;39530:6;39525:3;39518:4;39510:6;39506:17;39471:66;:::i;:::-;39553:16;;;;;39288:287;-1:-1:-1;;39288:287:21:o;39983:396::-;40132:2;40121:9;40114:21;40095:4;40164:6;40158:13;40207:6;40202:2;40191:9;40187:18;40180:34;40223:79;40295:6;40290:2;40279:9;40275:18;40270:2;40262:6;40258:15;40223:79;:::i;:::-;40363:2;40342:15;-1:-1:-1;;40338:29:21;40323:45;;;;40370:2;40319:54;;39983:396;-1:-1:-1;;39983:396:21:o
Swarm Source
ipfs://60ea66ba1a2b5d10486435a221e9cff33147bf5a7a4ee413ee5e8dce0f50121f
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$658,496.96
Net Worth in ETH
222.675527
Token Allocations
WETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| UNI | 100.00% | $2,957.23 | 222.6736 | $658,496.96 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.