ETH Price: $1,937.33 (+1.35%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00
Transaction Hash
Method
Block
From
To
0xb428771cf5ce0006f0fed6d41e11dfe4904e683bc9f5e0fe5744adad16fbf2b0 Convert By Path(pending)2025-03-09 2:13:526 days ago1741486432IN
Bancor: Swaps
0.00113 ETH(Pending)(Pending)
Convert By Path220549682025-03-15 21:27:472 hrs ago1742074067IN
Bancor: Swaps
0.04 ETH0.000289241.42489522
Convert By Path220549202025-03-15 21:18:112 hrs ago1742073491IN
Bancor: Swaps
0.027 ETH0.000286031.42944032
Convert By Path220544082025-03-15 19:35:474 hrs ago1742067347IN
Bancor: Swaps
0.63421 ETH0.000615113.01232611
Convert By Path220534592025-03-15 16:24:477 hrs ago1742055887IN
Bancor: Swaps
0.03435 ETH0.000107380.53051185
Convert By Path220522382025-03-15 12:19:4711 hrs ago1742041187IN
Bancor: Swaps
0 ETH0.000190.93729325
Convert By Path220433212025-03-14 6:26:5941 hrs ago1741933619IN
Bancor: Swaps
0.00002546 ETH0.000207780.95419854
Convert By Path220395682025-03-13 17:53:592 days ago1741888439IN
Bancor: Swaps
0.06 ETH0.000265571.31208138
Convert By Path220383552025-03-13 13:50:352 days ago1741873835IN
Bancor: Swaps
0 ETH0.000223861.43122537
Convert By Path220379072025-03-13 12:20:232 days ago1741868423IN
Bancor: Swaps
0.05 ETH0.000216761.06310685
Convert By Path220379032025-03-13 12:19:352 days ago1741868375IN
Bancor: Swaps
0.15 ETH0.000215840.9830093
Convert By Path220375052025-03-13 10:59:232 days ago1741863563IN
Bancor: Swaps
0 ETH0.000126090.97880596
Convert By Path220311072025-03-12 13:32:353 days ago1741786355IN
Bancor: Swaps
0.00002445 ETH0.000417881.9231423
Convert By Path220287732025-03-12 5:43:353 days ago1741758215IN
Bancor: Swaps
0.65307 ETH0.000444742.237677
Convert By Path220283422025-03-12 4:17:113 days ago1741753031IN
Bancor: Swaps
0 ETH0.000171591.28407789
Convert By Path220279602025-03-12 3:00:113 days ago1741748411IN
Bancor: Swaps
0 ETH0.000161651.2231596
Convert By Path220257062025-03-11 19:26:354 days ago1741721195IN
Bancor: Swaps
0 ETH0.000340652.14448162
Convert By Path220256512025-03-11 19:15:354 days ago1741720535IN
Bancor: Swaps
0 ETH0.000674773.39751713
Convert By Path220240742025-03-11 13:58:474 days ago1741701527IN
Bancor: Swaps
0 ETH0.000331571.70403322
Convert By Path220234952025-03-11 12:01:594 days ago1741694519IN
Bancor: Swaps
0 ETH0.000199110.9
Convert By Path220228762025-03-11 9:57:234 days ago1741687043IN
Bancor: Swaps
0.00005 ETH0.000294871.32084968
Convert By Path220216832025-03-11 5:56:114 days ago1741672571IN
Bancor: Swaps
0.02775258 ETH0.000573382.63729367
Convert By Path220208402025-03-11 3:06:474 days ago1741662407IN
Bancor: Swaps
0.00001489 ETH0.000188961.30744768
Convert By Path220191502025-03-10 21:27:355 days ago1741642055IN
Bancor: Swaps
0 ETH0.000624.63957035
Convert By Path220187722025-03-10 20:11:355 days ago1741637495IN
Bancor: Swaps
0 ETH0.001047377.83765804
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Convert220555062025-03-15 23:16:2343 mins ago1742080583
Bancor: Swaps
0.55821703 ETH
Convert By Path220555062025-03-15 23:16:2343 mins ago1742080583
Bancor: Swaps
0.55821703 ETH
Convert220554632025-03-15 23:07:3552 mins ago1742080055
Bancor: Swaps
0.30351561 ETH
Convert By Path220554632025-03-15 23:07:3552 mins ago1742080055
Bancor: Swaps
0.30351561 ETH
Convert220554342025-03-15 23:01:4758 mins ago1742079707
Bancor: Swaps
0.58183592 ETH
Convert By Path220554342025-03-15 23:01:4758 mins ago1742079707
Bancor: Swaps
0.58183592 ETH
Convert220554292025-03-15 23:00:471 hrs ago1742079647
Bancor: Swaps
0.44570311 ETH
Convert By Path220554292025-03-15 23:00:471 hrs ago1742079647
Bancor: Swaps
0.44570311 ETH
Convert220554082025-03-15 22:56:351 hr ago1742079395
Bancor: Swaps
0.25048826 ETH
Convert By Path220554082025-03-15 22:56:351 hr ago1742079395
Bancor: Swaps
0.25048826 ETH
Convert220553392025-03-15 22:42:471 hr ago1742078567
Bancor: Swaps
0.17699999 ETH
Convert By Path220553392025-03-15 22:42:471 hr ago1742078567
Bancor: Swaps
0.17699999 ETH
Convert220550592025-03-15 21:46:112 hrs ago1742075171
Bancor: Swaps
0.52499998 ETH
Convert By Path220550592025-03-15 21:46:112 hrs ago1742075171
Bancor: Swaps
0.52499998 ETH
Convert220550582025-03-15 21:45:592 hrs ago1742075159
Bancor: Swaps
0.37460935 ETH
Convert By Path220550582025-03-15 21:45:592 hrs ago1742075159
Bancor: Swaps
0.37460935 ETH
Convert220549682025-03-15 21:27:472 hrs ago1742074067
Bancor: Swaps
0.04 ETH
Convert220549282025-03-15 21:19:472 hrs ago1742073587
Bancor: Swaps
0.64921873 ETH
Convert By Path220549282025-03-15 21:19:472 hrs ago1742073587
Bancor: Swaps
0.64921873 ETH
Convert220549202025-03-15 21:18:112 hrs ago1742073491
Bancor: Swaps
0.027 ETH
Convert220546652025-03-15 20:27:113 hrs ago1742070431
Bancor: Swaps
0.15953113 ETH
Convert By Path220546652025-03-15 20:27:113 hrs ago1742070431
Bancor: Swaps
0.15953113 ETH
Convert220546222025-03-15 20:18:353 hrs ago1742069915
Bancor: Swaps
0.00275357 ETH
Convert220546222025-03-15 20:18:353 hrs ago1742069915
Bancor: Swaps
0.00275357 ETH
Convert220545342025-03-15 20:00:593 hrs ago1742068859
Bancor: Swaps
0.07267647 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BancorNetwork

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-06-18
*/

// File: contracts/token/interfaces/IERC20Token.sol

pragma solidity 0.4.26;

/*
    ERC20 Standard Token interface
*/
contract IERC20Token {
    // these functions aren't abstract since the compiler emits automatically generated getter functions as external
    function name() public view returns (string) {this;}
    function symbol() public view returns (string) {this;}
    function decimals() public view returns (uint8) {this;}
    function totalSupply() public view returns (uint256) {this;}
    function balanceOf(address _owner) public view returns (uint256) {_owner; this;}
    function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;}

    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
}

// File: contracts/IBancorNetwork.sol

pragma solidity 0.4.26;


/*
    Bancor Network interface
*/
contract IBancorNetwork {
    function convert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public payable returns (uint256);

    function claimAndConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public returns (uint256);

    function convertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public payable returns (uint256);

    function claimAndConvertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) public returns (uint256);

    // deprecated, backward compatibility
    function convert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn
    ) public payable returns (uint256);

    // deprecated, backward compatibility
    function claimAndConvert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn
    ) public returns (uint256);

    // deprecated, backward compatibility
    function convertFor(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for
    ) public payable returns (uint256);

    // deprecated, backward compatibility
    function claimAndConvertFor(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _for
    ) public returns (uint256);
}

// File: contracts/IConversionPathFinder.sol

pragma solidity 0.4.26;


/*
    Conversion Path Finder interface
*/
contract IConversionPathFinder {
    function findPath(address _sourceToken, address _targetToken) public view returns (address[] memory);
}

// File: contracts/utility/interfaces/IOwned.sol

pragma solidity 0.4.26;

/*
    Owned contract interface
*/
contract IOwned {
    // this function isn't abstract since the compiler emits automatically generated getter functions as external
    function owner() public view returns (address) {this;}

    function transferOwnership(address _newOwner) public;
    function acceptOwnership() public;
}

// File: contracts/utility/interfaces/ITokenHolder.sol

pragma solidity 0.4.26;



/*
    Token Holder interface
*/
contract ITokenHolder is IOwned {
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
}

// File: contracts/converter/interfaces/IConverterAnchor.sol

pragma solidity 0.4.26;



/*
    Converter Anchor interface
*/
contract IConverterAnchor is IOwned, ITokenHolder {
}

// File: contracts/utility/interfaces/IWhitelist.sol

pragma solidity 0.4.26;

/*
    Whitelist interface
*/
contract IWhitelist {
    function isWhitelisted(address _address) public view returns (bool);
}

// File: contracts/converter/interfaces/IConverter.sol

pragma solidity 0.4.26;





/*
    Converter interface
*/
contract IConverter is IOwned {
    function converterType() public pure returns (uint16);
    function anchor() public view returns (IConverterAnchor) {this;}
    function isActive() public view returns (bool);

    function rateAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256);
    function convert(IERC20Token _sourceToken,
                     IERC20Token _targetToken,
                     uint256 _amount,
                     address _trader,
                     address _beneficiary) public payable returns (uint256);

    function conversionWhitelist() public view returns (IWhitelist) {this;}
    function conversionFee() public view returns (uint32) {this;}
    function maxConversionFee() public view returns (uint32) {this;}
    function reserveBalance(IERC20Token _reserveToken) public view returns (uint256);
    function() external payable;

    function transferAnchorOwnership(address _newOwner) public;
    function acceptAnchorOwnership() public;
    function setConversionFee(uint32 _conversionFee) public;
    function setConversionWhitelist(IWhitelist _whitelist) public;
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
    function withdrawETH(address _to) public;
    function addReserve(IERC20Token _token, uint32 _ratio) public;

    // deprecated, backward compatibility
    function token() public view returns (IConverterAnchor);
    function transferTokenOwnership(address _newOwner) public;
    function acceptTokenOwnership() public;
    function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool);
    function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256);
    function connectorTokens(uint256 _index) public view returns (IERC20Token);
    function connectorTokenCount() public view returns (uint16);
}

// File: contracts/converter/interfaces/IBancorFormula.sol

pragma solidity 0.4.26;

/*
    Bancor Formula interface
*/
contract IBancorFormula {
    function purchaseRate(uint256 _supply,
                          uint256 _reserveBalance,
                          uint32 _reserveWeight,
                          uint256 _amount)
                          public view returns (uint256);

    function saleRate(uint256 _supply,
                      uint256 _reserveBalance,
                      uint32 _reserveWeight,
                      uint256 _amount)
                      public view returns (uint256);

    function crossReserveRate(uint256 _sourceReserveBalance,
                              uint32 _sourceReserveWeight,
                              uint256 _targetReserveBalance,
                              uint32 _targetReserveWeight,
                              uint256 _amount)
                              public view returns (uint256);

    function fundCost(uint256 _supply,
                      uint256 _reserveBalance,
                      uint32 _reserveRatio,
                      uint256 _amount)
                      public view returns (uint256);

    function liquidateRate(uint256 _supply,
                           uint256 _reserveBalance,
                           uint32 _reserveRatio,
                           uint256 _amount)
                           public view returns (uint256);
}

