Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit Eth For | 13810480 | 1533 days ago | IN | 0.00114009 ETH | 0.0023061 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MainchainGatewayManager
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-04-28
*/
// File: @axie/contract-library/contracts/cryptography/ECVerify.sol
pragma solidity ^0.5.2;
library ECVerify {
enum SignatureMode {
EIP712,
GETH,
TREZOR
}
function recover(bytes32 _hash, bytes memory _signature) internal pure returns (address _signer) {
return recover(_hash, _signature, 0);
}
// solium-disable-next-line security/no-assign-params
function recover(bytes32 _hash, bytes memory _signature, uint256 _index) internal pure returns (address _signer) {
require(_signature.length >= _index + 66);
SignatureMode _mode = SignatureMode(uint8(_signature[_index]));
bytes32 _r;
bytes32 _s;
uint8 _v;
// solium-disable-next-line security/no-inline-assembly
assembly {
_r := mload(add(_signature, add(_index, 33)))
_s := mload(add(_signature, add(_index, 65)))
_v := and(255, mload(add(_signature, add(_index, 66))))
}
if (_v < 27) {
_v += 27;
}
require(_v == 27 || _v == 28);
if (_mode == SignatureMode.GETH) {
_hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash));
} else if (_mode == SignatureMode.TREZOR) {
_hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n\x20", _hash));
}
return ecrecover(_hash, _v, _r, _s);
}
function ecverify(bytes32 _hash, bytes memory _signature, address _signer) internal pure returns (bool _valid) {
return _signer == recover(_hash, _signature);
}
}
// File: @axie/contract-library/contracts/math/SafeMath.sol
pragma solidity ^0.5.2;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
require(c >= a);
}
function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
require(b <= a);
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
require(c / a == b);
}
function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
// Since Solidity automatically asserts when dividing by 0,
// but we only need it to revert.
require(b > 0);
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256 c) {
// Same reason as `div`.
require(b > 0);
return a % b;
}
function ceilingDiv(uint256 a, uint256 b) internal pure returns (uint256 c) {
return add(div(a, b), mod(a, b) > 0 ? 1 : 0);
}
function subU64(uint64 a, uint64 b) internal pure returns (uint64 c) {
require(b <= a);
return a - b;
}
function addU8(uint8 a, uint8 b) internal pure returns (uint8 c) {
c = a + b;
require(c >= a);
}
}
// File: @axie/contract-library/contracts/token/erc20/IERC20.sol
pragma solidity ^0.5.2;
interface IERC20 {
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function totalSupply() external view returns (uint256 _supply);
function balanceOf(address _owner) external view returns (uint256 _balance);
function approve(address _spender, uint256 _value) external returns (bool _success);
function allowance(address _owner, address _spender) external view returns (uint256 _value);
function transfer(address _to, uint256 _value) external returns (bool _success);
function transferFrom(address _from, address _to, uint256 _value) external returns (bool _success);
}
// File: @axie/contract-library/contracts/token/erc20/IERC20Mintable.sol
pragma solidity ^0.5.2;
interface IERC20Mintable {
function mint(address _to, uint256 _value) external returns (bool _success);
}
// File: @axie/contract-library/contracts/token/erc721/IERC721.sol
pragma solidity ^0.5.2;
interface IERC721 {
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
function balanceOf(address _owner) external view returns (uint256 _balance);
function ownerOf(uint256 _tokenId) external view returns (address _owner);
function approve(address _to, uint256 _tokenId) external;
function getApproved(uint256 _tokenId) external view returns (address _operator);
function setApprovalForAll(address _operator, bool _approved) external;
function isApprovedForAll(address _owner, address _operator) external view returns (bool _approved);
function transferFrom(address _from, address _to, uint256 _tokenId) external;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external;
}
// File: @axie/contract-library/contracts/token/erc721/IERC721Mintable.sol
pragma solidity ^0.5.2;
interface IERC721Mintable {
function mint(address _to, uint256 _tokenId) external returns (bool);
function mintNew(address _to) external returns (uint256 _tokenId);
}
// File: @axie/contract-library/contracts/util/AddressUtils.sol
pragma solidity ^0.5.2;
library AddressUtils {
function toPayable(address _address) internal pure returns (address payable _payable) {
return address(uint160(_address));
}
function isContract(address _address) internal view returns (bool _correct) {
uint256 _size;
// solium-disable-next-line security/no-inline-assembly
assembly { _size := extcodesize(_address) }
return _size > 0;
}
}
// File: @axie/contract-library/contracts/token/erc20/ERC20.sol
pragma solidity ^0.5.2;
contract ERC20 is IERC20 {
using SafeMath for uint256;
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
function approve(address _spender, uint256 _value) public returns (bool _success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function transfer(address _to, uint256 _value) public returns (bool _success) {
require(_to != address(0));
balanceOf[msg.sender] = balanceOf[msg.sender].sub(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool _success) {
require(_to != address(0));
balanceOf[_from] = balanceOf[_from].sub(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
}
// File: @axie/contract-library/contracts/token/erc20/IERC20Detailed.sol
pragma solidity ^0.5.2;
interface IERC20Detailed {
function name() external view returns (string memory _name);
function symbol() external view returns (string memory _symbol);
function decimals() external view returns (uint8 _decimals);
}
// File: @axie/contract-library/contracts/token/erc20/ERC20Detailed.sol
pragma solidity ^0.5.2;
contract ERC20Detailed is ERC20, IERC20Detailed {
string public name;
string public symbol;
uint8 public decimals;
constructor(string memory _name, string memory _symbol, uint8 _decimals) public {
name = _name;
symbol = _symbol;
decimals = _decimals;
}
}
// File: @axie/contract-library/contracts/access/HasAdmin.sol
pragma solidity ^0.5.2;
contract HasAdmin {
event AdminChanged(address indexed _oldAdmin, address indexed _newAdmin);
event AdminRemoved(address indexed _oldAdmin);
address public admin;
modifier onlyAdmin {
require(msg.sender == admin);
_;
}
constructor() internal {
admin = msg.sender;
emit AdminChanged(address(0), admin);
}
function changeAdmin(address _newAdmin) external onlyAdmin {
require(_newAdmin != address(0));
emit AdminChanged(admin, _newAdmin);
admin = _newAdmin;
}
function removeAdmin() external onlyAdmin {
emit AdminRemoved(admin);
admin = address(0);
}
}
// File: @axie/contract-library/contracts/access/HasMinters.sol
pragma solidity ^0.5.2;
contract HasMinters is HasAdmin {
event MinterAdded(address indexed _minter);
event MinterRemoved(address indexed _minter);
address[] public minters;
mapping (address => bool) public minter;
modifier onlyMinter {
require(minter[msg.sender]);
_;
}
function addMinters(address[] memory _addedMinters) public onlyAdmin {
address _minter;
for (uint256 i = 0; i < _addedMinters.length; i++) {
_minter = _addedMinters[i];
if (!minter[_minter]) {
minters.push(_minter);
minter[_minter] = true;
emit MinterAdded(_minter);
}
}
}
function removeMinters(address[] memory _removedMinters) public onlyAdmin {
address _minter;
for (uint256 i = 0; i < _removedMinters.length; i++) {
_minter = _removedMinters[i];
if (minter[_minter]) {
minter[_minter] = false;
emit MinterRemoved(_minter);
}
}
uint256 i = 0;
while (i < minters.length) {
_minter = minters[i];
if (!minter[_minter]) {
minters[i] = minters[minters.length - 1];
delete minters[minters.length - 1];
minters.length--;
} else {
i++;
}
}
}
function isMinter(address _addr) public view returns (bool) {
return minter[_addr];
}
}
// File: @axie/contract-library/contracts/token/erc20/ERC20Mintable.sol
pragma solidity ^0.5.2;
contract ERC20Mintable is HasMinters, ERC20 {
function mint(address _to, uint256 _value) public onlyMinter returns (bool _success) {
return _mint(_to, _value);
}
function _mint(address _to, uint256 _value) internal returns (bool success) {
totalSupply = totalSupply.add(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(address(0), _to, _value);
return true;
}
}
// File: contracts/chain/mainchain/WETH.sol
pragma solidity ^0.5.17;
contract WETH is ERC20Detailed {
event Deposit(
address _sender,
uint256 _value
);
event Withdrawal(
address _sender,
uint256 _value
);
constructor () ERC20Detailed("Wrapped Ether", "WETH", 18)
public
{}
function deposit()
external
payable
{
balanceOf[msg.sender] += msg.value;
emit Deposit(msg.sender, msg.value);
}
function withdraw(uint256 _wad)
external
{
require(balanceOf[msg.sender] >= _wad);
balanceOf[msg.sender] -= _wad;
msg.sender.transfer(_wad);
emit Withdrawal(msg.sender, _wad);
}
}
// File: @axie/contract-library/contracts/proxy/ProxyStorage.sol
pragma solidity ^0.5.2;
/**
* @title ProxyStorage
* @dev Store the address of logic contact that the proxy should forward to.
*/
contract ProxyStorage is HasAdmin {
address internal _proxyTo;
}
// File: @axie/contract-library/contracts/lifecycle/Pausable.sol
pragma solidity ^0.5.2;
contract Pausable is HasAdmin {
event Paused();
event Unpaused();
bool public paused;
modifier whenNotPaused() {
require(!paused);
_;
}
modifier whenPaused() {
require(paused);
_;
}
function pause() public onlyAdmin whenNotPaused {
paused = true;
emit Paused();
}
function unpause() public onlyAdmin whenPaused {
paused = false;
emit Unpaused();
}
}
// File: contracts/chain/common/IValidator.sol
pragma solidity ^0.5.17;
contract IValidator {
event ValidatorAdded(uint256 indexed _id, address indexed _validator);
event ValidatorRemoved(uint256 indexed _id, address indexed _validator);
event ThresholdUpdated(
uint256 indexed _id,
uint256 indexed _numerator,
uint256 indexed _denominator,
uint256 _previousNumerator,
uint256 _previousDenominator
);
function isValidator(address _addr) public view returns (bool);
function getValidators() public view returns (address[] memory _validators);
function checkThreshold(uint256 _voteCount) public view returns (bool);
}
// File: contracts/chain/common/Validator.sol
pragma solidity ^0.5.17;
contract Validator is IValidator {
using SafeMath for uint256;
mapping(address => bool) validatorMap;
address[] public validators;
uint256 public validatorCount;
uint256 public num;
uint256 public denom;
constructor(address[] memory _validators, uint256 _num, uint256 _denom)
public
{
validators = _validators;
validatorCount = _validators.length;
for (uint256 _i = 0; _i < validatorCount; _i++) {
address _validator = _validators[_i];
validatorMap[_validator] = true;
}
num = _num;
denom = _denom;
}
function isValidator(address _addr)
public
view
returns (bool)
{
return validatorMap[_addr];
}
function getValidators()
public
view
returns (address[] memory _validators)
{
_validators = validators;
}
function checkThreshold(uint256 _voteCount)
public
view
returns (bool)
{
return _voteCount.mul(denom) >= num.mul(validatorCount);
}
function _addValidator(uint256 _id, address _validator)
internal
{
require(!validatorMap[_validator]);
validators.push(_validator);
validatorMap[_validator] = true;
validatorCount++;
emit ValidatorAdded(_id, _validator);
}
function _removeValidator(uint256 _id, address _validator)
internal
{
require(isValidator(_validator));
uint256 _index;
for (uint256 _i = 0; _i < validatorCount; _i++) {
if (validators[_i] == _validator) {
_index = _i;
break;
}
}
validatorMap[_validator] = false;
validators[_index] = validators[validatorCount - 1];
validators.pop();
validatorCount--;
emit ValidatorRemoved(_id, _validator);
}
function _updateQuorum(uint256 _id, uint256 _numerator, uint256 _denominator)
internal
{
require(_numerator <= _denominator);
uint256 _previousNumerator = num;
uint256 _previousDenominator = denom;
num = _numerator;
denom = _denominator;
emit ThresholdUpdated(
_id,
_numerator,
_denominator,
_previousNumerator,
_previousDenominator
);
}
}
// File: contracts/chain/mainchain/MainchainValidator.sol
pragma solidity ^0.5.17;
/**
* @title Validator
* @dev Simple validator contract
*/
contract MainchainValidator is Validator, HasAdmin {
uint256 nonce;
constructor(
address[] memory _validators,
uint256 _num,
uint256 _denom
) Validator(_validators, _num, _denom) public {
}
function addValidators(address[] calldata _validators) external onlyAdmin {
for (uint256 _i; _i < _validators.length; ++_i) {
_addValidator(nonce++, _validators[_i]);
}
}
function removeValidator(address _validator) external onlyAdmin {
_removeValidator(nonce++, _validator);
}
function updateQuorum(uint256 _numerator, uint256 _denominator) external onlyAdmin {
_updateQuorum(nonce++, _numerator, _denominator);
}
}
// File: contracts/chain/common/Registry.sol
pragma solidity ^0.5.17;
contract Registry is HasAdmin {
event ContractAddressUpdated(
string indexed _name,
bytes32 indexed _code,
address indexed _newAddress
);
event TokenMapped(
address indexed _mainchainToken,
address indexed _sidechainToken,
uint32 _standard
);
string public constant GATEWAY = "GATEWAY";
string public constant WETH_TOKEN = "WETH_TOKEN";
string public constant VALIDATOR = "VALIDATOR";
string public constant ACKNOWLEDGEMENT = "ACKNOWLEDGEMENT";
struct TokenMapping {
address mainchainToken;
address sidechainToken;
uint32 standard; // 20, 721 or any other standards
}
mapping(bytes32 => address) public contractAddresses;
mapping(address => TokenMapping) public mainchainMap;
mapping(address => TokenMapping) public sidechainMap;
function getContract(string calldata _name)
external
view
returns (address _address)
{
bytes32 _code = getCode(_name);
_address = contractAddresses[_code];
require(_address != address(0));
}
function isTokenMapped(address _token, uint32 _standard, bool _isMainchain)
external
view
returns (bool)
{
TokenMapping memory _mapping = _getTokenMapping(_token, _isMainchain);
return _mapping.mainchainToken != address(0) &&
_mapping.sidechainToken != address(0) &&
_mapping.standard == _standard;
}
function updateContract(string calldata _name, address _newAddress)
external
onlyAdmin
{
bytes32 _code = getCode(_name);
contractAddresses[_code] = _newAddress;
emit ContractAddressUpdated(_name, _code, _newAddress);
}
function mapToken(address _mainchainToken, address _sidechainToken, uint32 _standard)
external
onlyAdmin
{
TokenMapping memory _map = TokenMapping(
_mainchainToken,
_sidechainToken,
_standard
);
mainchainMap[_mainchainToken] = _map;
sidechainMap[_sidechainToken] = _map;
emit TokenMapped(
_mainchainToken,
_sidechainToken,
_standard
);
}
function clearMapToken(address _mainchainToken, address _sidechainToken)
external
onlyAdmin
{
TokenMapping storage _mainchainMap = mainchainMap[_mainchainToken];
_clearMapEntry(_mainchainMap);
TokenMapping storage _sidechainMap = sidechainMap[_sidechainToken];
_clearMapEntry(_sidechainMap);
}
function getMappedToken(
address _token,
bool _isMainchain
)
external
view
returns (
address _mainchainToken,
address _sidechainToken,
uint32 _standard
)
{
TokenMapping memory _mapping = _getTokenMapping(_token, _isMainchain);
_mainchainToken = _mapping.mainchainToken;
_sidechainToken = _mapping.sidechainToken;
_standard = _mapping.standard;
}
function getCode(string memory _name)
public
pure
returns (bytes32)
{
return keccak256(abi.encodePacked(_name));
}
function _getTokenMapping(
address _token,
bool isMainchain
)
internal
view
returns (TokenMapping memory _mapping)
{
if (isMainchain) {
_mapping = mainchainMap[_token];
} else {
_mapping = sidechainMap[_token];
}
}
function _clearMapEntry(TokenMapping storage _entry)
internal
{
_entry.mainchainToken = address(0);
_entry.sidechainToken = address(0);
_entry.standard = 0;
}
}
// File: contracts/chain/mainchain/MainchainGatewayStorage.sol
pragma solidity ^0.5.17;
/**
* @title GatewayStorage
* @dev Storage of deposit and withdraw information.
*/
contract MainchainGatewayStorage is ProxyStorage, Pausable {
event TokenDeposited(
uint256 indexed _depositId,
address indexed _owner,
address indexed _tokenAddress,
address _sidechainAddress,
uint32 _standard,
uint256 _tokenNumber // ERC-20 amount or ERC721 tokenId
);
event TokenWithdrew(
uint256 indexed _withdrawId,
address indexed _owner,
address indexed _tokenAddress,
uint256 _tokenNumber
);
struct DepositEntry {
address owner;
address tokenAddress;
address sidechainAddress;
uint32 standard;
uint256 tokenNumber;
}
struct WithdrawalEntry {
address owner;
address tokenAddress;
uint256 tokenNumber;
}
Registry public registry;
uint256 public depositCount;
DepositEntry[] public deposits;
mapping(uint256 => WithdrawalEntry) public withdrawals;
function updateRegistry(address _registry) external onlyAdmin {
registry = Registry(_registry);
}
}
// File: contracts/chain/mainchain/MainchainGatewayManager.sol
pragma solidity ^0.5.17;
/**
* @title MainchainGatewayManager
* @dev Logic to handle deposits and withdrawl on Mainchain.
*/
contract MainchainGatewayManager is MainchainGatewayStorage {
using AddressUtils for address;
using SafeMath for uint256;
using ECVerify for bytes32;
modifier onlyMappedToken(address _token, uint32 _standard) {
require(
registry.isTokenMapped(_token, _standard, true),
"MainchainGatewayManager: Token is not mapped"
);
_;
}
modifier onlyNewWithdrawal(uint256 _withdrawalId) {
WithdrawalEntry storage _entry = withdrawals[_withdrawalId];
require(_entry.owner == address(0) && _entry.tokenAddress == address(0));
_;
}
// Should be able to withdraw from WETH
function()
external
payable
{}
function depositEth()
external
whenNotPaused
payable
returns (uint256)
{
return depositEthFor(msg.sender);
}
function depositERC20(address _token, uint256 _amount)
external
whenNotPaused
returns (uint256)
{
return depositERC20For(msg.sender, _token, _amount);
}
function depositERC721(address _token, uint256 _tokenId)
external
whenNotPaused
returns (uint256)
{
return depositERC721For(msg.sender, _token, _tokenId);
}
function depositEthFor(address _owner)
public
whenNotPaused
payable
returns (uint256)
{
address _weth = registry.getContract(registry.WETH_TOKEN());
WETH(_weth).deposit.value(msg.value)();
return _createDepositEntry(_owner, _weth, 20, msg.value);
}
function depositERC20For(address _user, address _token, uint256 _amount)
public
whenNotPaused
returns (uint256)
{
require(
IERC20(_token).transferFrom(msg.sender, address(this), _amount),
"MainchainGatewayManager: ERC-20 token transfer failed"
);
return _createDepositEntry(_user, _token, 20, _amount);
}
function depositERC721For(address _user, address _token, uint256 _tokenId)
public
whenNotPaused
returns (uint256)
{
IERC721(_token).transferFrom(msg.sender, address(this), _tokenId);
return _createDepositEntry(_user, _token, 721, _tokenId);
}
function depositBulkFor(
address _user,
address[] memory _tokens,
uint256[] memory _tokenNumbers
)
public
whenNotPaused
{
require(_tokens.length == _tokenNumbers.length);
for (uint256 _i = 0; _i < _tokens.length; _i++) {
address _token = _tokens[_i];
uint256 _tokenNumber = _tokenNumbers[_i];
(,, uint32 _standard) = registry.getMappedToken(_token, true);
if (_standard == 20) {
depositERC20For(_user, _token, _tokenNumber);
} else if (_standard == 721) {
depositERC721For(_user, _token, _tokenNumber);
} else {
revert("Token is not mapped or token type not supported");
}
}
}
function withdrawToken(
uint256 _withdrawalId,
address _token,
uint256 _amount,
bytes memory _signatures
)
public
whenNotPaused
{
withdrawTokenFor(
_withdrawalId,
msg.sender,
_token,
_amount,
_signatures
);
}
function withdrawTokenFor(
uint256 _withdrawalId,
address _user,
address _token,
uint256 _amount,
bytes memory _signatures
)
public
whenNotPaused
{
(,, uint32 _tokenType) = registry.getMappedToken(_token, true);
if (_tokenType == 20) {
withdrawERC20For(
_withdrawalId,
_user,
_token,
_amount,
_signatures
);
} else if (_tokenType == 721) {
withdrawERC721For(
_withdrawalId,
_user,
_token,
_amount,
_signatures
);
}
}
function withdrawERC20(
uint256 _withdrawalId,
address _token,
uint256 _amount,
bytes memory _signatures
)
public
whenNotPaused
{
withdrawERC20For(
_withdrawalId,
msg.sender,
_token,
_amount,
_signatures
);
}
function withdrawERC20For(
uint256 _withdrawalId,
address _user,
address _token,
uint256 _amount,
bytes memory _signatures
)
public
whenNotPaused
onlyMappedToken(_token, 20)
{
bytes32 _hash = keccak256(
abi.encodePacked(
"withdrawERC20",
_withdrawalId,
_user,
_token,
_amount
)
);
require(verifySignatures(_hash, _signatures));
if (_token == registry.getContract(registry.WETH_TOKEN())) {
_withdrawETHFor(_user, _amount);
} else {
uint256 _gatewayBalance = IERC20(_token).balanceOf(address(this));
if (_gatewayBalance < _amount) {
require(
IERC20Mintable(_token).mint(address(this), _amount.sub(_gatewayBalance)),
"MainchainGatewayManager: Minting ERC20 token to gateway failed"
);
}
require(IERC20(_token).transfer(_user, _amount), "Transfer failed");
}
_insertWithdrawalEntry(
_withdrawalId,
_user,
_token,
_amount
);
}
function withdrawERC721(
uint256 _withdrawalId,
address _token,
uint256 _tokenId,
bytes memory _signatures
)
public
whenNotPaused
{
withdrawERC721For(
_withdrawalId,
msg.sender,
_token,
_tokenId,
_signatures
);
}
function withdrawERC721For(
uint256 _withdrawalId,
address _user,
address _token,
uint256 _tokenId,
bytes memory _signatures
)
public
whenNotPaused
onlyMappedToken(_token, 721)
{
bytes32 _hash = keccak256(
abi.encodePacked(
"withdrawERC721",
_withdrawalId,
_user,
_token,
_tokenId
)
);
require(verifySignatures(_hash, _signatures));
if (!_tryERC721TransferFrom(_token, address(this), _user, _tokenId)) {
require(
IERC721Mintable(_token).mint(_user, _tokenId),
"MainchainGatewayManager: Minting ERC721 token to gateway failed"
);
}
_insertWithdrawalEntry(_withdrawalId, _user, _token, _tokenId);
}
/**
* @dev returns true if there is enough signatures from validators.
*/
function verifySignatures(
bytes32 _hash,
bytes memory _signatures
)
public
view
returns (bool)
{
uint256 _signatureCount = _signatures.length.div(66);
Validator _validator = Validator(registry.getContract(registry.VALIDATOR()));
uint256 _validatorCount = 0;
address _lastSigner = address(0);
for (uint256 i = 0; i < _signatureCount; i++) {
address _signer = _hash.recover(_signatures, i.mul(66));
if (_validator.isValidator(_signer)) {
_validatorCount++;
}
// Prevent duplication of signatures
require(_signer > _lastSigner);
_lastSigner = _signer;
}
return _validator.checkThreshold(_validatorCount);
}
function _createDepositEntry(
address _owner,
address _token,
uint32 _standard,
uint256 _number
)
internal
onlyMappedToken(_token, _standard)
returns (uint256 _depositId)
{
(,address _sidechainToken, uint32 _tokenStandard) = registry.getMappedToken(_token, true);
require(_standard == _tokenStandard);
DepositEntry memory _entry = DepositEntry(
_owner,
_token,
_sidechainToken,
_standard,
_number
);
deposits.push(_entry);
_depositId = depositCount++;
emit TokenDeposited(
_depositId,
_owner,
_token,
_sidechainToken,
_standard,
_number
);
}
function _insertWithdrawalEntry(
uint256 _withdrawalId,
address _owner,
address _token,
uint256 _number
)
internal
onlyNewWithdrawal(_withdrawalId)
{
WithdrawalEntry memory _entry = WithdrawalEntry(
_owner,
_token,
_number
);
withdrawals[_withdrawalId] = _entry;
emit TokenWithdrew(_withdrawalId, _owner, _token, _number);
}
function _withdrawETHFor(
address _user,
uint256 _amount
)
internal
{
address _weth = registry.getContract(registry.WETH_TOKEN());
WETH(_weth).withdraw(_amount);
_user.toPayable().transfer(_amount);
}
// See more here https://blog.polymath.network/try-catch-in-solidity-handling-the-revert-exception-f53718f76047
function _tryERC721TransferFrom(
address _token,
address _from,
address _to,
uint256 _tokenId
)
internal
returns (bool)
{
(bool success,) = _token.call(
abi.encodeWithSelector(
IERC721(_token).transferFrom.selector, _from, _to, _tokenId
)
);
return success;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_sidechainAddress","type":"address"},{"indexed":false,"internalType":"uint32","name":"_standard","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"_tokenNumber","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_withdrawId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenNumber","type":"uint256"}],"name":"TokenWithdrew","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_tokenNumbers","type":"uint256[]"}],"name":"depositBulkFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"depositCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositERC20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositERC20For","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"depositERC721","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"depositERC721For","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"depositEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"depositEthFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposits","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"sidechainAddress","type":"address"},{"internalType":"uint32","name":"standard","type":"uint32"},{"internalType":"uint256","name":"tokenNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"verifySignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawERC20For","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawERC721","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawERC721For","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_withdrawalId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"withdrawTokenFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawals","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenNumber","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
60806040819052600080546001600160a01b03191633178082556001600160a01b0316917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f908290a3612c35806100576000396000f3fe6080604052600436106101665760003560e01c80638456cb59116100d1578063a7616c3b1161008a578063c7a823e011610064578063c7a823e014610a3c578063d29a4bf614610af4578063eee3f07a14610b2d578063f851a44014610b5357610166565b8063a7616c3b146108c2578063ace77c1914610905578063b02c43d0146109d257610166565b80638456cb591461071357806385eb3a35146107285780638f2839701461076b57806397feb9261461079e578063993e1c42146107d75780639a202d47146108ad57610166565b80635a8143de116101235780635a8143de146103ec5780635c975abb146104c25780635cc07076146104eb57806367a1569b1461053f57806375af64561461060c5780637b103999146106e257610166565b80631a5da6c8146101685780632dfdf0b51461019b5780633afecb8a146101c25780633f4ba83a14610302578063439370b1146103175780634789dcb91461031f575b005b34801561017457600080fd5b506101666004803603602081101561018b57600080fd5b50356001600160a01b0316610b68565b3480156101a757600080fd5b506101b0610ba1565b60408051918252519081900360200190f35b3480156101ce57600080fd5b50610166600480360360608110156101e557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561020f57600080fd5b82018360208201111561022157600080fd5b803590602001918460208302840111600160201b8311171561024257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561029157600080fd5b8201836020820111156102a357600080fd5b803590602001918460208302840111600160201b831117156102c457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ba7945050505050565b34801561030e57600080fd5b50610166610d17565b6101b0610d7c565b34801561032b57600080fd5b506101666004803603608081101561034257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561037857600080fd5b82018360208201111561038a57600080fd5b803590602001918460018302840111600160201b831117156103ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610da4945050505050565b3480156103f857600080fd5b50610166600480360360a081101561040f57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561044e57600080fd5b82018360208201111561046057600080fd5b803590602001918460018302840111600160201b8311171561048157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc8945050505050565b3480156104ce57600080fd5b506104d7610eae565b604080519115158252519081900360200190f35b3480156104f757600080fd5b506105156004803603602081101561050e57600080fd5b5035610ebe565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b34801561054b57600080fd5b506101666004803603608081101561056257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460018302840111600160201b831117156105cb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610eec945050505050565b34801561061857600080fd5b50610166600480360360a081101561062f57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561066e57600080fd5b82018360208201111561068057600080fd5b803590602001918460018302840111600160201b831117156106a157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f0c945050505050565b3480156106ee57600080fd5b506106f7611152565b604080516001600160a01b039092168252519081900360200190f35b34801561071f57600080fd5b50610166611161565b34801561073457600080fd5b506101b06004803603606081101561074b57600080fd5b506001600160a01b038135811691602081013590911690604001356111cd565b34801561077757600080fd5b506101666004803603602081101561078e57600080fd5b50356001600160a01b03166112b8565b3480156107aa57600080fd5b506101b0600480360360408110156107c157600080fd5b506001600160a01b03813516906020013561133d565b3480156107e357600080fd5b50610166600480360360a08110156107fa57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561083957600080fd5b82018360208201111561084b57600080fd5b803590602001918460018302840111600160201b8311171561086c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061136b945050505050565b3480156108b957600080fd5b50610166611910565b3480156108ce57600080fd5b506101b0600480360360608110156108e557600080fd5b506001600160a01b0381358116916020810135909116906040013561196f565b34801561091157600080fd5b506101666004803603608081101561092857600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561095e57600080fd5b82018360208201111561097057600080fd5b803590602001918460018302840111600160201b8311171561099157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a03945050505050565b3480156109de57600080fd5b506109fc600480360360208110156109f557600080fd5b5035611a27565b604080516001600160a01b0396871681529486166020860152929094168383015263ffffffff166060830152608082019290925290519081900360a00190f35b348015610a4857600080fd5b506104d760048036036040811015610a5f57600080fd5b81359190810190604081016020820135600160201b811115610a8057600080fd5b820183602082011115610a9257600080fd5b803590602001918460018302840111600160201b83111715610ab357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a7c945050505050565b348015610b0057600080fd5b506101b060048036036040811015610b1757600080fd5b506001600160a01b038135169060200135611dfb565b6101b060048036036020811015610b4357600080fd5b50356001600160a01b0316611e20565b348015610b5f57600080fd5b506106f76120a6565b6000546001600160a01b03163314610b7f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60035481565b600154600160a01b900460ff1615610bbe57600080fd5b8051825114610bcc57600080fd5b60005b8251811015610d11576000838281518110610be657fe5b602002602001015190506000838381518110610bfe57fe5b60209081029190910101516002546040805163eb96fbcd60e01b81526001600160a01b038681166004830152600160248301529151939450600093919092169163eb96fbcd916044808301926060929190829003018186803b158015610c6357600080fd5b505afa158015610c77573d6000803e3d6000fd5b505050506040513d6060811015610c8d57600080fd5b50604001519050601463ffffffff82161415610cb457610cae8784846111cd565b50610d06565b8063ffffffff166102d11415610ccf57610cae87848461196f565b60405162461bcd60e51b815260040180806020018281038252602f815260200180612b93602f913960400191505060405180910390fd5b505050600101610bcf565b50505050565b6000546001600160a01b03163314610d2e57600080fd5b600154600160a01b900460ff16610d4457600080fd5b6001805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600154600090600160a01b900460ff1615610d9657600080fd5b610d9f33611e20565b905090565b600154600160a01b900460ff1615610dbb57600080fd5b610d11843385858561136b565b600154600160a01b900460ff1615610ddf57600080fd5b6002546040805163eb96fbcd60e01b81526001600160a01b038681166004830152600160248301529151600093929092169163eb96fbcd91604480820192606092909190829003018186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d6060811015610e6157600080fd5b50604001519050601463ffffffff82161415610e8957610e84868686868661136b565b610ea6565b8063ffffffff166102d11415610ea657610ea68686868686610f0c565b505050505050565b600154600160a01b900460ff1681565b6005602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b600154600160a01b900460ff1615610f0357600080fd5b610d1184338585855b600154600160a01b900460ff1615610f2357600080fd5b60025460408051631abcf33d60e11b81526001600160a01b0380871660048301526102d16024830181905260016044840152925187949190911691633579e67a916064808301926020929190829003018186803b158015610f8357600080fd5b505afa158015610f97573d6000803e3d6000fd5b505050506040513d6020811015610fad57600080fd5b5051610fea5760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b604080516d776974686472617745524337323160901b602080830191909152602e82018a90526bffffffffffffffffffffffff1960608a811b8216604e85015289901b1660628301526076808301889052835180840390910181526096909201909252805191012061105c8185611a7c565b61106557600080fd5b611071863089886120b5565b61113c57856001600160a01b03166340c10f1988876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b505161113c5760405162461bcd60e51b815260040180806020018281038252603f815260200180612bc2603f913960400191505060405180910390fd5b611148888888886121ad565b5050505050505050565b6002546001600160a01b031681565b6000546001600160a01b0316331461117857600080fd5b600154600160a01b900460ff161561118f57600080fd5b6001805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600154600090600160a01b900460ff16156111e757600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd9160648083019260209291908290030181600087803b15801561123c57600080fd5b505af1158015611250573d6000803e3d6000fd5b505050506040513d602081101561126657600080fd5b50516112a35760405162461bcd60e51b8152600401808060200182810382526035815260200180612b5e6035913960400191505060405180910390fd5b6112b084846014856122a0565b949350505050565b6000546001600160a01b031633146112cf57600080fd5b6001600160a01b0381166112e257600080fd5b600080546040516001600160a01b03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff161561135757600080fd5b6113623384846111cd565b90505b92915050565b600154600160a01b900460ff161561138257600080fd5b60025460408051631abcf33d60e11b81526001600160a01b03808716600483015260146024830181905260016044840152925187949190911691633579e67a916064808301926020929190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b50516114485760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b604080516c07769746864726177455243323609c1b602080830191909152602d82018a90526bffffffffffffffffffffffff1960608a811b8216604d85015289901b166061830152607580830188905283518084039091018152609590920190925280519101206114b98185611a7c565b6114c257600080fd5b60025460408051630df49df560e21b815290516001600160a01b039092169163358177739183916337d277d491600480820192600092909190829003018186803b15801561150f57600080fd5b505afa158015611523573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561154c57600080fd5b8101908080516040519392919084600160201b82111561156b57600080fd5b90830190602082018581111561158057600080fd5b8251600160201b81118282018810171561159957600080fd5b82525081516020918201929091019080838360005b838110156115c65781810151838201526020016115ae565b50505050905090810190601f1680156115f35780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561164657818101518382015260200161162e565b50505050905090810190601f1680156116735780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561169057600080fd5b505afa1580156116a4573d6000803e3d6000fd5b505050506040513d60208110156116ba57600080fd5b50516001600160a01b03878116911614156116de576116d987866125e8565b61113c565b604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d602081101561175257600080fd5b5051905085811015611834576001600160a01b0387166340c10f193061177e898563ffffffff61288f16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156117cd57600080fd5b505af11580156117e1573d6000803e3d6000fd5b505050506040513d60208110156117f757600080fd5b50516118345760405162461bcd60e51b815260040180806020018281038252603e815260200180612b20603e913960400191505060405180910390fd5b866001600160a01b031663a9059cbb89886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189457600080fd5b505af11580156118a8573d6000803e3d6000fd5b505050506040513d60208110156118be57600080fd5b5051611903576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b50611148888888886121ad565b6000546001600160a01b0316331461192757600080fd5b600080546040516001600160a01b03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a2600080546001600160a01b0319169055565b600154600090600160a01b900460ff161561198957600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd91606480830192600092919082900301818387803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050506112b084846102d1856122a0565b600154600160a01b900460ff1615611a1a57600080fd5b610d118433858585610dc8565b60048181548110611a3457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b900463ffffffff169085565b600080611a94604284516128a490919063ffffffff16565b6002546040805163393df8cb60e01b815290519293506000926001600160a01b0390921691633581777391839163393df8cb916004808201928892909190829003018186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611b2357600080fd5b8101908080516040519392919084600160201b821115611b4257600080fd5b908301906020820185811115611b5757600080fd5b8251600160201b811182820188101715611b7057600080fd5b82525081516020918201929091019080838360005b83811015611b9d578181015183820152602001611b85565b50505050905090810190601f168015611bca5780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1d578181015183820152602001611c05565b50505050905090810190601f168015611c4a5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611c6757600080fd5b505afa158015611c7b573d6000803e3d6000fd5b505050506040513d6020811015611c9157600080fd5b50519050600080805b84811015611d7f576000611cc788611cb984604263ffffffff6128c316565b8b919063ffffffff6128eb16565b9050846001600160a01b031663facd743b826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d6020811015611d4957600080fd5b505115611d57576001909301925b826001600160a01b0316816001600160a01b031611611d7557600080fd5b9150600101611c9a565b50826001600160a01b031663dafae408836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d6020811015611dee57600080fd5b5051979650505050505050565b600154600090600160a01b900460ff1615611e1557600080fd5b61136233848461196f565b600154600090600160a01b900460ff1615611e3a57600080fd5b60025460408051630df49df560e21b815290516000926001600160a01b03169163358177739183916337d277d49160048083019288929190829003018186803b158015611e8657600080fd5b505afa158015611e9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec357600080fd5b8101908080516040519392919084600160201b821115611ee257600080fd5b908301906020820185811115611ef757600080fd5b8251600160201b811182820188101715611f1057600080fd5b82525081516020918201929091019080838360005b83811015611f3d578181015183820152602001611f25565b50505050905090810190601f168015611f6a5780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fbd578181015183820152602001611fa5565b50505050905090810190601f168015611fea5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561200757600080fd5b505afa15801561201b573d6000803e3d6000fd5b505050506040513d602081101561203157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b0383169163d0e30db0913491600480830192600092919082900301818588803b15801561207957600080fd5b505af115801561208d573d6000803e3d6000fd5b505050505061209f83826014346122a0565b9392505050565b6000546001600160a01b031681565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106121395780518252601f19909201916020918201910161211a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461219b576040519150601f19603f3d011682016040523d82523d6000602084013e6121a0565b606091505b5090979650505050505050565b600084815260056020526040902080548591906001600160a01b03161580156121e1575060018101546001600160a01b0316155b6121ea57600080fd5b6121f2612aa5565b50604080516060810182526001600160a01b0380881680835287821660208085018281528587018a815260008e815260058452889020875181549088166001600160a01b03199182161782559251600182018054919098169316929092179095559351600290940193909355845188815294519394909391928b927f86174ea401f083b9bb1bdebca3068f27fb023c7091365ed2a8a02b8d75cf0e529281900390910190a450505050505050565b60025460408051631abcf33d60e11b81526001600160a01b03808716600483015263ffffffff8616602483015260016044830152915160009387938793911691633579e67a91606480820192602092909190829003018186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d602081101561233057600080fd5b505161236d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b6002546040805163eb96fbcd60e01b81526001600160a01b0389811660048301526001602483015291516000938493169163eb96fbcd916044808301926060929190829003018186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d60608110156123ed57600080fd5b506020810151604090910151909250905063ffffffff8781169082161461241357600080fd5b61241b612ac5565b6040518060a001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b031681526020018963ffffffff1681526020018881525090506004819080600181540180825580915050906001820390600052602060002090600402016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a81548163ffffffff021916908363ffffffff1602179055506080820151816003015550505060036000815480929190600101919050559550886001600160a01b03168a6001600160a01b0316877f72848855a2461abf0dd243723dfcc9163eec2ea5215469d101c0d9c9ef58940d868c8c60405180846001600160a01b03166001600160a01b031681526020018363ffffffff1663ffffffff168152602001828152602001935050505060405180910390a45050505050949350505050565b60025460408051630df49df560e21b815290516000926001600160a01b03169163358177739183916337d277d49160048083019288929190829003018186803b15801561263457600080fd5b505afa158015612648573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561267157600080fd5b8101908080516040519392919084600160201b82111561269057600080fd5b9083019060208201858111156126a557600080fd5b8251600160201b8111828201881017156126be57600080fd5b82525081516020918201929091019080838360005b838110156126eb5781810151838201526020016126d3565b50505050905090810190601f1680156127185780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561276b578181015183820152602001612753565b50505050905090810190601f1680156127985780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156127b557600080fd5b505afa1580156127c9573d6000803e3d6000fd5b505050506040513d60208110156127df57600080fd5b505160408051632e1a7d4d60e01b81526004810185905290519192506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b15801561282d57600080fd5b505af1158015612841573d6000803e3d6000fd5b50505050612857836001600160a01b0316612aa2565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610d11573d6000803e3d6000fd5b60008282111561289e57600080fd5b50900390565b60008082116128b257600080fd5b8183816128bb57fe5b049392505050565b6000826128d257506000611365565b50818102818382816128e057fe5b041461136557600080fd5b600081604201835110156128fe57600080fd5b600083838151811061290c57fe5b016020015160f81c600281111561291f57fe5b848401602181015160418201516042909201519293509160ff16601b81101561294657601b015b8060ff16601b148061295b57508060ff16601c145b61296457600080fd5b600184600281111561297257fe5b14156129ce578760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209750612a34565b60028460028111156129dc57fe5b1415612a34578760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b018281526020019150506040516020818303038152906040528051906020012097505b604080516000815260208082018084528b905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015612a8b573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b90565b604080516060810182526000808252602082018190529181019190915290565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4d61696e636861696e476174657761794d616e616765723a20546f6b656e206973206e6f74206d61707065644d61696e636861696e476174657761794d616e616765723a204d696e74696e6720455243323020746f6b656e20746f2067617465776179206661696c65644d61696e636861696e476174657761794d616e616765723a204552432d323020746f6b656e207472616e73666572206661696c6564546f6b656e206973206e6f74206d6170706564206f7220746f6b656e2074797065206e6f7420737570706f727465644d61696e636861696e476174657761794d616e616765723a204d696e74696e672045524337323120746f6b656e20746f2067617465776179206661696c6564a265627a7a7231582029d3448421279dd0d60222ed01650f8f655c2a56f9e21df340b52d2d8baff0bb64736f6c63430005110032
Deployed Bytecode
0x6080604052600436106101665760003560e01c80638456cb59116100d1578063a7616c3b1161008a578063c7a823e011610064578063c7a823e014610a3c578063d29a4bf614610af4578063eee3f07a14610b2d578063f851a44014610b5357610166565b8063a7616c3b146108c2578063ace77c1914610905578063b02c43d0146109d257610166565b80638456cb591461071357806385eb3a35146107285780638f2839701461076b57806397feb9261461079e578063993e1c42146107d75780639a202d47146108ad57610166565b80635a8143de116101235780635a8143de146103ec5780635c975abb146104c25780635cc07076146104eb57806367a1569b1461053f57806375af64561461060c5780637b103999146106e257610166565b80631a5da6c8146101685780632dfdf0b51461019b5780633afecb8a146101c25780633f4ba83a14610302578063439370b1146103175780634789dcb91461031f575b005b34801561017457600080fd5b506101666004803603602081101561018b57600080fd5b50356001600160a01b0316610b68565b3480156101a757600080fd5b506101b0610ba1565b60408051918252519081900360200190f35b3480156101ce57600080fd5b50610166600480360360608110156101e557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561020f57600080fd5b82018360208201111561022157600080fd5b803590602001918460208302840111600160201b8311171561024257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561029157600080fd5b8201836020820111156102a357600080fd5b803590602001918460208302840111600160201b831117156102c457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ba7945050505050565b34801561030e57600080fd5b50610166610d17565b6101b0610d7c565b34801561032b57600080fd5b506101666004803603608081101561034257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561037857600080fd5b82018360208201111561038a57600080fd5b803590602001918460018302840111600160201b831117156103ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610da4945050505050565b3480156103f857600080fd5b50610166600480360360a081101561040f57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561044e57600080fd5b82018360208201111561046057600080fd5b803590602001918460018302840111600160201b8311171561048157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc8945050505050565b3480156104ce57600080fd5b506104d7610eae565b604080519115158252519081900360200190f35b3480156104f757600080fd5b506105156004803603602081101561050e57600080fd5b5035610ebe565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b34801561054b57600080fd5b506101666004803603608081101561056257600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460018302840111600160201b831117156105cb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610eec945050505050565b34801561061857600080fd5b50610166600480360360a081101561062f57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561066e57600080fd5b82018360208201111561068057600080fd5b803590602001918460018302840111600160201b831117156106a157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f0c945050505050565b3480156106ee57600080fd5b506106f7611152565b604080516001600160a01b039092168252519081900360200190f35b34801561071f57600080fd5b50610166611161565b34801561073457600080fd5b506101b06004803603606081101561074b57600080fd5b506001600160a01b038135811691602081013590911690604001356111cd565b34801561077757600080fd5b506101666004803603602081101561078e57600080fd5b50356001600160a01b03166112b8565b3480156107aa57600080fd5b506101b0600480360360408110156107c157600080fd5b506001600160a01b03813516906020013561133d565b3480156107e357600080fd5b50610166600480360360a08110156107fa57600080fd5b8135916001600160a01b03602082013581169260408301359091169160608101359181019060a081016080820135600160201b81111561083957600080fd5b82018360208201111561084b57600080fd5b803590602001918460018302840111600160201b8311171561086c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061136b945050505050565b3480156108b957600080fd5b50610166611910565b3480156108ce57600080fd5b506101b0600480360360608110156108e557600080fd5b506001600160a01b0381358116916020810135909116906040013561196f565b34801561091157600080fd5b506101666004803603608081101561092857600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561095e57600080fd5b82018360208201111561097057600080fd5b803590602001918460018302840111600160201b8311171561099157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a03945050505050565b3480156109de57600080fd5b506109fc600480360360208110156109f557600080fd5b5035611a27565b604080516001600160a01b0396871681529486166020860152929094168383015263ffffffff166060830152608082019290925290519081900360a00190f35b348015610a4857600080fd5b506104d760048036036040811015610a5f57600080fd5b81359190810190604081016020820135600160201b811115610a8057600080fd5b820183602082011115610a9257600080fd5b803590602001918460018302840111600160201b83111715610ab357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a7c945050505050565b348015610b0057600080fd5b506101b060048036036040811015610b1757600080fd5b506001600160a01b038135169060200135611dfb565b6101b060048036036020811015610b4357600080fd5b50356001600160a01b0316611e20565b348015610b5f57600080fd5b506106f76120a6565b6000546001600160a01b03163314610b7f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60035481565b600154600160a01b900460ff1615610bbe57600080fd5b8051825114610bcc57600080fd5b60005b8251811015610d11576000838281518110610be657fe5b602002602001015190506000838381518110610bfe57fe5b60209081029190910101516002546040805163eb96fbcd60e01b81526001600160a01b038681166004830152600160248301529151939450600093919092169163eb96fbcd916044808301926060929190829003018186803b158015610c6357600080fd5b505afa158015610c77573d6000803e3d6000fd5b505050506040513d6060811015610c8d57600080fd5b50604001519050601463ffffffff82161415610cb457610cae8784846111cd565b50610d06565b8063ffffffff166102d11415610ccf57610cae87848461196f565b60405162461bcd60e51b815260040180806020018281038252602f815260200180612b93602f913960400191505060405180910390fd5b505050600101610bcf565b50505050565b6000546001600160a01b03163314610d2e57600080fd5b600154600160a01b900460ff16610d4457600080fd5b6001805460ff60a01b191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600154600090600160a01b900460ff1615610d9657600080fd5b610d9f33611e20565b905090565b600154600160a01b900460ff1615610dbb57600080fd5b610d11843385858561136b565b600154600160a01b900460ff1615610ddf57600080fd5b6002546040805163eb96fbcd60e01b81526001600160a01b038681166004830152600160248301529151600093929092169163eb96fbcd91604480820192606092909190829003018186803b158015610e3757600080fd5b505afa158015610e4b573d6000803e3d6000fd5b505050506040513d6060811015610e6157600080fd5b50604001519050601463ffffffff82161415610e8957610e84868686868661136b565b610ea6565b8063ffffffff166102d11415610ea657610ea68686868686610f0c565b505050505050565b600154600160a01b900460ff1681565b6005602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b600154600160a01b900460ff1615610f0357600080fd5b610d1184338585855b600154600160a01b900460ff1615610f2357600080fd5b60025460408051631abcf33d60e11b81526001600160a01b0380871660048301526102d16024830181905260016044840152925187949190911691633579e67a916064808301926020929190829003018186803b158015610f8357600080fd5b505afa158015610f97573d6000803e3d6000fd5b505050506040513d6020811015610fad57600080fd5b5051610fea5760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b604080516d776974686472617745524337323160901b602080830191909152602e82018a90526bffffffffffffffffffffffff1960608a811b8216604e85015289901b1660628301526076808301889052835180840390910181526096909201909252805191012061105c8185611a7c565b61106557600080fd5b611071863089886120b5565b61113c57856001600160a01b03166340c10f1988876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b505161113c5760405162461bcd60e51b815260040180806020018281038252603f815260200180612bc2603f913960400191505060405180910390fd5b611148888888886121ad565b5050505050505050565b6002546001600160a01b031681565b6000546001600160a01b0316331461117857600080fd5b600154600160a01b900460ff161561118f57600080fd5b6001805460ff60a01b1916600160a01b1790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b600154600090600160a01b900460ff16156111e757600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd9160648083019260209291908290030181600087803b15801561123c57600080fd5b505af1158015611250573d6000803e3d6000fd5b505050506040513d602081101561126657600080fd5b50516112a35760405162461bcd60e51b8152600401808060200182810382526035815260200180612b5e6035913960400191505060405180910390fd5b6112b084846014856122a0565b949350505050565b6000546001600160a01b031633146112cf57600080fd5b6001600160a01b0381166112e257600080fd5b600080546040516001600160a01b03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff161561135757600080fd5b6113623384846111cd565b90505b92915050565b600154600160a01b900460ff161561138257600080fd5b60025460408051631abcf33d60e11b81526001600160a01b03808716600483015260146024830181905260016044840152925187949190911691633579e67a916064808301926020929190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b50516114485760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b604080516c07769746864726177455243323609c1b602080830191909152602d82018a90526bffffffffffffffffffffffff1960608a811b8216604d85015289901b166061830152607580830188905283518084039091018152609590920190925280519101206114b98185611a7c565b6114c257600080fd5b60025460408051630df49df560e21b815290516001600160a01b039092169163358177739183916337d277d491600480820192600092909190829003018186803b15801561150f57600080fd5b505afa158015611523573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561154c57600080fd5b8101908080516040519392919084600160201b82111561156b57600080fd5b90830190602082018581111561158057600080fd5b8251600160201b81118282018810171561159957600080fd5b82525081516020918201929091019080838360005b838110156115c65781810151838201526020016115ae565b50505050905090810190601f1680156115f35780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561164657818101518382015260200161162e565b50505050905090810190601f1680156116735780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561169057600080fd5b505afa1580156116a4573d6000803e3d6000fd5b505050506040513d60208110156116ba57600080fd5b50516001600160a01b03878116911614156116de576116d987866125e8565b61113c565b604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d602081101561175257600080fd5b5051905085811015611834576001600160a01b0387166340c10f193061177e898563ffffffff61288f16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156117cd57600080fd5b505af11580156117e1573d6000803e3d6000fd5b505050506040513d60208110156117f757600080fd5b50516118345760405162461bcd60e51b815260040180806020018281038252603e815260200180612b20603e913960400191505060405180910390fd5b866001600160a01b031663a9059cbb89886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189457600080fd5b505af11580156118a8573d6000803e3d6000fd5b505050506040513d60208110156118be57600080fd5b5051611903576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b50611148888888886121ad565b6000546001600160a01b0316331461192757600080fd5b600080546040516001600160a01b03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a2600080546001600160a01b0319169055565b600154600090600160a01b900460ff161561198957600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038516916323b872dd91606480830192600092919082900301818387803b1580156119dd57600080fd5b505af11580156119f1573d6000803e3d6000fd5b505050506112b084846102d1856122a0565b600154600160a01b900460ff1615611a1a57600080fd5b610d118433858585610dc8565b60048181548110611a3457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b900463ffffffff169085565b600080611a94604284516128a490919063ffffffff16565b6002546040805163393df8cb60e01b815290519293506000926001600160a01b0390921691633581777391839163393df8cb916004808201928892909190829003018186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611b2357600080fd5b8101908080516040519392919084600160201b821115611b4257600080fd5b908301906020820185811115611b5757600080fd5b8251600160201b811182820188101715611b7057600080fd5b82525081516020918201929091019080838360005b83811015611b9d578181015183820152602001611b85565b50505050905090810190601f168015611bca5780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c1d578181015183820152602001611c05565b50505050905090810190601f168015611c4a5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611c6757600080fd5b505afa158015611c7b573d6000803e3d6000fd5b505050506040513d6020811015611c9157600080fd5b50519050600080805b84811015611d7f576000611cc788611cb984604263ffffffff6128c316565b8b919063ffffffff6128eb16565b9050846001600160a01b031663facd743b826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d6020811015611d4957600080fd5b505115611d57576001909301925b826001600160a01b0316816001600160a01b031611611d7557600080fd5b9150600101611c9a565b50826001600160a01b031663dafae408836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d6020811015611dee57600080fd5b5051979650505050505050565b600154600090600160a01b900460ff1615611e1557600080fd5b61136233848461196f565b600154600090600160a01b900460ff1615611e3a57600080fd5b60025460408051630df49df560e21b815290516000926001600160a01b03169163358177739183916337d277d49160048083019288929190829003018186803b158015611e8657600080fd5b505afa158015611e9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec357600080fd5b8101908080516040519392919084600160201b821115611ee257600080fd5b908301906020820185811115611ef757600080fd5b8251600160201b811182820188101715611f1057600080fd5b82525081516020918201929091019080838360005b83811015611f3d578181015183820152602001611f25565b50505050905090810190601f168015611f6a5780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fbd578181015183820152602001611fa5565b50505050905090810190601f168015611fea5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561200757600080fd5b505afa15801561201b573d6000803e3d6000fd5b505050506040513d602081101561203157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b0383169163d0e30db0913491600480830192600092919082900301818588803b15801561207957600080fd5b505af115801561208d573d6000803e3d6000fd5b505050505061209f83826014346122a0565b9392505050565b6000546001600160a01b031681565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106121395780518252601f19909201916020918201910161211a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461219b576040519150601f19603f3d011682016040523d82523d6000602084013e6121a0565b606091505b5090979650505050505050565b600084815260056020526040902080548591906001600160a01b03161580156121e1575060018101546001600160a01b0316155b6121ea57600080fd5b6121f2612aa5565b50604080516060810182526001600160a01b0380881680835287821660208085018281528587018a815260008e815260058452889020875181549088166001600160a01b03199182161782559251600182018054919098169316929092179095559351600290940193909355845188815294519394909391928b927f86174ea401f083b9bb1bdebca3068f27fb023c7091365ed2a8a02b8d75cf0e529281900390910190a450505050505050565b60025460408051631abcf33d60e11b81526001600160a01b03808716600483015263ffffffff8616602483015260016044830152915160009387938793911691633579e67a91606480820192602092909190829003018186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d602081101561233057600080fd5b505161236d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612af4602c913960400191505060405180910390fd5b6002546040805163eb96fbcd60e01b81526001600160a01b0389811660048301526001602483015291516000938493169163eb96fbcd916044808301926060929190829003018186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d60608110156123ed57600080fd5b506020810151604090910151909250905063ffffffff8781169082161461241357600080fd5b61241b612ac5565b6040518060a001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001846001600160a01b031681526020018963ffffffff1681526020018881525090506004819080600181540180825580915050906001820390600052602060002090600402016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a81548163ffffffff021916908363ffffffff1602179055506080820151816003015550505060036000815480929190600101919050559550886001600160a01b03168a6001600160a01b0316877f72848855a2461abf0dd243723dfcc9163eec2ea5215469d101c0d9c9ef58940d868c8c60405180846001600160a01b03166001600160a01b031681526020018363ffffffff1663ffffffff168152602001828152602001935050505060405180910390a45050505050949350505050565b60025460408051630df49df560e21b815290516000926001600160a01b03169163358177739183916337d277d49160048083019288929190829003018186803b15801561263457600080fd5b505afa158015612648573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561267157600080fd5b8101908080516040519392919084600160201b82111561269057600080fd5b9083019060208201858111156126a557600080fd5b8251600160201b8111828201881017156126be57600080fd5b82525081516020918201929091019080838360005b838110156126eb5781810151838201526020016126d3565b50505050905090810190601f1680156127185780820380516001836020036101000a031916815260200191505b506040525050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561276b578181015183820152602001612753565b50505050905090810190601f1680156127985780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156127b557600080fd5b505afa1580156127c9573d6000803e3d6000fd5b505050506040513d60208110156127df57600080fd5b505160408051632e1a7d4d60e01b81526004810185905290519192506001600160a01b03831691632e1a7d4d9160248082019260009290919082900301818387803b15801561282d57600080fd5b505af1158015612841573d6000803e3d6000fd5b50505050612857836001600160a01b0316612aa2565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610d11573d6000803e3d6000fd5b60008282111561289e57600080fd5b50900390565b60008082116128b257600080fd5b8183816128bb57fe5b049392505050565b6000826128d257506000611365565b50818102818382816128e057fe5b041461136557600080fd5b600081604201835110156128fe57600080fd5b600083838151811061290c57fe5b016020015160f81c600281111561291f57fe5b848401602181015160418201516042909201519293509160ff16601b81101561294657601b015b8060ff16601b148061295b57508060ff16601c145b61296457600080fd5b600184600281111561297257fe5b14156129ce578760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209750612a34565b60028460028111156129dc57fe5b1415612a34578760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b018281526020019150506040516020818303038152906040528051906020012097505b604080516000815260208082018084528b905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015612a8b573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b90565b604080516060810182526000808252602082018190529181019190915290565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe4d61696e636861696e476174657761794d616e616765723a20546f6b656e206973206e6f74206d61707065644d61696e636861696e476174657761794d616e616765723a204d696e74696e6720455243323020746f6b656e20746f2067617465776179206661696c65644d61696e636861696e476174657761794d616e616765723a204552432d323020746f6b656e207472616e73666572206661696c6564546f6b656e206973206e6f74206d6170706564206f7220746f6b656e2074797065206e6f7420737570706f727465644d61696e636861696e476174657761794d616e616765723a204d696e74696e672045524337323120746f6b656e20746f2067617465776179206661696c6564a265627a7a7231582029d3448421279dd0d60222ed01650f8f655c2a56f9e21df340b52d2d8baff0bb64736f6c63430005110032
Deployed Bytecode Sourcemap
20767:8862:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20434:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20434:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20434:105:0;-1:-1:-1;;;;;20434:105:0;;:::i;20306:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20306:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;22900:705;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22900:705:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;22900:705:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;22900:705:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22900:705:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22900:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22900:705:0;;;;;;;;-1:-1:-1;22900:705:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;22900:705:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22900:705:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22900:705:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;22900:705:0;;-1:-1:-1;22900:705:0;;-1:-1:-1;;;;;22900:705:0:i;11850:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11850:96:0;;;:::i;21449:139::-;;;:::i;24515:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24515:292:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24515:292:0;;;-1:-1:-1;;;;;24515:292:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;24515:292:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24515:292:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24515:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;24515:292:0;;-1:-1:-1;24515:292:0;;-1:-1:-1;;;;;24515:292:0:i;23909:600::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23909:600:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;23909:600:0;;;-1:-1:-1;;;;;23909:600:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23909:600:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23909:600:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23909:600:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23909:600:0;;-1:-1:-1;23909:600:0;;-1:-1:-1;;;;;23909:600:0:i;11593:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11593:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;20373:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20373:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20373:54:0;;:::i;:::-;;;;-1:-1:-1;;;;;20373:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25901:296;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25901:296:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;25901:296:0;;;-1:-1:-1;;;;;25901:296:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;25901:296:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25901:296:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25901:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;25901:296:0;;-1:-1:-1;25901:296:0;;-1:-1:-1;;;;;25901:296:0:i;26203:772::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26203:772:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;26203:772:0;;;-1:-1:-1;;;;;26203:772:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26203:772:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26203:772:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26203:772:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;26203:772:0;;-1:-1:-1;26203:772:0;;-1:-1:-1;;;;;26203:772:0:i;20275:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20275:24:0;;;:::i;:::-;;;;-1:-1:-1;;;;;20275:24:0;;;;;;;;;;;;;;11750:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11750:94:0;;;:::i;22261:354::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22261:354:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22261:354:0;;;;;;;;;;;;;;;;;:::i;8171:170::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8171:170:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8171:170:0;-1:-1:-1;;;;;8171:170:0;;:::i;21594:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21594:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21594:178:0;;;;;;;;:::i;24813:1082::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24813:1082:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24813:1082:0;;;-1:-1:-1;;;;;24813:1082:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;24813:1082:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24813:1082:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24813:1082:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;24813:1082:0;;-1:-1:-1;24813:1082:0;;-1:-1:-1;;;;;24813:1082:0:i;8347:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8347:104:0;;;:::i;22621:273::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22621:273:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22621:273:0;;;;;;;;;;;;;;;;;:::i;23611:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23611:292:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;23611:292:0;;;-1:-1:-1;;;;;23611:292:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23611:292:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23611:292:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23611:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23611:292:0;;-1:-1:-1;23611:292:0;;-1:-1:-1;;;;;23611:292:0:i;20338:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20338:30:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20338:30:0;;:::i;:::-;;;;-1:-1:-1;;;;;20338:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27066:730;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27066:730:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27066:730:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27066:730:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27066:730:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27066:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27066:730:0;;-1:-1:-1;27066:730:0;;-1:-1:-1;;;;;27066:730:0:i;21778:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21778:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21778:182:0;;;;;;;;:::i;21966:289::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21966:289:0;-1:-1:-1;;;;;21966:289:0;;:::i;7967:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7967:20:0;;;:::i;20434:105::-;8042:5;;-1:-1:-1;;;;;8042:5:0;8028:10;:19;8020:28;;;;;;20503:8;:30;;-1:-1:-1;;;;;;20503:30:0;-1:-1:-1;;;;;20503:30:0;;;;;;;;;;20434:105::o;20306:27::-;;;;:::o;22900:705::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;23084:13;:20;23066:7;:14;:38;23058:47;;;;;;23119:10;23114:486;23140:7;:14;23135:2;:19;23114:486;;;23171:14;23188:7;23196:2;23188:11;;;;;;;;;;;;;;23171:28;;23208:20;23231:13;23245:2;23231:17;;;;;;;;;;;;;;;;;;23281:8;;:37;;;-1:-1:-1;;;23281:37:0;;-1:-1:-1;;;;;23281:37:0;;;;;;;:8;:37;;;;;;23231:17;;-1:-1:-1;23261:16:0;;23281:8;;;;;:23;;:37;;;;;;;;;;;;;;:8;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;23281:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23281:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23281:37:0;;;;-1:-1:-1;23346:2:0;23333:15;;;;23329:264;;;23361:44;23377:5;23384:6;23392:12;23361:15;:44::i;:::-;;23329:264;;;23425:9;:16;;23438:3;23425:16;23421:172;;;23454:45;23471:5;23478:6;23486:12;23454:16;:45::i;23421:172::-;23526:57;;-1:-1:-1;;;23526:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23421:172;-1:-1:-1;;;23156:4:0;;23114:486;;;;22900:705;;;:::o;11850:96::-;8042:5;;-1:-1:-1;;;;;8042:5:0;8028:10;:19;8020:28;;;;;;11723:6;;-1:-1:-1;;;11723:6:0;;;;11715:15;;;;;;11904:6;:14;;-1:-1:-1;;;;11904:14:0;;;11930:10;;;;11913:5;;11930:10;11850:96::o;21449:139::-;11659:6;;21531:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;21557:25;21571:10;21557:13;:25::i;:::-;21550:32;;21449:139;:::o;24515:292::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;24686:115;24711:13;24733:10;24752:6;24767:7;24783:11;24686:16;:115::i;23909:600::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;24128:8;;:37;;;-1:-1:-1;;;24128:37:0;;-1:-1:-1;;;;;24128:37:0;;;;;;;:8;:37;;;;;;24107:17;;24128:8;;;;;:23;;:37;;;;;;;;;;;;;;;:8;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;24128:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24128:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24128:37:0;;;;-1:-1:-1;24192:2:0;24178:16;;;;24174:330;;;24205:122;24232:13;24256:5;24272:6;24289:7;24307:11;24205:16;:122::i;:::-;24174:330;;;24345:10;:17;;24359:3;24345:17;24341:163;;;24373:123;24401:13;24425:5;24441:6;24458:7;24476:11;24373:17;:123::i;:::-;11673:1;23909:600;;;;;:::o;11593:18::-;;;-1:-1:-1;;;11593:18:0;;;;;:::o;20373:54::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20373:54:0;;;;;;;;;:::o;25901:296::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;26074:117;26100:13;26122:10;26141:6;26156:8;26173:11;26203:772;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;21013:8;;:47;;;-1:-1:-1;;;21013:47:0;;-1:-1:-1;;;;;21013:47:0;;;;;;;26418:3;21013:47;;;;;;:8;:47;;;;;;26410:6;;21013:8;;;;;:22;;:47;;;;;;;;;;;;;;:8;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;21013:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21013:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21013:47:0;20997:125;;;;-1:-1:-1;;;20997:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26467:128;;;-1:-1:-1;;;26467:128:0;;;;;;;;;;;;;;-1:-1:-1;;26467:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26467:128:0;;;;;;;26449:153;;;;;26619:36;26449:153;26643:11;26619:16;:36::i;:::-;26611:45;;;;;;26670:62;26693:6;26709:4;26716:5;26723:8;26670:22;:62::i;:::-;26665:234;;26777:6;-1:-1:-1;;;;;26761:28:0;;26790:5;26797:8;26761:45;;;;;;;;;;;;;-1:-1:-1;;;;;26761:45:0;-1:-1:-1;;;;;26761:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26761:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26761:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26761:45:0;26743:148;;;;-1:-1:-1;;;26743:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26907:62;26930:13;26945:5;26952:6;26960:8;26907:22;:62::i;:::-;21129:1;11673;;26203:772;;;;;:::o;20275:24::-;;;-1:-1:-1;;;;;20275:24:0;;:::o;11750:94::-;8042:5;;-1:-1:-1;;;;;8042:5:0;8028:10;:19;8020:28;;;;;;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;11814:4;11805:13;;-1:-1:-1;;;;11805:13:0;-1:-1:-1;;;11805:13:0;;;11830:8;;;;11805:13;;11830:8;11750:94::o;22261:354::-;11659:6;;22379:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;22414:63;;;-1:-1:-1;;;22414:63:0;;22442:10;22414:63;;;;22462:4;22414:63;;;;;;;;;;;;-1:-1:-1;;;;;22414:27:0;;;;;:63;;;;;;;;;;;;;;-1:-1:-1;22414:27:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;22414:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22414:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22414:63:0;22398:150;;;;-1:-1:-1;;;22398:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22562:47;22582:5;22589:6;22597:2;22601:7;22562:19;:47::i;:::-;22555:54;22261:354;-1:-1:-1;;;;22261:354:0:o;8171:170::-;8042:5;;-1:-1:-1;;;;;8042:5:0;8028:10;:19;8020:28;;;;;;-1:-1:-1;;;;;8245:23:0;;8237:32;;;;;;8294:5;;;8281:30;;-1:-1:-1;;;;;8281:30:0;;;;8294:5;;;8281:30;;;8318:5;:17;;-1:-1:-1;;;;;;8318:17:0;-1:-1:-1;;;;;8318:17:0;;;;;;;;;;8171:170::o;21594:178::-;11659:6;;21696:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;21722:44;21738:10;21750:6;21758:7;21722:15;:44::i;:::-;21715:51;;11673:1;21594:178;;;;:::o;24813:1082::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;21013:8;;:47;;;-1:-1:-1;;;21013:47:0;;-1:-1:-1;;;;;21013:47:0;;;;;;;25026:2;21013:47;;;;;;:8;:47;;;;;;25018:6;;21013:8;;;;;:22;;:47;;;;;;;;;;;;;;:8;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;21013:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21013:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21013:47:0;20997:125;;;;-1:-1:-1;;;20997:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25074:126;;;-1:-1:-1;;;25074:126:0;;;;;;;;;;;;;;-1:-1:-1;;25074:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;25074:126:0;;;;;;;25056:151;;;;;25224:36;25056:151;25248:11;25224:16;:36::i;:::-;25216:45;;;;;;25284:8;;25305:21;;;-1:-1:-1;;;25305:21:0;;;;-1:-1:-1;;;;;25284:8:0;;;;:20;;:8;;25305:19;;:21;;;;;25284:8;;25305:21;;;;;;;;25284:8;25305:21;;;5:2:-1;;;;30:1;27;20:12;5:2;25305:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25305:21:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;25305:21:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;25305:21:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;25305:21:0;;420:4:-1;411:14;;;;25305:21:0;;;;;411:14:-1;25305:21:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25305:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25284:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25284:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25284:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25284:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25284:43:0;-1:-1:-1;;;;;25274:53:0;;;;;;25270:515;;;25338:31;25354:5;25361:7;25338:15;:31::i;:::-;25270:515;;;25418:39;;;-1:-1:-1;;;25418:39:0;;25451:4;25418:39;;;;;;25392:23;;-1:-1:-1;;;;;25418:24:0;;;;;:39;;;;;;;;;;;;;;;:24;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;25418:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25418:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25418:39:0;;-1:-1:-1;25472:25:0;;;25468:232;;;-1:-1:-1;;;;;25530:27:0;;;25566:4;25573:28;:7;25585:15;25573:28;:11;:28;:::i;:::-;25530:72;;;;;;;;;;;;;-1:-1:-1;;;;;25530:72:0;-1:-1:-1;;;;;25530:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25530:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25530:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25530:72:0;25510:180;;;;-1:-1:-1;;;25510:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25725:6;-1:-1:-1;;;;;25718:23:0;;25742:5;25749:7;25718:39;;;;;;;;;;;;;-1:-1:-1;;;;;25718:39:0;-1:-1:-1;;;;;25718:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25718:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25718:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25718:39:0;25710:67;;;;;-1:-1:-1;;;25710:67:0;;;;;;;;;;;;-1:-1:-1;;;25710:67:0;;;;;;;;;;;;;;;25270:515;25793:96;25824:13;25846:5;25860:6;25875:7;25793:22;:96::i;8347:104::-;8042:5;;-1:-1:-1;;;;;8042:5:0;8028:10;:19;8020:28;;;;;;8414:5;;;8401:19;;-1:-1:-1;;;;;8414:5:0;;;;8401:19;;;8443:1;8427:18;;-1:-1:-1;;;;;;8427:18:0;;;8347:104::o;22621:273::-;11659:6;;22741:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;22760:65;;;-1:-1:-1;;;22760:65:0;;22789:10;22760:65;;;;22809:4;22760:65;;;;;;;;;;;;-1:-1:-1;;;;;22760:28:0;;;;;:65;;;;;-1:-1:-1;;22760:65:0;;;;;;;-1:-1:-1;22760:28:0;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;22760:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22760:65:0;;;;22839:49;22859:5;22866:6;22874:3;22879:8;22839:19;:49::i;23611:292::-;11659:6;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;23782:115;23807:13;23829:10;23848:6;23863:7;23879:11;23782:16;:115::i;20338:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20338:30:0;;;;-1:-1:-1;20338:30:0;;;;;;;;-1:-1:-1;;;20338:30:0;;;;;;:::o;27066:730::-;27184:4;27200:23;27226:26;27249:2;27226:11;:18;:22;;:26;;;;:::i;:::-;27294:8;;27315:20;;;-1:-1:-1;;;27315:20:0;;;;27200:52;;-1:-1:-1;27261:20:0;;-1:-1:-1;;;;;27294:8:0;;;;:20;;:8;;27315:18;;:20;;;;;27261;;27315;;;;;;;;27294:8;27315:20;;;5:2:-1;;;;30:1;27;20:12;5:2;27315:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27315:20:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27315:20:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27315:20:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;27315:20:0;;420:4:-1;411:14;;;;27315:20:0;;;;;411:14:-1;27315:20:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27315:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27294:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27294:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27294:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27294:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27294:42:0;;-1:-1:-1;27344:23:0;;;27419:314;27443:15;27439:1;:19;27419:314;;;27474:15;27492:37;27506:11;27519:9;:1;27525:2;27519:9;:5;:9;:::i;:::-;27492:5;;:37;;:13;:37;:::i;:::-;27474:55;;27542:10;-1:-1:-1;;;;;27542:22:0;;27565:7;27542:31;;;;;;;;;;;;;-1:-1:-1;;;;;27542:31:0;-1:-1:-1;;;;;27542:31:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27542:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27542:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27542:31:0;27538:75;;;27586:17;;;;;27538:75;27683:11;-1:-1:-1;;;;;27673:21:0;:7;-1:-1:-1;;;;;27673:21:0;;27665:30;;;;;;27718:7;-1:-1:-1;27460:3:0;;27419:314;;;;27748:10;-1:-1:-1;;;;;27748:25:0;;27774:15;27748:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27748:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27748:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27748:42:0;;27066:730;-1:-1:-1;;;;;;;27066:730:0:o;21778:182::-;11659:6;;21882:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;21908:46;21925:10;21937:6;21945:8;21908:16;:46::i;21966:289::-;11659:6;;22063:7;;-1:-1:-1;;;11659:6:0;;;;11658:7;11650:16;;;;;;22098:8;;22119:21;;;-1:-1:-1;;;22119:21:0;;;;22082:13;;-1:-1:-1;;;;;22098:8:0;;:20;;:8;;22119:19;;:21;;;;;22082:13;;22119:21;;;;;;;22098:8;22119:21;;;5:2:-1;;;;30:1;27;20:12;5:2;22119:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22119:21:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;22119:21:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;22119:21:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;22119:21:0;;420:4:-1;411:14;;;;22119:21:0;;;;;411:14:-1;22119:21:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;22119:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22098:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;22098:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22098:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22098:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22098:43:0;22148:38;;;-1:-1:-1;;;22148:38:0;;;;22098:43;;-1:-1:-1;;;;;;22148:19:0;;;;;22174:9;;22148:38;;;;;;;;;;;;;;22174:9;22148:19;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;22148:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22148:38:0;;;;;22200:49;22220:6;22228:5;22235:2;22239:9;22200:19;:49::i;:::-;22193:56;21966:289;-1:-1:-1;;;21966:289:0:o;7967:20::-;;;-1:-1:-1;;;;;7967:20:0;;:::o;29290:336::-;29491:101;;;-1:-1:-1;;;;;29491:101:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;29491:101:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;29471:128:0;;;;29437:4;;;;29471:11;;;;29491:101;29471:128;;;25:18:-1;29471:128:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;29471:128:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;29453:146:0;;29290:336;-1:-1:-1;;;;;;;29290:336:0:o;28516:408::-;21199:30;21232:26;;;:11;:26;;;;;21273:12;;28682:13;;21232:26;-1:-1:-1;;;;;21273:12:0;:26;:63;;;;-1:-1:-1;21303:19:0;;;;-1:-1:-1;;;;;21303:19:0;:33;21273:63;21265:72;;;;;;28707:29;;:::i;:::-;-1:-1:-1;28739:68:0;;;;;;;;-1:-1:-1;;;;;28739:68:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28816:26:0;;;:11;:26;;;;;:35;;;;;;;-1:-1:-1;;;;;;28816:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28865:53;;;;;;;28739:68;;;;;;28828:13;;28865:53;;;;;;;;;;21344:1;28516:408;;;;;;:::o;27802:708::-;21013:8;;:47;;;-1:-1:-1;;;21013:47:0;;-1:-1:-1;;;;;21013:47:0;;;;;;;;;;;;;;:8;:47;;;;;;27991:18;;27958:6;;27966:9;;21013:8;;;:22;;:47;;;;;;;;;;;;;;;:8;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;21013:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21013:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21013:47:0;20997:125;;;;-1:-1:-1;;;20997:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28073:8;;:37;;;-1:-1:-1;;;28073:37:0;;-1:-1:-1;;;;;28073:37:0;;;;;;;:8;:37;;;;;;28023:23;;;;28073:8;;:23;;:37;;;;;;;;;;;;;;:8;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;28073:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28073:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28073:37:0;;;;;;;;;;;-1:-1:-1;28073:37:0;-1:-1:-1;28125:27:0;;;;;;;;28117:36;;;;;;28162:26;;:::i;:::-;28191:107;;;;;;;;28212:6;-1:-1:-1;;;;;28191:107:0;;;;;28227:6;-1:-1:-1;;;;;28191:107:0;;;;;28242:15;-1:-1:-1;;;;;28191:107:0;;;;;28266:9;28191:107;;;;;;28284:7;28191:107;;;28162:136;;28307:8;28321:6;28307:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;28307:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28307:21:0;;;;;-1:-1:-1;;;;;28307:21:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28307:21:0;;;;;-1:-1:-1;;;;;28307:21:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28307:21:0;;;;;-1:-1:-1;;;;;28307:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28348:12;;:14;;;;;;;;;;;;28335:27;;28433:6;-1:-1:-1;;;;;28376:128:0;28418:6;-1:-1:-1;;;;;28376:128:0;28399:10;28376:128;28448:15;28472:9;28490:7;28376:128;;;;-1:-1:-1;;;;;28376:128:0;-1:-1:-1;;;;;28376:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21129:1;;;27802:708;;;;;;;;:::o;28930:239::-;29042:8;;29063:21;;;-1:-1:-1;;;29063:21:0;;;;29026:13;;-1:-1:-1;;;;;29042:8:0;;:20;;:8;;29063:19;;:21;;;;;29026:13;;29063:21;;;;;;;29042:8;29063:21;;;5:2:-1;;;;30:1;27;20:12;5:2;29063:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29063:21:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29063:21:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;29063:21:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;29063:21:0;;420:4:-1;411:14;;;;29063:21:0;;;;;411:14:-1;29063:21:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29063:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29042:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29042:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29042:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29042:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29042:43:0;29092:29;;;-1:-1:-1;;;29092:29:0;;;;;;;;;;29042:43;;-1:-1:-1;;;;;;29092:20:0;;;;;:29;;;;;-1:-1:-1;;29092:29:0;;;;;;;;-1:-1:-1;29092:20:0;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;29092:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29092:29:0;;;;29128:17;:5;-1:-1:-1;;;;;29128:15:0;;:17::i;:::-;-1:-1:-1;;;;;29128:26:0;:35;29155:7;29128:35;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;1758:116:0;1816:9;1847:1;1842;:6;;1834:15;;;;;;-1:-1:-1;1863:5:0;;;1758:116::o;2048:219::-;2106:9;2240:1;2236;:5;2228:14;;;;;;2260:1;2256;:5;;;;;;;2048:219;-1:-1:-1;;;2048:219:0:o;1880:162::-;1938:9;1960:6;1956:37;;-1:-1:-1;1984:1:0;1977:8;;1956:37;-1:-1:-1;2005:5:0;;;2009:1;2005;:5;:1;2025:5;;;;;:10;2017:19;;;;;400:944;496:15;549:6;558:2;549:11;528:10;:17;:32;;520:41;;;;;;570:19;612:10;623:6;612:18;;;;;;;;;;;;;;592:40;;;;;;;;781:32;;;809:2;781:32;;775:39;862:2;834:32;;828:39;924:2;896:32;;;890:39;570:62;;-1:-1:-1;775:39:0;885:3;881:49;954:2;949:7;;945:38;;;973:2;967:8;945:38;999:2;:8;;1005:2;999:8;:20;;;;1011:2;:8;;1017:2;1011:8;999:20;991:29;;;;;;1042:18;1033:5;:27;;;;;;;;;1029:266;;;1142:5;1089:59;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1089:59:0;;;1079:70;;;;;;1071:78;;1029:266;;;1176:20;1167:5;:29;;;;;;;;;1163:132;;;1280:5;1225:61;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1225:61:0;;;1215:72;;;;;;1207:80;;1163:132;1310:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1310:28:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1310:28:0;;-1:-1:-1;;1310:28:0;;;400:944;-1:-1:-1;;;;;;;;;400:944:0:o;5399:132::-;5515:8;5399:132::o;20767:8862::-;;;;;;;;;-1:-1:-1;20767:8862:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;20767:8862:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://29d3448421279dd0d60222ed01650f8f655c2a56f9e21df340b52d2d8baff0bb
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.