// File: contracts/utility/Owned.sol

pragma solidity 0.4.26;


/**
  * @dev Provides support and utilities for contract ownership
*/
contract Owned is IOwned {
    address public owner;
    address public newOwner;

    /**
      * @dev triggered when the owner is updated
      *
      * @param _prevOwner previous owner
      * @param _newOwner  new owner
    */
    event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner);

    /**
      * @dev initializes a new Owned instance
    */
    constructor() public {
        owner = msg.sender;
    }

    // allows execution by the owner only
    modifier ownerOnly {
        _ownerOnly();
        _;
    }

    // error message binary size optimization
    function _ownerOnly() internal view {
        require(msg.sender == owner, "ERR_ACCESS_DENIED");
    }

    /**
      * @dev allows transferring the contract ownership
      * the new owner still needs to accept the transfer
      * can only be called by the contract owner
      *
      * @param _newOwner    new contract owner
    */
    function transferOwnership(address _newOwner) public ownerOnly {
        require(_newOwner != owner, "ERR_SAME_OWNER");
        newOwner = _newOwner;
    }

    /**
      * @dev used by a new owner to accept an ownership transfer
    */
    function acceptOwnership() public {
        require(msg.sender == newOwner, "ERR_ACCESS_DENIED");
        emit OwnerUpdate(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

// File: contracts/utility/Utils.sol

pragma solidity 0.4.26;

/**
  * @dev Utilities & Common Modifiers
*/
contract Utils {
    // verifies that a value is greater than zero
    modifier greaterThanZero(uint256 _value) {
        _greaterThanZero(_value);
        _;
    }

    // error message binary size optimization
    function _greaterThanZero(uint256 _value) internal pure {
        require(_value > 0, "ERR_ZERO_VALUE");
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        _validAddress(_address);
        _;
    }

    // error message binary size optimization
    function _validAddress(address _address) internal pure {
        require(_address != address(0), "ERR_INVALID_ADDRESS");
    }

    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        _notThis(_address);
        _;
    }

    // error message binary size optimization
    function _notThis(address _address) internal view {
        require(_address != address(this), "ERR_ADDRESS_IS_SELF");
    }
}

// File: contracts/utility/interfaces/IContractRegistry.sol

pragma solidity 0.4.26;

/*
    Contract Registry interface
*/
contract IContractRegistry {
    function addressOf(bytes32 _contractName) public view returns (address);

    // deprecated, backward compatibility
    function getAddress(bytes32 _contractName) public view returns (address);
}

// File: contracts/utility/ContractRegistryClient.sol

pragma solidity 0.4.26;




/**
  * @dev Base contract for ContractRegistry clients
*/
contract ContractRegistryClient is Owned, Utils {
    bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry";
    bytes32 internal constant BANCOR_NETWORK = "BancorNetwork";
    bytes32 internal constant BANCOR_FORMULA = "BancorFormula";
    bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory";
    bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder";
    bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader";
    bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry";
    bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData";
    bytes32 internal constant BNT_TOKEN = "BNTToken";
    bytes32 internal constant BANCOR_X = "BancorX";
    bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader";

    IContractRegistry public registry;      // address of the current contract-registry
    IContractRegistry public prevRegistry;  // address of the previous contract-registry
    bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry

    /**
      * @dev verifies that the caller is mapped to the given contract name
      *
      * @param _contractName    contract name
    */
    modifier only(bytes32 _contractName) {
        _only(_contractName);
        _;
    }

    // error message binary size optimization
    function _only(bytes32 _contractName) internal view {
        require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED");
    }

    /**
      * @dev initializes a new ContractRegistryClient instance
      *
      * @param  _registry   address of a contract-registry contract
    */
    constructor(IContractRegistry _registry) internal validAddress(_registry) {
        registry = IContractRegistry(_registry);
        prevRegistry = IContractRegistry(_registry);
    }

    /**
      * @dev updates to the new contract-registry
     */
    function updateRegistry() public {
        // verify that this function is permitted
        require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED");

        // get the new contract-registry
        IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY));

        // verify that the new contract-registry is different and not zero
        require(newRegistry != address(registry) && newRegistry != address(0), "ERR_INVALID_REGISTRY");

        // verify that the new contract-registry is pointing to a non-zero contract-registry
        require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY");

        // save a backup of the current contract-registry before replacing it
        prevRegistry = registry;

        // replace the current contract-registry with the new contract-registry
        registry = newRegistry;
    }

    /**
      * @dev restores the previous contract-registry
    */
    function restoreRegistry() public ownerOnly {
        // restore the previous contract-registry
        registry = prevRegistry;
    }

    /**
      * @dev restricts the permission to update the contract-registry
      *
      * @param _onlyOwnerCanUpdateRegistry  indicates whether or not permission is restricted to owner only
    */
    function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly {
        // change the permission to update the contract-registry
        onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry;
    }

    /**
      * @dev returns the address associated with the given contract name
      *
      * @param _contractName    contract name
      *
      * @return contract address
    */
    function addressOf(bytes32 _contractName) internal view returns (address) {
        return registry.addressOf(_contractName);
    }
}

// File: contracts/utility/ReentrancyGuard.sol

pragma solidity 0.4.26;

/**
  * @dev ReentrancyGuard
  *
  * The contract provides protection against re-entrancy - calling a function (directly or
  * indirectly) from within itself.
*/
contract ReentrancyGuard {
    // true while protected code is being executed, false otherwise
    bool private locked = false;

    /**
      * @dev ensures instantiation only by sub-contracts
    */
    constructor() internal {}

    // protects a function against reentrancy attacks
    modifier protected() {
        _protected();
        locked = true;
        _;
        locked = false;
    }

    // error message binary size optimization
    function _protected() internal view {
        require(!locked, "ERR_REENTRANCY");
    }
}

// File: contracts/utility/TokenHandler.sol

pragma solidity 0.4.26;


contract TokenHandler {
    bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)"));
    bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)"));
    bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)"));

    /**
      * @dev executes the ERC20 token's `approve` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _spender approved address
      * @param _value   allowance amount
    */
    function safeApprove(IERC20Token _token, address _spender, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value));
    }

    /**
      * @dev executes the ERC20 token's `transfer` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _to      target address
      * @param _value   transfer amount
    */
    function safeTransfer(IERC20Token _token, address _to, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value));
    }

    /**
      * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _from    source address
      * @param _to      target address
      * @param _value   transfer amount
    */
    function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) internal {
       execute(_token, abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value));
    }

    /**
      * @dev executes a function on the ERC20 token and reverts upon failure
      * the main purpose of this function is to prevent a non standard ERC20 token
      * from failing silently
      *
      * @param _token   ERC20 token address
      * @param _data    data to pass in to the token's contract for execution
    */
    function execute(IERC20Token _token, bytes memory _data) private {
        uint256[1] memory ret = [uint256(1)];

        assembly {
            let success := call(
                gas,            // gas remaining
                _token,         // destination address
                0,              // no ether
                add(_data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(_data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,            // output buffer
                32              // output length
            )
            if iszero(success) {
                revert(0, 0)
            }
        }

        require(ret[0] != 0, "ERR_TRANSFER_FAILED");
    }
}

// File: contracts/utility/TokenHolder.sol

pragma solidity 0.4.26;






/**
  * @dev We consider every contract to be a 'token holder' since it's currently not possible
  * for a contract to deny receiving tokens.
  *
  * The TokenHolder's contract sole purpose is to provide a safety mechanism that allows
  * the owner to send tokens that were sent to the contract by mistake back to their sender.
  *
  * Note that we use the non standard ERC-20 interface which has no return value for transfer
  * in order to support both non standard as well as standard token contracts.
  * see https://github.com/ethereum/solidity/issues/4116
*/
contract TokenHolder is ITokenHolder, TokenHandler, Owned, Utils {
    /**
      * @dev withdraws tokens held by the contract and sends them to an account
      * can only be called by the owner
      *
      * @param _token   ERC20 token contract address
      * @param _to      account to receive the new amount
      * @param _amount  amount to withdraw
    */
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount)
        public
        ownerOnly
        validAddress(_token)
        validAddress(_to)
        notThis(_to)
    {
        safeTransfer(_token, _to, _amount);
    }
}

// File: contracts/utility/SafeMath.sol

pragma solidity 0.4.26;

/**
  * @dev Library for basic math operations with overflow/underflow protection
*/
library SafeMath {
    /**
      * @dev returns the sum of _x and _y, reverts if the calculation overflows
      *
      * @param _x   value 1
      * @param _y   value 2
      *
      * @return sum
    */
    function add(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x + _y;
        require(z >= _x, "ERR_OVERFLOW");
        return z;
    }

    /**
      * @dev returns the difference of _x minus _y, reverts if the calculation underflows
      *
      * @param _x   minuend
      * @param _y   subtrahend
      *
      * @return difference
    */
    function sub(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_x >= _y, "ERR_UNDERFLOW");
        return _x - _y;
    }

    /**
      * @dev returns the product of multiplying _x by _y, reverts if the calculation overflows
      *
      * @param _x   factor 1
      * @param _y   factor 2
      *
      * @return product
    */
    function mul(uint256 _x, uint256 _y) internal pure returns (uint256) {
        // gas optimization
        if (_x == 0)
            return 0;

        uint256 z = _x * _y;
        require(z / _x == _y, "ERR_OVERFLOW");
        return z;
    }

    /**
      * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
      *
      * @param _x   dividend
      * @param _y   divisor
      *
      * @return quotient
    */
    function div(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_y > 0, "ERR_DIVIDE_BY_ZERO");
        uint256 c = _x / _y;
        return c;
    }
}

// File: contracts/token/interfaces/IEtherToken.sol

pragma solidity 0.4.26;


/*
    Ether Token interface
*/
contract IEtherToken is IERC20Token {
    function deposit() public payable;
    function withdraw(uint256 _amount) public;
    function depositTo(address _to) public payable;
    function withdrawTo(address _to, uint256 _amount) public;
}

// File: contracts/token/interfaces/ISmartToken.sol

pragma solidity 0.4.26;




/*
    Smart Token interface
*/
contract ISmartToken is IConverterAnchor, IERC20Token {
    function disableTransfers(bool _disable) public;
    function issue(address _to, uint256 _amount) public;
    function destroy(address _from, uint256 _amount) public;
}

// File: contracts/bancorx/interfaces/IBancorX.sol

pragma solidity 0.4.26;


contract IBancorX {
    function token() public view returns (IERC20Token) {this;}
    function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public;
    function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256);
}

// File: contracts/BancorNetwork.sol

pragma solidity 0.4.26;













// interface of older converters for backward compatibility
contract ILegacyConverter {
    function change(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, uint256 _minReturn) public returns (uint256);
}

/**
  * @dev The BancorNetwork contract is the main entry point for Bancor token conversions.
  * It also allows for the conversion of any token in the Bancor Network to any other token in a single
  * transaction by providing a conversion path.
  *
  * A note on Conversion Path: Conversion path is a data structure that is used when converting a token
  * to another token in the Bancor Network, when the conversion cannot necessarily be done by a single
  * converter and might require multiple 'hops'.
  * The path defines which converters should be used and what kind of conversion should be done in each step.
  *
  * The path format doesn't include complex structure; instead, it is represented by a single array
  * in which each 'hop' is represented by a 2-tuple - converter anchor & target token.
  * In addition, the first element is always the source token.
  * The converter anchor is only used as a pointer to a converter (since converter addresses are more
  * likely to change as opposed to anchor addresses).
  *
  * Format:
  * [source token, converter anchor, target token, converter anchor, target token...]
*/
contract BancorNetwork is IBancorNetwork, TokenHolder, ContractRegistryClient, ReentrancyGuard {
    using SafeMath for uint256;

    uint256 private constant CONVERSION_FEE_RESOLUTION = 1000000;
    uint256 private constant AFFILIATE_FEE_RESOLUTION = 1000000;
    address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    struct ConversionStep {
        IConverter converter;
        IConverterAnchor anchor;
        IERC20Token sourceToken;
        IERC20Token targetToken;
        address beneficiary;
        bool isV28OrHigherConverter;
        bool processAffiliateFee;
    }

    uint256 public maxAffiliateFee = 30000;     // maximum affiliate-fee

    mapping (address => bool) public etherTokens;       // list of all supported ether tokens

    /**
      * @dev triggered when a conversion between two tokens occurs
      *
      * @param _smartToken  anchor governed by the converter
      * @param _fromToken   source ERC20 token
      * @param _toToken     target ERC20 token
      * @param _fromAmount  amount converted, in the source token
      * @param _toAmount    amount returned, minus conversion fee
      * @param _trader      wallet that initiated the trade
    */
    event Conversion(
        address indexed _smartToken,
        address indexed _fromToken,
        address indexed _toToken,
        uint256 _fromAmount,
        uint256 _toAmount,
        address _trader
    );

    /**
      * @dev initializes a new BancorNetwork instance
      *
      * @param _registry    address of a contract registry contract
    */
    constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public {
        etherTokens[ETH_RESERVE_ADDRESS] = true;
    }

    /**
      * @dev allows the owner to update the maximum affiliate-fee
      *
      * @param _maxAffiliateFee   maximum affiliate-fee
    */
    function setMaxAffiliateFee(uint256 _maxAffiliateFee)
        public
        ownerOnly
    {
        require(_maxAffiliateFee <= AFFILIATE_FEE_RESOLUTION, "ERR_INVALID_AFFILIATE_FEE");
        maxAffiliateFee = _maxAffiliateFee;
    }

    /**
      * @dev allows the owner to register/unregister ether tokens
      *
      * @param _token       ether token contract address
      * @param _register    true to register, false to unregister
    */
    function registerEtherToken(IEtherToken _token, bool _register)
        public
        ownerOnly
        validAddress(_token)
        notThis(_token)
    {
        etherTokens[_token] = _register;
    }

    /**
      * @dev returns the conversion path between two tokens in the network
      * note that this method is quite expensive in terms of gas and should generally be called off-chain
      *
      * @param _sourceToken source token address
      * @param _targetToken target token address
      *
      * @return conversion path between the two tokens
    */
    function conversionPath(IERC20Token _sourceToken, IERC20Token _targetToken) public view returns (address[]) {
        IConversionPathFinder pathFinder = IConversionPathFinder(addressOf(CONVERSION_PATH_FINDER));
        return pathFinder.findPath(_sourceToken, _targetToken);
    }

    /**
      * @dev returns the expected rate of converting a given amount on a given path
      * note that there is no support for circular paths
      *
      * @param _path        conversion path (see conversion path format above)
      * @param _amount      amount of _path[0] tokens received from the sender
      *
      * @return expected rate
    */
    function rateByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256) {
        uint256 amount;
        uint256 fee;
        uint256 supply;
        uint256 balance;
        uint32 weight;
        IConverter converter;
        IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA));

        amount = _amount;

        // verify that the number of elements is larger than 2 and odd
        require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH");

        // iterate over the conversion path
        for (uint256 i = 2; i < _path.length; i += 2) {
            IERC20Token sourceToken = _path[i - 2];
            IERC20Token anchor = _path[i - 1];
            IERC20Token targetToken = _path[i];

            converter = IConverter(IConverterAnchor(anchor).owner());

            // backward compatibility
            sourceToken = getConverterTokenAddress(converter, sourceToken);
            targetToken = getConverterTokenAddress(converter, targetToken);

            if (targetToken == anchor) { // buy the smart token
                // check if the current smart token has changed
                if (i < 3 || anchor != _path[i - 3])
                    supply = ISmartToken(anchor).totalSupply();

                // get the amount & the conversion fee
                balance = converter.getConnectorBalance(sourceToken);
                (, weight, , , ) = converter.connectors(sourceToken);
                amount = formula.purchaseRate(supply, balance, weight, amount);
                fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION);
                amount -= fee;

                // update the smart token supply for the next iteration
                supply = supply.add(amount);
            }
            else if (sourceToken == anchor) { // sell the smart token
                // check if the current smart token has changed
                if (i < 3 || anchor != _path[i - 3])
                    supply = ISmartToken(anchor).totalSupply();

                // get the amount & the conversion fee
                balance = converter.getConnectorBalance(targetToken);
                (, weight, , , ) = converter.connectors(targetToken);
                amount = formula.saleRate(supply, balance, weight, amount);
                fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION);
                amount -= fee;

                // update the smart token supply for the next iteration
                supply = supply.sub(amount);
            }
            else { // cross reserve conversion
                (amount, fee) = getReturn(converter, sourceToken, targetToken, amount);
            }
        }

        return amount;
    }

    /**
      * @dev converts the token to any other token in the bancor network by following
      * a predefined conversion path and transfers the result tokens to a target account
      * affiliate account/fee can also be passed in to receive a conversion fee (on top of the liquidity provider fees)
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _beneficiary         account that will receive the conversion result or 0x0 to send the result to the sender account
      * @param _affiliateAccount    wallet address to receive the affiliate fee or 0x0 to disable affiliate fee
      * @param _affiliateFee        affiliate fee in PPM or 0 to disable affiliate fee
      *
      * @return amount of tokens received from the conversion
    */
    function convertByPath(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee)
        public
        payable
        protected
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        // verify that the path contrains at least a single 'hop' and that the number of elements is odd
        require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH");

        // validate msg.value and prepare the source token for the conversion
        handleSourceToken(_path[0], IConverterAnchor(_path[1]), _amount);

        // check if affiliate fee is enabled
        bool affiliateFeeEnabled = false;
        if (address(_affiliateAccount) == 0) {
            require(_affiliateFee == 0, "ERR_INVALID_AFFILIATE_FEE");
        }
        else {
            require(0 < _affiliateFee && _affiliateFee <= maxAffiliateFee, "ERR_INVALID_AFFILIATE_FEE");
            affiliateFeeEnabled = true;
        }

        // check if beneficiary is set
        address beneficiary = msg.sender;
        if (_beneficiary != address(0))
            beneficiary = _beneficiary;

        // convert and get the resulting amount
        ConversionStep[] memory data = createConversionData(_path, beneficiary, affiliateFeeEnabled);
        uint256 amount = doConversion(data, _amount, _minReturn, _affiliateAccount, _affiliateFee);

        // handle the conversion target tokens
        handleTargetToken(data, amount, beneficiary);

        return amount;
    }

    /**
      * @dev converts any other token to BNT in the bancor network by following
      a predefined conversion path and transfers the result to an account on a different blockchain
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _targetBlockchain    blockchain BNT will be issued on
      * @param _targetAccount       address/account on the target blockchain to send the BNT to
      * @param _conversionId        pre-determined unique (if non zero) id which refers to this transaction
      *
      * @return the amount of BNT received from this conversion
    */
    function xConvert(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        bytes32 _targetBlockchain,
        bytes32 _targetAccount,
        uint256 _conversionId
    )
        public
        payable
        returns (uint256)
    {
        return xConvert2(_path, _amount, _minReturn, _targetBlockchain, _targetAccount, _conversionId, address(0), 0);
    }

    /**
      * @dev converts any other token to BNT in the bancor network by following
      a predefined conversion path and transfers the result to an account on a different blockchain
      * note that the network should already have been given allowance of the source token (if not ETH)
      *
      * @param _path                conversion path, see conversion path format above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _targetBlockchain    blockchain BNT will be issued on
      * @param _targetAccount       address/account on the target blockchain to send the BNT to
      * @param _conversionId        pre-determined unique (if non zero) id which refers to this transaction
      * @param _affiliateAccount    affiliate account
      * @param _affiliateFee        affiliate fee in PPM
      *
      * @return the amount of BNT received from this conversion
    */
    function xConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        bytes32 _targetBlockchain,
        bytes32 _targetAccount,
        uint256 _conversionId,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        IERC20Token targetToken = _path[_path.length - 1];
        IBancorX bancorX = IBancorX(addressOf(BANCOR_X));

        // verify that the destination token is BNT
        require(targetToken == addressOf(BNT_TOKEN), "ERR_INVALID_TARGET_TOKEN");

        // convert and get the resulting amount
        uint256 amount = convertByPath(_path, _amount, _minReturn, this, _affiliateAccount, _affiliateFee);

        // grant BancorX allowance
        ensureAllowance(targetToken, bancorX, amount);

        // transfer the resulting amount to BancorX
        bancorX.xTransfer(_targetBlockchain, _targetAccount, amount, _conversionId);

        return amount;
    }

    /**
      * @dev allows a user to convert a token that was sent from another blockchain into any other
      * token on the BancorNetwork
      * ideally this transaction is created before the previous conversion is even complete, so
      * so the input amount isn't known at that point - the amount is actually take from the
      * BancorX contract directly by specifying the conversion id
      *
      * @param _path            conversion path
      * @param _bancorX         address of the BancorX contract for the source token
      * @param _conversionId    pre-determined unique (if non zero) id which refers to this conversion
      * @param _minReturn       if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero
      * @param _beneficiary     wallet to receive the conversion result
      *
      * @return amount of tokens received from the conversion
    */
    function completeXConversion(IERC20Token[] _path, IBancorX _bancorX, uint256 _conversionId, uint256 _minReturn, address _beneficiary)
        public returns (uint256)
    {
        // verify that the source token is the BancorX token
        require(_path[0] == _bancorX.token(), "ERR_INVALID_SOURCE_TOKEN");

        // get conversion amount from BancorX contract
        uint256 amount = _bancorX.getXTransferAmount(_conversionId, msg.sender);

        // perform the conversion
        return convertByPath(_path, amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev executes the actual conversion by following the conversion path
      *
      * @param _data                conversion data, see ConversionStep struct above
      * @param _amount              amount to convert from, in the source token
      * @param _minReturn           if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero
      * @param _affiliateAccount    affiliate account
      * @param _affiliateFee        affiliate fee in PPM
      *
      * @return amount of tokens received from the conversion
    */
    function doConversion(
        ConversionStep[] _data,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    ) private returns (uint256) {
        uint256 toAmount;
        uint256 fromAmount = _amount;

        // iterate over the conversion data
        for (uint256 i = 0; i < _data.length; i++) {
            ConversionStep memory stepData = _data[i];

            // newer converter
            if (stepData.isV28OrHigherConverter) {
                // transfer the tokens to the converter only if the network contract currently holds the tokens
                // not needed with ETH or if it's the first conversion step
                if (i != 0 && _data[i - 1].beneficiary == address(this) && !etherTokens[stepData.sourceToken])
                    safeTransfer(stepData.sourceToken, stepData.converter, fromAmount);
            }
            // older converter
            // if the source token is the smart token, no need to do any transfers as the converter controls it
            else if (stepData.sourceToken != ISmartToken(stepData.anchor)) {
                // grant allowance for it to transfer the tokens from the network contract
                ensureAllowance(stepData.sourceToken, stepData.converter, fromAmount);
            }

            // do the conversion
            if (!stepData.isV28OrHigherConverter)
                toAmount = ILegacyConverter(stepData.converter).change(stepData.sourceToken, stepData.targetToken, fromAmount, 1);
            else if (etherTokens[stepData.sourceToken])
                toAmount = stepData.converter.convert.value(msg.value)(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary);
            else
                toAmount = stepData.converter.convert(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary);

            // pay affiliate-fee if needed
            if (stepData.processAffiliateFee) {
                uint256 affiliateAmount = toAmount.mul(_affiliateFee).div(AFFILIATE_FEE_RESOLUTION);
                require(stepData.targetToken.transfer(_affiliateAccount, affiliateAmount), "ERR_FEE_TRANSFER_FAILED");
                toAmount -= affiliateAmount;
            }

            emit Conversion(stepData.anchor, stepData.sourceToken, stepData.targetToken, fromAmount, toAmount, msg.sender);
            fromAmount = toAmount;
        }

        // ensure the trade meets the minimum requested amount
        require(toAmount >= _minReturn, "ERR_RETURN_TOO_LOW");

        return toAmount;
    }

    /**
      * @dev validates msg.value and prepares the conversion source token for the conversion
      *
      * @param _sourceToken source token of the first conversion step
      * @param _anchor      converter anchor of the first conversion step
      * @param _amount      amount to convert from, in the source token
    */
    function handleSourceToken(IERC20Token _sourceToken, IConverterAnchor _anchor, uint256 _amount) private {
        IConverter firstConverter = IConverter(_anchor.owner());
        bool isNewerConverter = isV28OrHigherConverter(firstConverter);

        // ETH
        if (msg.value > 0) {
            // validate msg.value
            require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH");

            // EtherToken converter - deposit the ETH into the EtherToken
            // note that it can still be a non ETH converter if the path is wrong
            // but such conversion will simply revert
            if (!isNewerConverter)
                IEtherToken(getConverterEtherTokenAddress(firstConverter)).deposit.value(msg.value)();
        }
        // EtherToken
        else if (etherTokens[_sourceToken]) {
            // claim the tokens - if the source token is ETH reserve, this call will fail
            // since in that case the transaction must be sent with msg.value
            safeTransferFrom(_sourceToken, msg.sender, this, _amount);

            // ETH converter - withdraw the ETH
            if (isNewerConverter)
                IEtherToken(_sourceToken).withdraw(_amount);
        }
        // other ERC20 token
        else {
            // newer converter - transfer the tokens from the sender directly to the converter
            // otherwise claim the tokens
            if (isNewerConverter)
                safeTransferFrom(_sourceToken, msg.sender, firstConverter, _amount);
            else
                safeTransferFrom(_sourceToken, msg.sender, this, _amount);
        }
    }

    /**
      * @dev handles the conversion target token if the network still holds it at the end of the conversion
      *
      * @param _data        conversion data, see ConversionStep struct above
      * @param _amount      conversion return amount, in the target token
      * @param _beneficiary wallet to receive the conversion result
    */
    function handleTargetToken(ConversionStep[] _data, uint256 _amount, address _beneficiary) private {
        ConversionStep memory stepData = _data[_data.length - 1];

        // network contract doesn't hold the tokens, do nothing
        if (stepData.beneficiary != address(this))
            return;

        IERC20Token targetToken = stepData.targetToken;

        // ETH / EtherToken
        if (etherTokens[targetToken]) {
            // newer converter should send ETH directly to the beneficiary
            assert(!stepData.isV28OrHigherConverter);

            // EtherToken converter - withdraw the ETH and transfer to the beneficiary
            IEtherToken(targetToken).withdrawTo(_beneficiary, _amount);
        }
        // other ERC20 token
        else {
            safeTransfer(targetToken, _beneficiary, _amount);
        }
    }

    /**
      * @dev creates a memory cache of all conversion steps data to minimize logic and external calls during conversions
      *
      * @param _conversionPath      conversion path, see conversion path format above
      * @param _beneficiary         wallet to receive the conversion result
      * @param _affiliateFeeEnabled true if affiliate fee was requested by the sender, false if not
      *
      * @return cached conversion data to be ingested later on by the conversion flow
    */
    function createConversionData(IERC20Token[] _conversionPath, address _beneficiary, bool _affiliateFeeEnabled) private view returns (ConversionStep[]) {
        ConversionStep[] memory data = new ConversionStep[](_conversionPath.length / 2);

        bool affiliateFeeProcessed = false;
        address bntToken = addressOf(BNT_TOKEN);
        // iterate the conversion path and create the conversion data for each step
        uint256 i;
        for (i = 0; i < _conversionPath.length - 1; i += 2) {
            IConverterAnchor anchor = IConverterAnchor(_conversionPath[i + 1]);
            IConverter converter = IConverter(anchor.owner());
            IERC20Token targetToken = _conversionPath[i + 2];

            // check if the affiliate fee should be processed in this step
            bool processAffiliateFee = _affiliateFeeEnabled && !affiliateFeeProcessed && targetToken == bntToken;
            if (processAffiliateFee)
                affiliateFeeProcessed = true;

            data[i / 2] = ConversionStep({
                // set the converter anchor
                anchor: anchor,

                // set the converter
                converter: converter,

                // set the source/target tokens
                sourceToken: _conversionPath[i],
                targetToken: targetToken,

                // requires knowledge about the next step, so initialize in the next phase
                beneficiary: address(0),

                // set flags
                isV28OrHigherConverter: isV28OrHigherConverter(converter),
                processAffiliateFee: processAffiliateFee
            });
        }

        // ETH support
        // source is ETH
        ConversionStep memory stepData = data[0];
        if (etherTokens[stepData.sourceToken]) {
            // newer converter - replace the source token address with ETH reserve address
            if (stepData.isV28OrHigherConverter)
                stepData.sourceToken = IERC20Token(ETH_RESERVE_ADDRESS);
            // older converter - replace the source token with the EtherToken address used by the converter
            else
                stepData.sourceToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter));
        }

        // target is ETH
        stepData = data[data.length - 1];
        if (etherTokens[stepData.targetToken]) {
            // newer converter - replace the target token address with ETH reserve address
            if (stepData.isV28OrHigherConverter)
                stepData.targetToken = IERC20Token(ETH_RESERVE_ADDRESS);
            // older converter - replace the target token with the EtherToken address used by the converter
            else
                stepData.targetToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter));
        }

        // set the beneficiary for each step
        for (i = 0; i < data.length; i++) {
            stepData = data[i];

            // first check if the converter in this step is newer as older converters don't even support the beneficiary argument
            if (stepData.isV28OrHigherConverter) {
                // if affiliate fee is processed in this step, beneficiary is the network contract
                if (stepData.processAffiliateFee)
                    stepData.beneficiary = this;
                // if it's the last step, beneficiary is the final beneficiary
                else if (i == data.length - 1)
                    stepData.beneficiary = _beneficiary;
                // if the converter in the next step is newer, beneficiary is the next converter
                else if (data[i + 1].isV28OrHigherConverter)
                    stepData.beneficiary = data[i + 1].converter;
                // the converter in the next step is older, beneficiary is the network contract
                else
                    stepData.beneficiary = this;
            }
            else {
                // converter in this step is older, beneficiary is the network contract
                stepData.beneficiary = this;
            }
        }

        return data;
    }

    /**
      * @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't.
      * Note that we use the non standard erc-20 interface in which `approve` has no return value so that
      * this function will work for both standard and non standard tokens
      *
      * @param _token   token to check the allowance in
      * @param _spender approved address
      * @param _value   allowance amount
    */
    function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private {
        uint256 allowance = _token.allowance(this, _spender);
        if (allowance < _value) {
            if (allowance > 0)
                safeApprove(_token, _spender, 0);
            safeApprove(_token, _spender, _value);
        }
    }

    // legacy - returns the address of an EtherToken used by the converter
    function getConverterEtherTokenAddress(IConverter _converter) private view returns (address) {
        uint256 reserveCount = _converter.connectorTokenCount();
        for (uint256 i = 0; i < reserveCount; i++) {
            address reserveTokenAddress = _converter.connectorTokens(i);
            if (etherTokens[reserveTokenAddress])
                return reserveTokenAddress;
        }

        return ETH_RESERVE_ADDRESS;
    }

    // legacy - if the token is an ether token, returns the ETH reserve address
    // used by the converter, otherwise returns the input token address
    function getConverterTokenAddress(IConverter _converter, IERC20Token _token) private view returns (IERC20Token) {
        if (!etherTokens[_token])
            return _token;

        if (isV28OrHigherConverter(_converter))
            return IERC20Token(ETH_RESERVE_ADDRESS);

        return IERC20Token(getConverterEtherTokenAddress(_converter));
    }

    bytes4 private constant GET_RETURN_FUNC_SELECTOR = bytes4(keccak256("getReturn(address,address,uint256)"));

    // using assembly code since older converter versions have different return values
    function getReturn(address _dest, address _sourceToken, address _targetToken, uint256 _amount) internal view returns (uint256, uint256) {
        uint256[2] memory ret;
        bytes memory data = abi.encodeWithSelector(GET_RETURN_FUNC_SELECTOR, _sourceToken, _targetToken, _amount);

        assembly {
            let success := staticcall(
                gas,           // gas remaining
                _dest,         // destination address
                add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,           // output buffer
                64             // output length
            )
            if iszero(success) {
                revert(0, 0)
            }
        }

        return (ret[0], ret[1]);
    }

    bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()"));

    // using assembly code to identify converter version
    // can't rely on the version number since the function had a different signature in older converters
    function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) {
        bool success;
        uint256[1] memory ret;
        bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR);

        assembly {
            success := staticcall(
                5000,          // isV28OrHigher consumes 190 gas, but just for extra safety
                _converter,    // destination address
                add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),   // input length (loaded from the first 32 bytes in the `data` array)
                ret,           // output buffer
                32             // output length
            )
        }

        return success && ret[0] != 0;
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) {
        return (rateByPath(_path, _amount), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public payable returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function convertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _beneficiary,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        payable
        greaterThanZero(_minReturn)
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvert2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public returns (uint256) {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0);
    }

    /**
      * @dev deprecated, backward compatibility
    */
    function claimAndConvertFor2(
        IERC20Token[] _path,
        uint256 _amount,
        uint256 _minReturn,
        address _beneficiary,
        address _affiliateAccount,
        uint256 _affiliateFee
    )
        public
        returns (uint256)
    {
        return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvertFor2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxAffiliateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"rateByPath","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_bancorX","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertFor2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertByPath","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"xConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sourceToken","type":"address"},{"name":"_targetToken","type":"address"}],"name":"conversionPath","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvert2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxAffiliateFee","type":"uint256"}],"name":"setMaxAffiliateFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_smartToken","type":"address"},{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":false,"name":"_fromAmount","type":"uint256"},{"indexed":false,"name":"_toAmount","type":"uint256"},{"indexed":false,"name":"_trader","type":"address"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]

60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003791833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61362980620001686000396000f3006080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4

Deployed Bytecode

0x6080604052600436106101665763ffffffff60e060020a600035041663024c7ec7811461016b57806302ef521e146101875780630c8496cc146101ad5780632978c10e1461021d5780632fe8a6ad146102a657806349d10b64146102cf578063569706eb146102e45780635d732ff2146103475780635e35359e1461035c57806361cd756e1461038657806379ba5097146103b75780637b103999146103cc5780637f9c0ecd146103e15780638077ccf71461043857806389f9cc61146104595780638da5cb5b146104cc578063ab6214ce146104e1578063b1e9932b1461054b578063b4a176d3146105b6578063b77d239b146105cb578063c52173de14610635578063c7ba24bc14610694578063c98fefed146106f2578063cb32564e14610750578063d4ee1d90146107c4578063d734fa19146107d9578063e57738e514610850578063f2fde38b146108c0578063f3898a97146108e1578063f3bc7d2a14610932575b600080fd5b34801561017757600080fd5b50610185600435151561094a565b005b34801561019357600080fd5b50610185600160a060020a03600435166024351515610992565b3480156101b957600080fd5b50604080516020600480358082013583810280860185019096528085526102049536959394602494938501929182918501908490808284375094975050933594506109db9350505050565b6040805192835260208301919091528051918290030190f35b34801561022957600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356109f3565b60408051918252519081900360200190f35b3480156102b257600080fd5b506102bb610a0e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b50610185610a2f565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b34801561035357600080fd5b50610294610cc9565b34801561036857600080fd5b50610185600160a060020a0360043581169060243516604435610ccf565b34801561039257600080fd5b5061039b610d08565b60408051600160a060020a039092168252519081900360200190f35b3480156103c357600080fd5b50610185610d17565b3480156103d857600080fd5b5061039b610dea565b3480156103ed57600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505093359450610df99350505050565b34801561044457600080fd5b506102bb600160a060020a0360043516611628565b34801561046557600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050600160a060020a03853581169650602086013595604081013595506060013516925061163d915050565b3480156104d857600080fd5b5061039b6117d2565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356117e1565b34801561055757600080fd5b5060408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b3480156105c257600080fd5b50610185611821565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201358116935060608201351691506080013561185a565b604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611a9a565b3480156106a057600080fd5b506040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b60408051602060048035808201358381028086018501909652808552610294953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118079050565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611ac7565b3480156107d057600080fd5b5061039b611c65565b3480156107e557600080fd5b50610800600160a060020a0360043581169060243516611c74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561083c578181015183820152602001610824565b505050509050019250505060405180910390f35b34801561085c57600080fd5b50604080516020600480358082013583810280860185019096528085526102949536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610cae565b3480156108cc57600080fd5b50610185600160a060020a0360043516611da5565b6040805160206004803580820135838102808601850190965280855261029495369593946024949385019291829185019084908082843750949750508435955050506020909201359150611aad9050565b34801561093e57600080fd5b50610185600435611e42565b610952611eaa565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b61099a611eaa565b816109a481611f0e565b826109ae81611f71565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b6000806109e88484610df9565b946000945092505050565b6000610a0387878787878761185a565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610a64575060035474010000000000000000000000000000000000000000900460ff16155b1515610aba576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610ae37f436f6e7472616374526567697374727900000000000000000000000000000000611fd2565b600254909150600160a060020a03808316911614801590610b0c5750600160a060020a03811615155b1515610b62576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b505050506040513d6020811015610c1057600080fd5b5051600160a060020a03161415610c71576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610cbf8686866000878761185a565b9695505050505050565b60045481565b610cd7611eaa565b82610ce181611f0e565b82610ceb81611f0e565b83610cf581611f71565b610d0086868661206a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610d79576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610e347f42616e636f72466f726d756c6100000000000000000000000000000000000000611fd2565b94508c9a5060028e51118015610e4f57508d51600290066001145b1515610ea5576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d51841015611616578d60028503815181101515610ec457fe5b9060200190602002015192508d60018503815181101515610ee157fe5b9060200190602002015191508d84815181101515610efb57fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4557600080fd5b505af1158015610f59573d6000803e3d6000fd5b505050506040513d6020811015610f6f57600080fd5b50519550610f7d86846120f7565b9250610f8986826120f7565b905081600160a060020a031681600160a060020a031614156112ea576003841080610fe057508d60038503815181101515610fc057fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110525781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561102357600080fd5b505af1158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156110ad57600080fd5b505af11580156110c1573d6000803e3d6000fd5b505050506040513d60208110156110d757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561114157600080fd5b505af1158015611155573d6000803e3d6000fd5b505050506040513d60a081101561116b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b505050506040513d602081101561121657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506112cc91620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50518e9063ffffffff9081169061215b16565b9063ffffffff6121db16565b9a8b90039a99506112e3898c63ffffffff61224916565b985061160b565b81600160a060020a031683600160a060020a031614156115f957600384108061133f57508d6003850381518110151561131f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156113b15781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561140c57600080fd5b505af1158015611420573d6000803e3d6000fd5b505050506040513d602081101561143657600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156114a057600080fd5b505af11580156114b4573d6000803e3d6000fd5b505050506040513d60a08110156114ca57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561154b57600080fd5b505af115801561155f573d6000803e3d6000fd5b505050506040513d602081101561157557600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506115e291620f4240916112c091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561128357600080fd5b9a8b90039a99506112e3898c63ffffffff6122a616565b6116058684838e612306565b909b5099505b600284019350610eaa565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b505050506040513d60208110156116a857600080fd5b50518751600160a060020a0390911690889060009081106116c557fe5b60209081029091010151600160a060020a03161461172d576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50519050610a038782868660008061185a565b600054600160a060020a031681565b6000846117ed816123ea565b6117fb88888888888861185a565b98975050505050505050565b60006118188585858560008061185a565b95945050505050565b611829611eaa565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061186b612442565b6003805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055886118ac816123ea565b60028c511180156118c257508b51600290066001145b1515611918576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119538c600081518110151561192a57fe5b906020019060200201518d600181518110151561194357fe5b906020019060200201518d6124b6565b60009450600160a060020a03881615156119c25786156119bd576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611a2f565b8660001080156119d457506004548711155b1515611a2a576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611a45578893505b611a508c85876126ba565b9250611a5f838c8c8b8b612ad1565b9150611a6c838386613031565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610a03878787878787600080611ac7565b6000611abf848484600080600061185a565b949350505050565b60008060008089611ad7816123ea565b8c518d906000198101908110611ae957fe5b906020019060200201519350611b1e7f42616e636f725800000000000000000000000000000000000000000000000000611fd2565b9250611b497f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b600160a060020a03858116911614611bab576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611bb98d8d8d308b8b61185a565b9150611bc6848484613114565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b600154600160a060020a031681565b60606000611ca17f436f6e76657273696f6e5061746846696e646572000000000000000000000000611fd2565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611d4d57600080fd5b810190808051640100000000811115611d6557600080fd5b82016020810184811115611d7857600080fd5b8151856020820283011164010000000082111715611d9557600080fd5b50909550505050505b5092915050565b611dad611eaa565b600054600160a060020a0382811691161415611e13576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b611e4a611eaa565b620f4240811115611ea5576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314611f0c576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415611f6e576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b505192915050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b505050565b600160a060020a03811660009081526005602052604081205460ff161515612120575080612155565b61212983613269565b15612149575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612155565b612152836132fa565b90505b92915050565b60008083151561216e5760009150611d9e565b5082820282848281151561217e57fe5b04146121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612235576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561224057fe5b04949350505050565b6000828201838110156121d4576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b600081831015612300576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600080612311613587565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156123d357600080fd5b505080516020909101519097909650945050505050565b60008111611f6e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615611f0c576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b505050506040513d602081101561252157600080fd5b5051915061252e82613269565b905060003411156125fc57348314612590576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156125f7576125a0826132fa565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b50505050505b6126b3565b600160a060020a03851660009081526005602052604090205460ff16156126955761262985333086613447565b80156125f75784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b505050506126b3565b80156126a7576125f785338486613447565b6126b385333086613447565b5050505050565b60608060008060008060008060006126d06135a2565b8c516002900460405190808252806020026020018201604052801561270f57816020015b6126fc6135a2565b8152602001906001900390816126f45790505b5098506000975061273f7f424e54546f6b656e000000000000000000000000000000000000000000000000611fd2565b9650600095505b60018d51038610156128da578c8660010181518110151561276357fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050506040513d60208110156127d757600080fd5b50518d519094508d90600288019081106127ed57fe5b9060200190602002015192508a8015612804575087155b8015612821575086600160a060020a031683600160a060020a0316145b9150811561282e57600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e8881518110151561286657fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a031681526020016128a686613269565b1515815283151560209091015289600288048151811015156128c457fe5b6020908102909101015260029590950194612746565b8860008151811015156128e957fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff161561295f578060a00151156129455773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082015261295f565b8051612950906132fa565b600160a060020a031660408201525b88518990600019810190811061297157fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff16156129e8578060a00151156129ce5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60608201526129e8565b80516129d9906132fa565b600160a060020a031660608201525b600095505b8851861015612ac0578886815181101515612a0457fe5b9060200190602002015190508060a0015115612aae578060c0015115612a2f57306080820152612aa9565b6001895103861415612a4f57600160a060020a038c166080820152612aa9565b8886600101815181101515612a6057fe5b9060200190602002015160a0015115612aa2578886600101815181101515612a8457fe5b6020908102909101015151600160a060020a03166080820152612aa9565b3060808201525b612ab5565b3060808201525b6001909501946129ed565b50969b9a5050505050505050505050565b600080600080612adf6135a2565b6000899350600092505b8a51831015612fca578a83815181101515612b0057fe5b9060200190602002015191508160a0015115612b91578215801590612b4d57508a5130908c906000198601908110612b3457fe5b9060200190602002015160800151600160a060020a0316145b8015612b745750604080830151600160a060020a031660009081526005602052205460ff16155b15612b8c57612b8c826040015183600001518661206a565b612bc7565b8160200151600160a060020a03168260400151600160a060020a0316141515612bc757612bc78260400151836000015186613114565b8160a001511515612c8a578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b505050506040513d6020811015612c8157600080fd5b50519450612e27565b604080830151600160a060020a031660009081526005602052205460ff1615612d685781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b50505050506040513d6020811015612c8157600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b505194505b8160c0015115612f3957612e48620f42406112c0878a63ffffffff61215b16565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b50511515612f33576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612ae9565b88851015613022576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6130396135a2565b600084600186510381518110151561304d57fe5b602090810290910101516080810151909250600160a060020a03163014613073576126b3565b506060810151600160a060020a03811660009081526005602052604090205460ff16156131095760a0820151156130a657fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561267857600080fd5b6126b381848661206a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561317f57600080fd5b505af1158015613193573d6000803e3d6000fd5b505050506040513d60208110156131a957600080fd5b50519050818110156131d55760008111156131ca576131ca848460006134ff565b6131d58484846134ff565b50505050565b6131e36135de565b602060405190810160405280600181525090506020818351602085016000875af180151561321057600080fd5b50805115156120f2576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806132746135de565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156132ef5750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561333e57600080fd5b505af1158015613352573d6000803e3d6000fd5b505050506040513d602081101561336857600080fd5b505161ffff169250600091505b828210156134295784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156133c657600080fd5b505af11580156133da573d6000803e3d6000fd5b505050506040513d60208110156133f057600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561341e578093506132f2565b600190910190613375565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526131d59085906131db565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a0319909316929092179091526120f29084906131db565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058204c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be466220029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4

-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4


Deployed Bytecode Sourcemap

24652:32764:0:-;;;;;;;;;-1:-1:-1;;;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14362:224:0;;;;;;;;;27054:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27054:209:0;-1:-1:-1;;;;;27054:209:0;;;;;;;;;54285:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;54285:159:0;;;-1:-1:-1;54285:159:0;;-1:-1:-1;;;;54285:159:0;;;;;;;;;;;;;;;;;;;;;;;;57030:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57030:383:0;;-1:-1:-1;;57030:383:0;;;-1:-1:-1;;;57030:383:0;;;;;-1:-1:-1;;;;;57030:383:0;;;;;;;-1:-1:-1;57030:383:0;;;;;;-1:-1:-1;57030:383:0;;;;;;;;;;;;;;;;;;;;;12049:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12049:38:0;;;;;;;;;;;;;;;;;;;;;;13007:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13007:925:0;;;;54794:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54794:356:0;;-1:-1:-1;;54794:356:0;;;-1:-1:-1;;;54794:356:0;;;;;-1:-1:-1;;;;;54794:356:0;;;;;;-1:-1:-1;54794:356:0;;;;-1:-1:-1;54794:356:0;;25294:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25294:38:0;;;;20031:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20031:246:0;-1:-1:-1;;;;;20031:246:0;;;;;;;;;;;;11959:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11959:37:0;;;;;;;;-1:-1:-1;;;;;11959:37:0;;;;;;;;;;;;;;9140:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9140:208:0;;;;11870:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11870:33:0;;;;28305:2807;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28305:2807:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;28305:2807:0;;;-1:-1:-1;28305:2807:0;;-1:-1:-1;;;;28305:2807:0;25370:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25370:44:0;-1:-1:-1;;;;;25370:44:0;;;;;38369:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38369:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;;;;;;38369:583:0;;;;;-1:-1:-1;38369:583:0;;;;;;;;;;-1:-1:-1;38369:583:0;;;;;-1:-1:-1;38369:583:0;;-1:-1:-1;;38369:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55527:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55527:429:0;;-1:-1:-1;;55527:429:0;;;-1:-1:-1;;;55527:429:0;;;;;-1:-1:-1;;;;;55527:429:0;;;;;;;-1:-1:-1;55527:429:0;;;;;;-1:-1:-1;55527:429:0;;;;;56727:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56727:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56727:229:0;;-1:-1:-1;;56727:229:0;;;-1:-1:-1;;;56727:229:0;;;;;;;;-1:-1:-1;;;;;56727:229:0;;-1:-1:-1;56727:229:0;;-1:-1:-1;56727:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32276:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32276:1573:0;;-1:-1:-1;;32276:1573:0;;;-1:-1:-1;;;32276:1573:0;;;;;-1:-1:-1;;;;;32276:1573:0;;;;;;;-1:-1:-1;32276:1573:0;;;;;;-1:-1:-1;32276:1573:0;;;;;34841:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34841:404:0;;-1:-1:-1;;34841:404:0;;;-1:-1:-1;;;34841:404:0;;;;;;;;;;-1:-1:-1;34841:404:0;;;;;-1:-1:-1;34841:404:0;;;;;56030:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56030:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;;56030:202:0;;;-1:-1:-1;;;56030:202:0;;;;;;-1:-1:-1;56030:202:0;;-1:-1:-1;56030:202:0;55224:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55224:229:0;;-1:-1:-1;;55224:229:0;;;-1:-1:-1;;;55224:229:0;;;;;;;;-1:-1:-1;;;;;55224:229:0;;-1:-1:-1;55224:229:0;;-1:-1:-1;55224:229:0;36350:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36350:1068:0;;-1:-1:-1;;36350:1068:0;;;-1:-1:-1;;;36350:1068:0;;;;;;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;36350:1068:0;;;;;-1:-1:-1;;;;;36350:1068:0;;;;;;;;;;;7982:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:23:0;;;;27645:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27645:283:0;-1:-1:-1;;;;;27645:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27645:283:0;;;;;;;;;;;;;;;;;56306:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56306:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56306:347:0;;-1:-1:-1;;56306:347:0;;;-1:-1:-1;;;56306:347:0;;;;;-1:-1:-1;;;;;56306:347:0;;;;;;-1:-1:-1;56306:347:0;;;;-1:-1:-1;56306:347:0;;8891:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8891:158:0;-1:-1:-1;;;;;8891:158:0;;;;;54518:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;;54518:202:0;;;-1:-1:-1;;;54518:202:0;;;;;;-1:-1:-1;54518:202:0;;-1:-1:-1;54518:202:0;26588:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26588:240:0;;;;;14362:224;8453:12;:10;:12::i;:::-;14522:26;:56;;;;;;;-1:-1:-1;;14522:56:0;;;;;;;;;14362:224::o;27054:209::-;8453:12;:10;:12::i;:::-;27175:6;9937:23;9951:8;9937:13;:23::i;:::-;27200:6;10291:18;10300:8;10291;:18::i;:::-;-1:-1:-1;;;;;;;27224:19:0;;;;;;;;:11;:19;;;;;:31;;-1:-1:-1;;27224:31:0;;;;;;;;;;27054:209::o;54285:159::-;54369:7;54378;54406:26;54417:5;54424:7;54406:10;:26::i;:::-;54398:38;54434:1;;-1:-1:-1;54285:159:0;-1:-1:-1;;;54285:159:0:o;57030:383::-;57284:7;57316:89;57330:5;57337:7;57346:10;57358:12;57372:17;57391:13;57316;:89::i;:::-;57309:96;57030:383;-1:-1:-1;;;;;;;57030:383:0:o;12049:38::-;;;;;;;;;:::o;13007:925::-;13237:29;13124:5;;-1:-1:-1;;;;;13124:5:0;13110:10;:19;;:50;;-1:-1:-1;13134:26:0;;;;;;;13133:27;13110:50;13102:80;;;;;;;-1:-1:-1;;;;;13102:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13287:28;13297:17;13287:9;:28::i;:::-;13436:8;;13237:79;;-1:-1:-1;;;;;;13413:32:0;;;13436:8;;13413:32;;;;:61;;-1:-1:-1;;;;;;13449:25:0;;;;13413:61;13405:94;;;;;;;-1:-1:-1;;;;;13405:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13614:40;;;;;;13636:17;13614:40;;;;;;13666:1;;-1:-1:-1;;;;;13614:21:0;;;;;:40;;;;;;;;;;;;;;;13666:1;13614:21;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13614:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13614:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:40:0;-1:-1:-1;;;;;13614:54:0;;;13606:87;;;;;-1:-1:-1;;;;;13606:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13800:8;;;13785:12;:23;;-1:-1:-1;;;;;13800:8:0;;;-1:-1:-1;;13785:23:0;;;;;;;13902:22;;;;;;;;;;;13007:925::o;54794:356::-;55023:7;55055:87;55069:5;55076:7;55085:10;55105:1;55109:17;55128:13;55055;:87::i;:::-;55048:94;54794:356;-1:-1:-1;;;;;;54794:356:0:o;25294:38::-;;;;:::o;20031:246::-;8453:12;:10;:12::i;:::-;20162:6;9937:23;9951:8;9937:13;:23::i;:::-;20192:3;9937:23;9951:8;9937:13;:23::i;:::-;20214:3;10291:18;10300:8;10291;:18::i;:::-;20235:34;20248:6;20256:3;20261:7;20235:12;:34::i;:::-;9971:1;;8476;20031:246;;;:::o;11959:37::-;;;-1:-1:-1;;;;;11959:37:0;;:::o;9140:208::-;9207:8;;-1:-1:-1;;;;;9207:8:0;9193:10;:22;9185:52;;;;;-1:-1:-1;;;;;9185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:8;;;9265:5;;9253:28;;-1:-1:-1;;;;;9272:8:0;;;;9265:5;;;;9253:28;;;9300:8;;;;9292:16;;-1:-1:-1;;9292:16:0;;;-1:-1:-1;;;;;9300:8:0;;9292:16;;;;9319:21;;;9140:208::o;11870:33::-;;;-1:-1:-1;;;;;11870:33:0;;:::o;28305:2807::-;28384:7;28404:14;28429:11;28451:14;28476:15;28502:13;28526:20;28557:22;28870:9;28926:23;28979:18;29027:23;28597:25;28607:14;28597:9;:25::i;:::-;28557:66;;28645:7;28636:16;;28760:1;28745:5;:12;:16;:41;;;;-1:-1:-1;28765:12:0;;28780:1;;28765:16;28785:1;28765:21;28745:41;28737:70;;;;;;;-1:-1:-1;;;;;28737:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28882:1;28870:13;;28865:2214;28889:5;:12;28885:1;:16;28865:2214;;;28952:5;28962:1;28958;:5;28952:12;;;;;;;;;;;;;;;;;;28926:38;;29000:5;29010:1;29006;:5;29000:12;;;;;;;;;;;;;;;;;;28979:33;;29053:5;29059:1;29053:8;;;;;;;;;;;;;;;;;;29027:34;;29118:6;-1:-1:-1;;;;;29101:30:0;;:32;;;;;-1:-1:-1;;;29101:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29101:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29101:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29101:32:0;;-1:-1:-1;29204:48:0;29101:32;29240:11;29204:24;:48::i;:::-;29190:62;;29281:48;29306:9;29317:11;29281:24;:48::i;:::-;29267:62;;29365:6;-1:-1:-1;;;;;29350:21:0;:11;-1:-1:-1;;;;;29350:21:0;;29346:1722;;;29488:1;29484;:5;:31;;;;29503:5;29513:1;29509;:5;29503:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29493:22:0;:6;-1:-1:-1;;;;;29493:22:0;;;29484:31;29480:100;;;29559:6;-1:-1:-1;;;;;29547:31:0;;:33;;;;;-1:-1:-1;;;29547:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29547:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29547:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29547:33:0;;-1:-1:-1;29480:100:0;29667:9;-1:-1:-1;;;;;29667:29:0;;29697:11;29667:42;;;;;-1:-1:-1;;;29667:42:0;;;;;;;-1:-1:-1;;;;;29667:42:0;-1:-1:-1;;;;;29667:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29667:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29667:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29667:42:0;29747:33;;;;;;-1:-1:-1;;;;;29747:33:0;;;;;;;;;29667:42;;-1:-1:-1;29747:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29747:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29747:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29747:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29747:33:0;;;;;;29808:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29747:33;;-1:-1:-1;;;;;;29808:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29808:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29808:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29808:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29808:53:0;29897:25;;;;;;;;29808:53;;-1:-1:-1;29886:68:0;;24842:7;;29886:37;;-1:-1:-1;;;;;29897:23:0;;;;;:25;;;;;29808:53;;29897:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29897:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29897:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29897:25:0;29886:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;29973:13;;;;;29880:74;-1:-1:-1;30089:18:0;:6;29973:13;30089:18;:10;:18;:::i;:::-;30080:27;;29346:1722;;;30161:6;-1:-1:-1;;;;;30146:21:0;:11;-1:-1:-1;;;;;30146:21:0;;30142:926;;;30285:1;30281;:5;:31;;;;30300:5;30310:1;30306;:5;30300:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30290:22:0;:6;-1:-1:-1;;;;;30290:22:0;;;30281:31;30277:100;;;30356:6;-1:-1:-1;;;;;30344:31:0;;:33;;;;;-1:-1:-1;;;30344:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30344:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30344:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30344:33:0;;-1:-1:-1;30277:100:0;30464:9;-1:-1:-1;;;;;30464:29:0;;30494:11;30464:42;;;;;-1:-1:-1;;;30464:42:0;;;;;;;-1:-1:-1;;;;;30464:42:0;-1:-1:-1;;;;;30464:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30464:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30464:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30464:42:0;30544:33;;;;;;-1:-1:-1;;;;;30544:33:0;;;;;;;;;30464:42;;-1:-1:-1;30544:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30544:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30544:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30544:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30544:33:0;;;;;;30605:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:33;;-1:-1:-1;;;;;;30605:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30605:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30605:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30605:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30605:49:0;30690:25;;;;;;;;30605:49;;-1:-1:-1;30679:68:0;;24842:7;;30679:37;;-1:-1:-1;;;;;30690:23:0;;;;;:25;;;;;30605:49;;30690:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30679:68:0;30766:13;;;;;30673:74;-1:-1:-1;30882:18:0;:6;30766:13;30882:18;:10;:18;:::i;30142:926::-;30998:54;31008:9;31019:11;31032;31045:6;30998:9;:54::i;:::-;30982:70;;-1:-1:-1;30982:70:0;-1:-1:-1;30142:926:0;28908:1;28903:6;;;;28865:2214;;;-1:-1:-1;31098:6:0;;28305:2807;-1:-1:-1;;;;;;;;;;;;28305:2807:0:o;25370:44::-;;;;;;;;;;;;;;;:::o;38369:583::-;38528:7;38749:14;38635:8;-1:-1:-1;;;;;38635:14:0;;:16;;;;;-1:-1:-1;;;38635:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38635:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38635:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38635:16:0;38623:8;;-1:-1:-1;;;;;38623:28:0;;;;:5;;38629:1;;38623:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;38623:28:0;;38615:65;;;;;-1:-1:-1;;;;;38615:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38766:54;;;;;;;;;;;;38809:10;38766:54;;;;;;-1:-1:-1;;;;;38766:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38766:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38766:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38766:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38766:54:0;;-1:-1:-1;38875:69:0;38889:5;38766:54;38904:10;38916:12;38938:1;;38875:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55527:429::-;55827:7;55797:10;9595:24;9612:6;9595:16;:24::i;:::-;55859:89;55873:5;55880:7;55889:10;55901:12;55915:17;55934:13;55859;:89::i;:::-;55852:96;55527:429;-1:-1:-1;;;;;;;;55527:429:0:o;56727:229::-;56851:7;56878:70;56892:5;56899:7;56908:10;56920:12;56942:1;56946;56878:13;:70::i;:::-;56871:77;56727:229;-1:-1:-1;;;;;56727:229:0:o;14011:137::-;8453:12;:10;:12::i;:::-;14128;;14117:8;:23;;-1:-1:-1;;14117:23:0;-1:-1:-1;;;;;14128:12:0;;;14117:23;;;;;;14011:137::o;32276:1573::-;32536:7;32952:24;33341:19;33517:28;33620:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32506:10;9595:24;32506:10;9595:16;:24::i;:::-;32690:1;32675:5;:12;:16;:41;;;;-1:-1:-1;32695:12:0;;32710:1;;32695:16;32715:1;32695:21;32675:41;32667:70;;;;;;;-1:-1:-1;;;;;32667:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32829:64;32847:5;32853:1;32847:8;;;;;;;;;;;;;;;;;;32874:5;32880:1;32874:8;;;;;;;;;;;;;;;;;;32885:7;32829:17;:64::i;:::-;32979:5;;-1:-1:-1;;;;;;32999:31:0;;;32995:294;;;33055:18;;33047:56;;;;;-1:-1:-1;;;;;33047:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32995:294;;;33157:13;33153:1;:17;:53;;;;;33191:15;;33174:13;:32;;33153:53;33145:91;;;;;;;-1:-1:-1;;;;;33145:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33273:4;33251:26;;32995:294;33363:10;;-1:-1:-1;;;;;;33388:26:0;;;33384:71;;33443:12;33429:26;;33384:71;33548:61;33569:5;33576:11;33589:19;33548:20;:61::i;:::-;33517:92;;33637:73;33650:4;33656:7;33665:10;33677:17;33696:13;33637:12;:73::i;:::-;33620:90;;33771:44;33789:4;33795:6;33803:11;33771:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;33835:6;32276:1573;-1:-1:-1;;;;;;;;;;32276:1573:0:o;34841:404::-;35103:7;35135:102;35145:5;35152:7;35161:10;35173:17;35192:14;35208:13;35231:1;35235;35135:9;:102::i;56030:202::-;56129:7;56156:68;56170:5;56177:7;56186:10;56206:1;56218;56222;56156:13;:68::i;:::-;56149:75;56030:202;-1:-1:-1;;;;56030:202:0:o;36350:1068::-;36718:7;36743:23;36803:16;37051:14;36688:10;9595:24;9612:6;9595:16;:24::i;:::-;36775:12;;36769:5;;-1:-1:-1;;36775:16:0;;;36769:23;;;;;;;;;;;;;;36743:49;;36831:19;36841:8;36831:9;:19::i;:::-;36803:48;;36940:20;36950:9;36940;:20::i;:::-;-1:-1:-1;;;;;36925:35:0;;;;;;36917:72;;;;;-1:-1:-1;;;;;36917:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37068:81;37082:5;37089:7;37098:10;37110:4;37116:17;37135:13;37068;:81::i;:::-;37051:98;;37198:45;37214:11;37227:7;37236:6;37198:15;:45::i;:::-;37309:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37309:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37309:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37404:6:0;;36350:1068;-1:-1:-1;;;;;;;;;;;;;;;36350:1068:0:o;7982:23::-;;;-1:-1:-1;;;;;7982:23:0;;:::o;27645:283::-;27742:9;27764:32;27821:33;27831:22;27821:9;:33::i;:::-;27873:47;;;;;;-1:-1:-1;;;;;27873:47:0;;;;;;;;;;;;;;;;27764:91;;-1:-1:-1;27873:19:0;;;;;;:47;;;;;-1:-1:-1;;27873:47:0;;;;;;;;-1:-1:-1;27873:19:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;27873:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27873:47:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27873:47: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;27873:47:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;224:3;218:10;339:9;333:2;319:12;315:21;297:16;293:44;290:59;268:11;254:12;251:29;239:119;236:2;;;371:1;368;361:12;236:2;-1:-1;27873:47:0;;-1:-1:-1;;;;;27645:283:0;;;;;;:::o;8891:158::-;8453:12;:10;:12::i;:::-;8986:5;;-1:-1:-1;;;;;8973:18:0;;;8986:5;;8973:18;;8965:45;;;;;-1:-1:-1;;;;;8965:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:8;:20;;-1:-1:-1;;9021:20:0;-1:-1:-1;;;;;9021:20:0;;;;;;;;;;8891:158::o;26588:240::-;8453:12;:10;:12::i;:::-;24908:7;26701:44;;;26693:82;;;;;-1:-1:-1;;;;;26693:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26786:15;:34;26588:240::o;8540:104::-;8609:5;;-1:-1:-1;;;;;8609:5:0;8595:10;:19;8587:49;;;;;-1:-1:-1;;;;;8587:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:104::o;10035:128::-;-1:-1:-1;;;;;10109:22:0;;;;10101:54;;;;;-1:-1:-1;;;;;10101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10035:128;:::o;10384:126::-;-1:-1:-1;;;;;10453:25:0;;10473:4;10453:25;;10445:57;;;;;-1:-1:-1;;;;;10445:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14784:133;14876:8;;:33;;;;;;;;;;;;;;14849:7;;-1:-1:-1;;;;;14876:8:0;;:18;;:33;;;;;;;;;;;;;;14849:7;14876:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;14876:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14876:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14876:33:0;;14784:133;-1:-1:-1;;14784:133:0:o;17060:174::-;15995:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17166:59:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17166:59:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17166:59:0;;;179:29:-1;;;;160:49;;;17150:76:0;;17158:6;;17150:7;:76::i;:::-;17060:174;;;:::o;51657:362::-;-1:-1:-1;;;;;51785:19:0;;51756:11;51785:19;;;:11;:19;;;;;;;;51784:20;51780:52;;;-1:-1:-1;51826:6:0;51819:13;;51780:52;51849:34;51872:10;51849:22;:34::i;:::-;51845:92;;;-1:-1:-1;24969:42:0;51898:39;;51845:92;51969:41;51999:10;51969:29;:41::i;:::-;51950:61;;51657:362;;;;;:::o;21424:250::-;21484:7;;21537;;21533:34;;;21566:1;21559:8;;;;21533:34;-1:-1:-1;21592:7:0;;;21597:2;21592;:7;21618:6;;;;;;;;:12;21610:37;;;;;-1:-1:-1;;;;;21610:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21665:1;21424:250;-1:-1:-1;;;21424:250:0:o;21902:174::-;21962:7;;21990:6;;;21982:37;;;;;-1:-1:-1;;;;;21982:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22047:2;22042;:7;;;;;;;;;21902:174;-1:-1:-1;;;;21902:174:0:o;20661:169::-;20721:7;20753;;;20779;;;;20771:32;;;;;-1:-1:-1;;;;;20771:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21053:147;21113:7;21141:8;;;;21133:34;;;;;-1:-1:-1;;;;;21133:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21185:7:0;;;21053:147::o;52230:900::-;52348:7;52357;52377:21;;:::i;:::-;52085:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52429:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52429:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52429:85:0;;;179:29:-1;;;;160:49;;52801:11:0;;52429:85;;52085:47;52902:3;;52644:5;52595:3;52566:431;53021:7;53014:15;53011:2;;;53059:1;53056;53049:12;53011:2;-1:-1:-1;;53107:6:0;;;53115;;;;53107;;53115;;-1:-1:-1;52230:900:0;-1:-1:-1;;;;;52230:900:0:o;9694:112::-;9778:1;9769:10;;9761:37;;;;;-1:-1:-1;;;;;9761:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:89;15694:6;;;;;;;15693:7;15685:34;;;;;-1:-1:-1;;;;;15685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;42581:1653;42696:25;42762:21;42735:7;-1:-1:-1;;;;;42735:13:0;;:15;;;;;-1:-1:-1;;;42735:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42735:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42735:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42735:15:0;;-1:-1:-1;42786:38:0;42735:15;42786:22;:38::i;:::-;42762:62;;42869:1;42857:9;:13;42853:1374;;;42930:9;:20;;42922:56;;;;;-1:-1:-1;;;;;42922:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43213:16;43212:17;43208:125;;;43260:45;43290:14;43260:29;:45::i;:::-;-1:-1:-1;;;;;43248:66:0;;43321:9;43248:85;;;;;-1:-1:-1;;;43248:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43248:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43248:85:0;;;;;43208:125;42853:1374;;;-1:-1:-1;;;;;43387:25:0;;;;;;:11;:25;;;;;;;;43383:844;;;43599:57;43616:12;43630:10;43642:4;43648:7;43599:16;:57::i;:::-;43726:16;43722:82;;;43773:12;-1:-1:-1;;;;;43761:34:0;;43796:7;43761:43;;;;;-1:-1:-1;;;43761:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43761:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43761:43:0;;;;43383:844;;;44019:16;44015:200;;;44054:67;44071:12;44085:10;44097:14;44113:7;44054:16;:67::i;44015:200::-;44158:57;44175:12;44189:10;44201:4;44207:7;44158:16;:57::i;:::-;42581:1653;;;;;:::o;45985:4180::-;46117:16;46146:28;46238:26;46283:16;46418:9;46505:23;46586:20;46650:23;46791:24;47716:30;;:::i;:::-;46198:22;;46223:1;;46198:26;46177:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46146:79;;46267:5;46238:34;;46302:20;46312:9;46302;:20::i;:::-;46283:39;;46447:1;46443:5;;46438:1216;46479:1;46454:15;:22;:26;46450:1;:30;46438:1216;;;46548:15;46564:1;46568;46564:5;46548:22;;;;;;;;;;;;;;;;;;46505:66;;46620:6;-1:-1:-1;;;;;46620:12:0;;:14;;;;;-1:-1:-1;;;46620:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46620:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46620:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46620:14:0;46676:22;;46620:14;;-1:-1:-1;46676:15:0;;46696:1;46692:5;;;46676:22;;;;;;;;;;;;;;46650:48;;46818:20;:46;;;;;46843:21;46842:22;46818:46;:73;;;;;46883:8;-1:-1:-1;;;;;46868:23:0;:11;-1:-1:-1;;;;;46868:23:0;;46818:73;46791:100;;46910:19;46906:70;;;46972:4;46948:28;;46906:70;47007:635;;;;;;;;;47170:9;-1:-1:-1;;;;;47007:635:0;;;;;47094:6;-1:-1:-1;;;;;47007:635:0;;;;;47262:15;47278:1;47262:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47007:635:0;;;;;47312:11;-1:-1:-1;;;;;47007:635:0;;;;;47457:1;-1:-1:-1;;;;;47007:635:0;;;;;47534:33;47557:9;47534:22;:33::i;:::-;47007:635;;;;;;;;;;;;46993:4;47002:1;46998;:5;46993:11;;;;;;;;;;;;;;;;;;:649;46487:1;46482:6;;;;;46438:1216;;;47749:4;47754:1;47749:7;;;;;;;;;;;;;;;;;;;;47783:20;;;;;-1:-1:-1;;;;;47771:33:0;;;;;:11;:33;;;;;;;47749:7;;-1:-1:-1;47771:33:0;;47767:498;;;47917:8;:31;;;47913:340;;;24969:42;47967:20;;;:55;47913:340;;;48233:18;;48203:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48168:85:0;:20;;;:85;47913:340;48319:11;;48314:4;;-1:-1:-1;;48319:15:0;;;48314:21;;;;;;;;;;;;;;;;48362:20;;;;-1:-1:-1;;;;;48350:33:0;;;;;:11;:33;;;;;;;;48314:21;;-1:-1:-1;48350:33:0;;48346:498;;;48496:8;:31;;;48492:340;;;24969:42;48546:20;;;:55;48492:340;;;48812:18;;48782:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48747:85:0;:20;;;:85;48492:340;48911:1;48907:5;;48902:1232;48918:4;:11;48914:1;:15;48902:1232;;;48962:4;48967:1;48962:7;;;;;;;;;;;;;;;;;;48951:18;;49121:8;:31;;;49117:1006;;;49277:8;:28;;;49273:664;;;49351:4;49328:20;;;:27;49273:664;;;49482:1;49468:4;:11;:15;49463:1;:20;49459:478;;;-1:-1:-1;;;;;49506:35:0;;:20;;;:35;49459:478;;;49667:4;49672:1;49676;49672:5;49667:11;;;;;;;;;;;;;;;;;;:34;;;49663:274;;;49747:4;49752:1;49756;49752:5;49747:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;49724:44:0;:20;;;:44;49663:274;;;49933:4;49910:20;;;:27;49663:274;49117:1006;;;50103:4;50080:20;;;:27;49117:1006;48931:3;;;;;48902:1232;;;-1:-1:-1;50153:4:0;;45985:4180;-1:-1:-1;;;;;;;;;;;45985:4180:0:o;39569:2665::-;39771:7;39791:16;39818:18;39909:9;39962:30;;:::i;:::-;41630:23;39839:7;39818:28;;39921:1;39909:13;;39904:2165;39928:5;:12;39924:1;:16;39904:2165;;;39995:5;40001:1;39995:8;;;;;;;;;;;;;;;;;;39962:41;;40056:8;:31;;;40052:862;;;40302:6;;;;;:51;;-1:-1:-1;40312:12:0;;40348:4;;40312:5;;-1:-1:-1;;40318:5:0;;;40312:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40312:41:0;;40302:51;:89;;;;-1:-1:-1;40370:20:0;;;;;-1:-1:-1;;;;;40358:33:0;;;;;:11;:33;;;;;;40357:34;40302:89;40298:182;;;40414:66;40427:8;:20;;;40449:8;:18;;;40469:10;40414:12;:66::i;:::-;40052:862;;;40700:8;:15;;;-1:-1:-1;;;;;40664:52:0;:8;:20;;;-1:-1:-1;;;;;40664:52:0;;;40660:254;;;40829:69;40845:8;:20;;;40867:8;:18;;;40887:10;40829:15;:69::i;:::-;40969:8;:31;;;40968:32;40964:552;;;41047:18;;41074:20;;;;;41096;;;;41030:102;;;;;-1:-1:-1;;;;;41030:102:0;;;;;;;;;;;;;;;;;;;;41130:1;41030:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41047:18;41030:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41030:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41030:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41030:102:0;;-1:-1:-1;40964:552:0;;;41168:20;;;;;-1:-1:-1;;;;;41156:33:0;;;;;:11;:33;;;;;;41152:364;;;41219:18;;41263:20;;;;;41285;;;;41331;;;;41219:133;;;;;-1:-1:-1;;;;;41219:133:0;;;;;;;;;;;;;;;;;;;;41319:10;41219:133;;;;;;;;;;;;:26;;;;;41252:9;;41219:133;;;;;;;;;;;;;;41252:9;41219:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41219:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41219:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41152:364:0;41400:18;;41427:20;;;;;41449;;;;41495;;;;41400:116;;;;;-1:-1:-1;;;;;41400:116:0;;;;;;;;;;;;;;;;;;;;41483:10;41400:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41400:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41400:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41400:116:0;;-1:-1:-1;41152:364:0;41581:8;:28;;;41577:318;;;41656:57;24908:7;41656:27;:8;41669:13;41656:27;:12;:27;:::i;:57::-;41630:83;;41740:8;:20;;;-1:-1:-1;;;;;41740:29:0;;41770:17;41789:15;41740:65;;;;;-1:-1:-1;;;41740:65:0;;;;;;;-1:-1:-1;;;;;41740:65:0;-1:-1:-1;;;;;41740:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41740:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41740:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41740:65:0;41732:101;;;;;;;-1:-1:-1;;;;;41732:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41864:15;41852:27;;;;41577:318;41966:8;:20;;;-1:-1:-1;;;;;41916:105:0;41944:8;:20;;;-1:-1:-1;;;;;41916:105:0;41927:8;:15;;;-1:-1:-1;;;;;41916:105:0;;41988:10;42000:8;42010:10;41916:105;;;;;;;;;;;;;;-1:-1:-1;;;;;41916:105:0;-1:-1:-1;;;;;41916:105:0;;;;;;;;;;;;;;;;;42049:8;;-1:-1:-1;39942:3:0;;;;;39904:2165;;;42153:22;;;;42145:53;;;;;-1:-1:-1;;;;;42145:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42218:8:0;;39569:2665;-1:-1:-1;;;;;;;;;39569:2665:0:o;44599:869::-;44708:30;;:::i;:::-;44917:23;44741:5;44762:1;44747:5;:12;:16;44741:23;;;;;;;;;;;;;;;;;;;44846:20;;;;44741:23;;-1:-1:-1;;;;;;44846:37:0;44878:4;44846:37;44842:63;;44898:7;;44842:63;-1:-1:-1;44943:20:0;;;;-1:-1:-1;;;;;45009:24:0;;;;;;:11;:24;;;;;;;;45005:456;;;45134:31;;;;45133:32;45126:40;;;;45283:11;-1:-1:-1;;;;;45271:35:0;;45307:12;45321:7;45271:58;;;;;-1:-1:-1;;;45271:58:0;;;;;;;-1:-1:-1;;;;;45271:58:0;-1:-1:-1;;;;;45271:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45005:456:0;45401:48;45414:11;45427:12;45441:7;45401:12;:48::i;50631:339::-;50749:32;;;;;;50766:4;50749:32;;;;-1:-1:-1;;;;;50749:32:0;;;;;;;;;50729:17;;50749:16;;;;;:32;;;;;;;;;;;;;;50729:17;50749:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50749:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50749:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50749:32:0;;-1:-1:-1;50796:18:0;;;50792:171;;;50847:1;50835:9;:13;50831:68;;;50867:32;50879:6;50887:8;50897:1;50867:11;:32::i;:::-;50914:37;50926:6;50934:8;50944:6;50914:11;:37::i;:::-;50631:339;;;;:::o;18195:793::-;18271:21;;:::i;:::-;:36;;;;;;;;;18304:1;18271:36;;;;;18788:2;18738:3;18642:5;18636:12;18544:2;18537:5;18533:14;18488:1;18432:6;18382:3;18359:476;18859:7;18852:15;18849:2;;;18897:1;18894;18887:12;18849:2;-1:-1:-1;18945:6:0;;:11;;18937:43;;;;;-1:-1:-1;;;;;18937:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53404:807;53482:4;53499:12;53522:21;;:::i;:::-;53202:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53574:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53574:54:0;;;179:29:-1;;;;160:49;;53955:11:0;;53202:28;;49:4:-1;;54056:3:0;;53798:10;53705:4;53676:475;53665:486;;54181:7;:22;;;;-1:-1:-1;54192:6:0;;:11;;54181:22;54174:29;;53404:807;;;;;;;:::o;51054:441::-;51138:7;51158:20;51229:9;51282:27;51181:10;-1:-1:-1;;;;;51181:30:0;;:32;;;;;-1:-1:-1;;;51181:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51181:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51181:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51181:32:0;51158:55;;;-1:-1:-1;51241:1:0;;-1:-1:-1;51224:225:0;51248:12;51244:1;:16;51224:225;;;51312:10;-1:-1:-1;;;;;51312:26:0;;51339:1;51312:29;;;;;-1:-1:-1;;;51312:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51312:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51312:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51312:29:0;-1:-1:-1;;;;;51360:32:0;;;;;;:11;51312:29;51360:32;;;;;51312:29;;-1:-1:-1;51360:32:0;;51356:81;;;51418:19;51411:26;;;;51356:81;51262:3;;;;;51224:225;;;-1:-1:-1;24969:42:0;;51054:441;-1:-1:-1;;;;51054:441:0:o;17639:205::-;16102:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17764:71:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17764:71:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17764:71:0;;;179:29:-1;;;;160:49;;;17748:88:0;;17756:6;;17748:7;:88::i;16517:182::-;15894:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16627:63:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16627:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16627:63:0;;;179:29:-1;;;;160:49;;;16611:80:0;;16619:6;;16611:7;:80::i;24652:32764::-;;;;;;;;;;;;;;;105:10:-1;24652:32764:0;88:34:-1;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o;:::-;;;;;;;;;-1:-1:-1;24652:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24652:32764:0;;;-1:-1:-1;;24652:32764:0:o

Swarm Source

bzzr://4c6d6f7ef1fe9e0170d19e339c72b77e0e50abade5d2e911ba59ffce0be46622

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.