ETH Price: $3,159.45 (+2.19%)

Contract

0xf13f977AaC9B001f155889b9EFa7A6628Fb7a181
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve150095872022-06-22 21:16:19877 days ago1655932579IN
0xf13f977A...28Fb7a181
0 ETH0.0019751842.7510426
Exit Pool106458902020-08-12 15:14:381557 days ago1597245278IN
0xf13f977A...28Fb7a181
0 ETH0.01049994220.00000145
Init99740752020-04-30 13:06:471661 days ago1588252007IN
0xf13f977A...28Fb7a181
0 ETH0.0048555824.20000025
0x6080604099740642020-04-30 13:03:311661 days ago1588251811IN
 Create: PCappedSmartPool
0 ETH0.0949527

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PCappedSmartPool

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-04-30
*/

// Sources flattened with buidler v1.2.0 https://buidler.dev

// File @pie-dao/proxy/contracts/[email protected]

pragma solidity ^0.6.2;

contract PProxyStorage {

    function readString(bytes32 _key) public view returns(string memory) {
        return bytes32ToString(storageRead(_key));
    }

    function setString(bytes32 _key, string memory _value) internal {
        storageSet(_key, stringToBytes32(_value));
    }

    function readBool(bytes32 _key) public view returns(bool) {
        return storageRead(_key) == bytes32(uint256(1));
    }

    function setBool(bytes32 _key, bool _value) internal {
        if(_value) {
            storageSet(_key, bytes32(uint256(1)));
        } else {
            storageSet(_key, bytes32(uint256(0)));
        }
    }

    function readAddress(bytes32 _key) public view returns(address) {
        return bytes32ToAddress(storageRead(_key));
    }

    function setAddress(bytes32 _key, address _value) internal {
        storageSet(_key, addressToBytes32(_value));
    }

    function storageRead(bytes32 _key) public view returns(bytes32) {
        bytes32 value;
        //solium-disable-next-line security/no-inline-assembly
        assembly {
            value := sload(_key)
        }
        return value;
    }

    function storageSet(bytes32 _key, bytes32 _value) internal {
        // targetAddress = _address;  // No!
        bytes32 implAddressStorageKey = _key;
        //solium-disable-next-line security/no-inline-assembly
        assembly {
            sstore(implAddressStorageKey, _value)
        }
    }

    function bytes32ToAddress(bytes32 _value) public pure returns(address) {
        return address(uint160(uint256(_value)));
    }

    function addressToBytes32(address _value) public pure returns(bytes32) {
        return bytes32(uint256(_value));
    }

    function stringToBytes32(string memory _value) public pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(_value);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
            result := mload(add(_value, 32))
        }
    }

    function bytes32ToString(bytes32 _value) public pure returns (string memory) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint256 j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(_value) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (uint256 j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }
}


// File @pie-dao/proxy/contracts/[email protected]

pragma solidity ^0.6.2;


contract PProxy is PProxyStorage {

    bytes32 constant IMPLEMENTATION_SLOT = keccak256(abi.encodePacked("IMPLEMENTATION_SLOT"));
    bytes32 constant OWNER_SLOT = keccak256(abi.encodePacked("OWNER_SLOT"));

    modifier onlyProxyOwner() {
        require(msg.sender == readAddress(OWNER_SLOT), "PProxy.onlyProxyOwner: msg sender not owner");
        _;
    }

    constructor () public {
        setAddress(OWNER_SLOT, msg.sender);
    }

    function getProxyOwner() public view returns (address) {
       return readAddress(OWNER_SLOT);
    }

    function setProxyOwner(address _newOwner) onlyProxyOwner public {
        setAddress(OWNER_SLOT, _newOwner);
    }

    function getImplementation() public view returns (address) {
        return readAddress(IMPLEMENTATION_SLOT);
    }

    function setImplementation(address _newImplementation) onlyProxyOwner public {
        setAddress(IMPLEMENTATION_SLOT, _newImplementation);
    }


    fallback () external payable {
       return internalFallback();
    }

    function internalFallback() internal virtual {
        address contractAddr = readAddress(IMPLEMENTATION_SLOT);
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize())
            let result := delegatecall(gas(), contractAddr, ptr, calldatasize(), 0, 0)
            let size := returndatasize()
            returndatacopy(ptr, 0, size)

            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }

}


// File @pie-dao/proxy/contracts/[email protected]

pragma solidity ^0.6.2;


contract PProxyPausable is PProxy {

    bytes32 constant PAUSED_SLOT = keccak256(abi.encodePacked("PAUSED_SLOT"));
    bytes32 constant PAUZER_SLOT = keccak256(abi.encodePacked("PAUZER_SLOT"));

    constructor() PProxy() public {
        setAddress(PAUZER_SLOT, msg.sender);
    }

    modifier onlyPauzer() {
        require(msg.sender == readAddress(PAUZER_SLOT), "PProxyPausable.onlyPauzer: msg sender not pauzer");
        _;
    }

    modifier notPaused() {
        require(!readBool(PAUSED_SLOT), "PProxyPausable.notPaused: contract is paused");
        _;
    }

    function getPauzer() public view returns (address) {
        return readAddress(PAUZER_SLOT);
    }

    function setPauzer(address _newPauzer) public onlyProxyOwner{
        setAddress(PAUZER_SLOT, _newPauzer);
    }

    function renouncePauzer() public onlyPauzer {
        setAddress(PAUZER_SLOT, address(0));
    }

    function getPaused() public view returns (bool) {
        return readBool(PAUSED_SLOT);
    }

    function setPaused(bool _value) public onlyPauzer {
        setBool(PAUSED_SLOT, _value);
    }

    function internalFallback() internal virtual override notPaused {
        super.internalFallback();
    }

}


// File contracts/interfaces/IBFactory.sol

pragma solidity ^0.6.4;

interface IBFactory {
    function newBPool() external returns (address);
}


// File contracts/interfaces/IBPool.sol

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is disstributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.6.4;

interface IBPool {
    function isBound(address token) external view returns(bool);
    function getBalance(address token) external view returns (uint);
    function rebind(address token, uint balance, uint denorm) external;
    function setSwapFee(uint swapFee) external;
    function setPublicSwap(bool _public) external;
    function bind(address token, uint balance, uint denorm) external;
    function unbind(address token) external;
    function getDenormalizedWeight(address token) external view returns (uint);
    function getTotalDenormalizedWeight() external view returns (uint);
    function getCurrentTokens() external view returns(address[] memory);
    function setController(address manager) external;
    function isPublicSwap() external view returns(bool);
    function getSwapFee() external view returns (uint256);
    function gulp(address token) external;

    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee
    )
        external pure
        returns (uint poolAmountOut);

    function calcSingleInGivenPoolOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountOut,
        uint swapFee
    )
        external pure
        returns (uint tokenAmountIn);

    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
        external pure
        returns (uint tokenAmountOut);

    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee
    )
        external pure
        returns (uint poolAmountIn);
}


// File contracts/interfaces/IERC20.sol

pragma solidity ^0.6.4;

interface IERC20 {
    event Approval(address indexed _src, address indexed _dst, uint _amount);
    event Transfer(address indexed _src, address indexed _dst, uint _amount);

    function totalSupply() external view returns (uint);
    function balanceOf(address _whom) external view returns (uint);
    function allowance(address _src, address _dst) external view returns (uint);

    function approve(address _dst, uint _amount) external returns (bool);
    function transfer(address _dst, uint _amount) external returns (bool);
    function transferFrom(
        address _src, address _dst, uint _amount
    ) external returns (bool);
}


// File contracts/Ownable.sol

pragma solidity 0.6.4;

// TODO move this generic contract to a seperate repo with all generic smart contracts

contract Ownable {

    bytes32 constant public oSlot = keccak256("Ownable.storage.location");

    event OwnerChanged(address indexed previousOwner, address indexed newOwner);

    // Ownable struct
    struct os {
        address owner;
    }

    modifier onlyOwner(){
        require(msg.sender == los().owner, "Ownable.onlyOwner: msg.sender not owner");
        _;
    }

    /**
        @notice Transfer ownership to a new address
        @param _newOwner Address of the new owner
    */
    function transferOwnership(address _newOwner) onlyOwner external {
        _setOwner(_newOwner);
    }

    /**
        @notice Internal method to set the owner
        @param _newOwner Address of the new owner
    */
    function _setOwner(address _newOwner) internal {
        emit OwnerChanged(los().owner, _newOwner);
        los().owner = _newOwner;
    }

    /**
        @notice Load ownable storage
        @return s Storage pointer to the Ownable storage struct
    */
    function los() internal pure returns (os storage s) {
        bytes32 loc = oSlot;
        assembly {
            s_slot := loc
        }
    }

}


// File contracts/interfaces/IPSmartPool.sol

pragma solidity ^0.6.4;

interface IPSmartPool is IERC20 {
    function joinPool(uint256 _amount) external;
    function exitPool(uint256 _amount) external;
    function getController() external view returns(address);
    function getTokens() external view returns(address[] memory);
    function calcTokensForAmount(uint256 _amount) external view  returns(address[] memory tokens, uint256[] memory amounts);
}


// File contracts/PCTokenStorage.sol

pragma solidity 0.6.4;

contract PCTokenStorage {

    bytes32 constant public ptSlot = keccak256("PCToken.storage.location");
    struct pts {
        string name;
        string symbol;
        uint256 totalSupply;
        mapping(address => uint256) balance;
        mapping(address => mapping(address=>uint256)) allowance;
    }

    /**
        @notice Load pool token storage
        @return s Storage pointer to the pool token struct
    */
    function lpts() internal pure returns (pts storage s) {
        bytes32 loc = ptSlot;
        assembly {
            s_slot := loc
        }
    }

}


// File contracts/Math.sol

library Math {

    uint internal constant BONE = 10**18;

    // Add two numbers together checking for overflows
    function badd(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    // subtract two numbers and return diffecerence when it underflows
    function bsubSign(uint a, uint b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    // Subtract two numbers checking for underflows
    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    // Multiply two 18 decimals numbers
    function bmul(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint c1 = c0 + (BONE / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint c2 = c1 / BONE;
        return c2;
    }

    // Divide two 18 decimals numbers
    function bdiv(uint a, uint b)
        internal pure
        returns (uint)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint c0 = a * BONE;
        require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow
        uint c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint c2 = c1 / b;
        return c2;
    }
}


// File contracts/PCToken.sol

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.6.4;




// Highly opinionated token implementation
// Based on the balancer Implementation


contract PCToken is IERC20, PCTokenStorage {

    using Math for uint256;

    event Approval(address indexed _src, address indexed _dst, uint _amount);
    event Transfer(address indexed _src, address indexed _dst, uint _amount);

    uint8 public constant decimals = 18;

    function _mint(uint _amount) internal {
        pts storage s = lpts();
        s.balance[address(this)] = s.balance[address(this)].badd(_amount);
        s.totalSupply = s.totalSupply.badd(_amount);
        emit Transfer(address(0), address(this), _amount);
    }

    function _burn(uint _amount) internal {
        pts storage s = lpts();
        require(s.balance[address(this)] >= _amount, "ERR_INSUFFICIENT_BAL");
        s.balance[address(this)] = s.balance[address(this)].bsub(_amount);
        s.totalSupply = s.totalSupply.bsub(_amount);
        emit Transfer(address(this), address(0), _amount);
    }

    function _move(address _src, address _dst, uint _amount) internal {
        pts storage s = lpts();
        require(s.balance[_src] >= _amount, "ERR_INSUFFICIENT_BAL");
        s.balance[_src] = s.balance[_src].bsub(_amount);
        s.balance[_dst] = s.balance[_dst].badd(_amount);
        emit Transfer(_src, _dst, _amount);
    }

    function _push(address _to, uint _amount) internal {
        _move(address(this), _to, _amount);
    }

    function _pull(address _from, uint _amount) internal {
        _move(_from, address(this), _amount);
    }

    function allowance(address _src, address _dst) external view override returns (uint) {
        return lpts().allowance[_src][_dst];
    }

    function balanceOf(address _whom) external view override returns (uint) {
        return lpts().balance[_whom];
    }

    function totalSupply() public view override returns (uint) {
        return lpts().totalSupply;
    }

    function name() external view returns (string memory) {
        return lpts().name;
    }

    function symbol() external view returns (string memory) {
        return lpts().symbol;
    }

    function approve(address _dst, uint _amount) external override returns (bool) {
        lpts().allowance[msg.sender][_dst] = _amount;
        emit Approval(msg.sender, _dst, _amount);
        return true;
    }

    function increaseApproval(address _dst, uint _amount) external returns (bool) {
        pts storage s = lpts();
        s.allowance[msg.sender][_dst] = s.allowance[msg.sender][_dst].badd(_amount);
        emit Approval(msg.sender, _dst, s.allowance[msg.sender][_dst]);
        return true;
    }

    function decreaseApproval(address _dst, uint _amount) external returns (bool) {
        pts storage s = lpts();
        uint oldValue = s.allowance[msg.sender][_dst];
        if (_amount > oldValue) {
            s.allowance[msg.sender][_dst] = 0;
        } else {
            s.allowance[msg.sender][_dst] = oldValue.bsub(_amount);
        }
        emit Approval(msg.sender, _dst, s.allowance[msg.sender][_dst]);
        return true;
    }

    function transfer(address _dst, uint _amount) external override returns (bool) {
        _move(msg.sender, _dst, _amount);
        return true;
    }

    function transferFrom(address _src, address _dst, uint _amount) external override returns (bool) {
        pts storage s = lpts();
        require(msg.sender == _src || _amount <= s.allowance[_src][msg.sender], "ERR_PCTOKEN_BAD_CALLER");
        _move(_src, _dst, _amount);
        if (msg.sender != _src && s.allowance[_src][msg.sender] != uint256(-1)) {
            s.allowance[_src][msg.sender] = s.allowance[_src][msg.sender].bsub(_amount);
            emit Approval(msg.sender, _dst, s.allowance[_src][msg.sender]);
        }
        return true;
    }
}


// File contracts/ReentryProtection.sol

pragma solidity 0.6.4;

// TODO move this generic contract to a seperate repo with all generic smart contracts

contract ReentryProtection {

    bytes32 constant public rpSlot = keccak256("ReentryProtection.storage.location");

    // reentry protection storage
    struct rps {
        uint256 lockCounter;
    }

    modifier noReentry {
        // Use counter to only write to storage once
        lrps().lockCounter ++;
        uint256 lockValue = lrps().lockCounter;
        _;
        require(lockValue == lrps().lockCounter, "ReentryProtection.noReentry: reentry detected");
    }

    /**
        @notice Load reentry protection storage
        @return s Pointer to the reentry protection storage struct
    */
    function lrps() internal pure returns (rps storage s) {
        bytes32 loc = rpSlot;
        assembly {
            s_slot := loc
        }
    }

}


// File contracts/smart-pools/PBasicSmartPool.sol

pragma solidity 0.6.4;





contract PBasicSmartPool is IPSmartPool, PCToken, ReentryProtection {
    
    // P Basic Smart Struct
    bytes32 constant public pbsSlot = keccak256("PBasicSmartPool.storage.location");
    struct pbs {
        IBPool bPool;
        address controller;
        address publicSwapSetter;
        address tokenBinder;
    }
    
    modifier ready() {
        require(address(lpbs().bPool) != address(0), "PBasicSmartPool.ready: not ready");
        _;
    }   

     event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256 tokenAmountIn
    );

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256 tokenAmountOut
    );

    event TokensApproved();
    event ControllerChanged(address indexed previousController, address indexed newController);
    event PublicSwapSetterChanged(address indexed previousSetter, address indexed newSetter);
    event TokenBinderChanged(address indexed previousTokenBinder, address indexed newTokenBinder);
    event PublicSwapSet(address indexed setter, bool indexed value);
    event SwapFeeSet(address indexed setter, uint256 newFee);
    event PoolJoined(address indexed from, uint256 amount);
    event PoolExited(address indexed from, uint256 amount);
    event PoolExitedWithLoss(address indexed from, uint256 amount, address[] lossTokens);

    modifier onlyController() {
        require(msg.sender == lpbs().controller, "PBasicSmartPool.onlyController: not controller");
        _;
    }

    modifier onlyPublicSwapSetter() {
        require(msg.sender == lpbs().publicSwapSetter, "PBasicSmartPool.onlyPublicSwapSetter: not public swap setter");
        _;
    }

    modifier onlyTokenBinder() {
        require(msg.sender == lpbs().tokenBinder, "PBasicSmartPool.onlyTokenBinder: not token binder");
        _;
    }

    /**
        @notice Initialises the contract
        @param _bPool Address of the underlying balancer pool
        @param _name Name for the smart pool token
        @param _symbol Symbol for the smart pool token
        @param _initialSupply Initial token supply to mint
    */
    function init(address _bPool, string calldata _name, string calldata _symbol, uint256 _initialSupply) external {
        pbs storage s = lpbs();
        require(address(s.bPool) == address(0), "PBasicSmartPool.init: already initialised");
        require(_bPool != address(0), "PBasicSmartPool.init: _bPool cannot be 0x00....000");
        require(_initialSupply != 0, "PBasicSmartPool.init: _initialSupply can not zero");
        s.bPool = IBPool(_bPool);
        s.controller = msg.sender;
        s.publicSwapSetter = msg.sender;
        s.tokenBinder = msg.sender;
        lpts().name = _name;
        lpts().symbol = _symbol;
        _mintPoolShare(_initialSupply);
        _pushPoolShare(msg.sender, _initialSupply);
    }

    /**
        @notice Sets approval to all tokens to the underlying balancer pool
        @dev It uses this function to save on gas in joinPool
    */
    function approveTokens() public noReentry {
        IBPool bPool = lpbs().bPool;
        address[] memory tokens = bPool.getCurrentTokens();
        for(uint256 i = 0; i < tokens.length; i ++) {
            IERC20(tokens[i]).approve(address(bPool), uint256(-1));
        }
        emit TokensApproved();
    }

    /**
        @notice Sets the controller address. Can only be set by the current controller
        @param _controller Address of the new controller
    */
    function setController(address _controller) onlyController noReentry external {
        emit ControllerChanged(lpbs().controller, _controller);
        lpbs().controller = _controller;
    }

    /**
        @notice Sets public swap setter address. Can only be set by the controller
        @param _newPublicSwapSetter Address of the new public swap setter
    */
    function setPublicSwapSetter(address _newPublicSwapSetter) onlyController noReentry external {
        emit PublicSwapSetterChanged(lpbs().publicSwapSetter, _newPublicSwapSetter);
        lpbs().publicSwapSetter = _newPublicSwapSetter;
    }

    /**
        @notice Sets the token binder address. Can only be set by the controller
        @param _newTokenBinder Address of the new token binder
    */
    function setTokenBinder(address _newTokenBinder) onlyController noReentry external {
        emit TokenBinderChanged(lpbs().tokenBinder, _newTokenBinder);
        lpbs().tokenBinder = _newTokenBinder;
    }

    /**
        @notice Enables or disables public swapping on the underlying balancer pool. Can only be set by the controller
        @param _public Public or not
    */
    function setPublicSwap(bool _public) onlyPublicSwapSetter noReentry external {
        emit PublicSwapSet(msg.sender, _public);
        lpbs().bPool.setPublicSwap(_public);
    }

    /**
        @notice Set the swap fee on the underlying balancer pool. Can only be called by the controller
        @param _swapFee The new swap fee
    */
    function setSwapFee(uint256 _swapFee) onlyController noReentry external {
        emit SwapFeeSet(msg.sender, _swapFee);
        lpbs().bPool.setSwapFee(_swapFee);
    }

    /** 
        @notice Mints pool shares in exchange for underlying assets
        @param _amount Amount of pool shares to mint
    */

    function joinPool(uint256 _amount) external override virtual ready noReentry {
        _joinPool(_amount);
    }

    /**
        @notice Internal join pool function. See joinPool for more info
        @param _amount Amount of pool shares to mint
    */
    function _joinPool(uint256 _amount) internal virtual ready {
        IBPool bPool = lpbs().bPool;
        uint poolTotal = totalSupply();
        uint ratio = _amount.bdiv(poolTotal);
        require(ratio != 0);

        address[] memory tokens = bPool.getCurrentTokens();

        for (uint i = 0; i < tokens.length; i++) {
            address t = tokens[i];
            uint bal = bPool.getBalance(t);
            uint tokenAmountIn = ratio.bmul(bal);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn, bal);
        }
        _mintPoolShare(_amount);
        _pushPoolShare(msg.sender, _amount);
        emit PoolJoined(msg.sender, _amount);
    }

    /** 
        @notice Burns pool shares and sends back the underlying assets
        @param _amount Amount of pool tokens to burn
    */
    function exitPool(uint256 _amount) external override ready noReentry {
        IBPool bPool = lpbs().bPool;
        uint poolTotal = totalSupply();
        uint ratio = _amount.bdiv(poolTotal);
        require(ratio != 0);

        _pullPoolShare(msg.sender, _amount);
        _burnPoolShare(_amount);

        address[] memory tokens = bPool.getCurrentTokens();

        for (uint i = 0; i < tokens.length; i++) {
            address t = tokens[i];
            uint bal = bPool.getBalance(t);
            uint tAo = ratio.bmul(bal);
            emit LOG_EXIT(msg.sender, t, tAo);  
            _pushUnderlying(t, msg.sender, tAo, bal);
        }
        emit PoolExited(msg.sender, _amount);
    }

    /**
        @notice Burns pool shares and sends back the underlying assets leaving some in the pool
        @param _amount Amount of pool tokens to burn
        @param _lossTokens Tokens skipped on redemption
    */
    function exitPoolTakingloss(uint256 _amount, address[] calldata _lossTokens) external ready noReentry {
        IBPool bPool = lpbs().bPool;
        uint poolTotal = totalSupply();
        uint ratio = _amount.bdiv(poolTotal);
        require(ratio != 0);

        _pullPoolShare(msg.sender, _amount);
        _burnPoolShare(_amount);

        address[] memory tokens = bPool.getCurrentTokens();

        for (uint i = 0; i < tokens.length; i++) {
            // If taking loss on token skip one iteration of the loop
            if(_contains(tokens[i], _lossTokens)){
                continue;
            }
            address t = tokens[i];
            uint bal = bPool.getBalance(t);
            uint tAo = ratio.bmul(bal);
            emit LOG_EXIT(msg.sender, t, tAo);  
            _pushUnderlying(t, msg.sender, tAo, bal);
        }
        emit PoolExitedWithLoss(msg.sender, _amount, _lossTokens);
    }

    /**
        @notice Bind a token to the underlying balancer pool. Can only be called by the token binder
        @param _token Token to bind
        @param _balance Amount to bind
        @param _denorm Denormalised weight
    */
    function bind(address _token, uint256 _balance, uint256 _denorm) external onlyTokenBinder noReentry {
        IBPool bPool = lpbs().bPool;
        IERC20 token = IERC20(_token);
        require(token.transferFrom(msg.sender, address(this), _balance), "PBasicSmartPool.bind: transferFrom failed");
        token.approve(address(bPool), uint256(-1));
        bPool.bind(_token, _balance, _denorm);
    }

    /**
        @notice Rebind a token to the pool
        @param _token Token to bind
        @param _balance Amount to bind
        @param _denorm Denormalised weight
    */
    function rebind(address _token, uint256 _balance, uint256 _denorm) external onlyTokenBinder noReentry {
        IBPool bPool = lpbs().bPool;
        IERC20 token = IERC20(_token);
        
        // gulp old non acounted for token balance in the contract
        bPool.gulp(_token);

        uint256 oldBalance = token.balanceOf(address(bPool));
        // If tokens need to be pulled from msg.sender
        if(_balance > oldBalance) {
            require(token.transferFrom(msg.sender, address(this), _balance.bsub(oldBalance)), "PBasicSmartPool.rebind: transferFrom failed");
            token.approve(address(bPool), uint256(-1));
        }

        bPool.rebind(_token, _balance, _denorm);

        // If any tokens are in this contract send them to msg.sender
        uint256 tokenBalance = token.balanceOf(address(this));
        if(tokenBalance > 0) {
            require(token.transfer(msg.sender, tokenBalance), "PBasicSmartPool.rebind: transfer failed");
        }
    }

    /**
        @notice Unbind a token
        @param _token Token to unbind
    */
    function unbind(address _token) external onlyTokenBinder noReentry {
        IBPool bPool = lpbs().bPool;
        IERC20 token = IERC20(_token);
        // unbind the token in the bPool
        bPool.unbind(_token);

        // If any tokens are in this contract send them to msg.sender
        uint256 tokenBalance = token.balanceOf(address(this));
        if(tokenBalance > 0) {
            require(token.transfer(msg.sender, tokenBalance), "PBasicSmartPool.unbind: transfer failed");
        }
    }

    function getTokens() external view override returns(address[] memory) {
        return lpbs().bPool.getCurrentTokens();
    }

    /**
        @notice Gets the underlying assets and amounts to mint specific pool shares.
        @param _amount Amount of pool shares to calculate the values for
        @return tokens The addresses of the tokens
        @return amounts The amounts of tokens needed to mint that amount of pool shares
    */
    function calcTokensForAmount(uint256 _amount) external view override returns(address[] memory tokens, uint256[] memory amounts) {
        tokens = lpbs().bPool.getCurrentTokens();
        amounts = new uint256[](tokens.length);
        uint256 ratio = _amount.bdiv(totalSupply());

        for(uint256 i = 0; i < tokens.length; i ++) {
            address t = tokens[i];
            uint256 bal = lpbs().bPool.getBalance(t);
            uint256 amount = ratio.bmul(bal);
            amounts[i] = amount;
        }
    }

    /** 
        @notice Get the address of the controller
        @return The address of the pool
    */
    function getController() external view override returns(address) {
        return lpbs().controller;
    }

    /** 
        @notice Get the address of the public swap setter
        @return The public swap setter address
    */
    function getPublicSwapSetter() external view returns(address) {
        return lpbs().publicSwapSetter;
    }

    /**
        @notice Get the address of the token binder
        @return The token binder address
    */
    function getTokenBinder() external view returns(address) {
        return lpbs().tokenBinder;
    }

    /**
        @notice Get if public swapping is enabled
        @return If public swapping is enabled
    */
    function isPublicSwap() external view returns (bool) {
        return lpbs().bPool.isPublicSwap();
    }

    /**
        @notice Get the current swap fee
        @return The current swap fee
    */
    function getSwapFee() external view returns (uint256) {
        return lpbs().bPool.getSwapFee();
    }

    /**
        @notice Get the address of the underlying Balancer pool
        @return The address of the underlying balancer pool
    */
    function getBPool() external view returns(address) {
        return address(lpbs().bPool);
    }

    /**
        @notice Pull the underlying token from an address and rebind it to the balancer pool
        @param _token Address of the token to pull
        @param _from Address to pull the token from
        @param _amount Amount of token to pull
        @param _tokenBalance Balance of the token already in the balancer pool
    */
    function _pullUnderlying(address _token, address _from, uint256 _amount, uint256 _tokenBalance)
        internal
    {   
        IBPool bPool = lpbs().bPool;
        // Gets current Balance of token i, Bi, and weight of token i, Wi, from BPool.
        uint tokenWeight = bPool.getDenormalizedWeight(_token);

        require(IERC20(_token).transferFrom(_from, address(this), _amount), "PBasicSmartPool._pullUnderlying: transferFrom failed");
        bPool.rebind(_token, _tokenBalance.badd(_amount), tokenWeight);
    }

    /** 
        @notice Push a underlying token and rebind the token to the balancer pool
        @param _token Address of the token to push
        @param _to Address to pull the token to
        @param _amount Amount of token to push
        @param _tokenBalance Balance of the token already in the balancer pool
    */
    function _pushUnderlying(address _token, address _to, uint256 _amount, uint256 _tokenBalance)
        internal
    {   
        IBPool bPool = lpbs().bPool;
        // Gets current Balance of token i, Bi, and weight of token i, Wi, from BPool.
        uint tokenWeight = bPool.getDenormalizedWeight(_token);
        bPool.rebind(_token, _tokenBalance.bsub(_amount), tokenWeight);

        require(IERC20(_token).transfer(_to, _amount), "PBasicSmartPool._pushUnderlying: transfer failed");
    }

    /**
        @notice Pull pool shares
        @param _from Address to pull pool shares from
        @param _amount Amount of pool shares to pull
    */
    function _pullPoolShare(address _from, uint256 _amount)
        internal
    {
        _pull(_from, _amount);
    }

    /**
        @notice Burn pool shares
        @param _amount Amount of pool shares to burn
    */
    function _burnPoolShare(uint256 _amount)
        internal
    {
        _burn(_amount);
    }

    /** 
        @notice Mint pool shares 
        @param _amount Amount of pool shares to mint
    */
    function _mintPoolShare(uint256 _amount)
        internal
    {
        _mint(_amount);
    }

    /**
        @notice Push pool shares to account
        @param _to Address to push the pool shares to
        @param _amount Amount of pool shares to push
    */
    function _pushPoolShare(address _to, uint256 _amount)
        internal
    {
        _push(_to, _amount);
    }

    /**
        @notice searches for an address in an array of addresses and returns if it contains the address
        @param _needle Address to look for
        @param _haystack Array to search
        @return If value is found
    */
    function _contains(address _needle, address[] memory _haystack) internal pure returns(bool) {
        for(uint256 i = 0; i < _haystack.length; i ++) {
            if(_haystack[i] == _needle) {
                return true;
            }
        }
        return false;
    }

    /**
        @notice Load PBasicPool storage
        @return s Pointer to the storage struct
    */
    function lpbs() internal pure returns (pbs storage s) {
        bytes32 loc = pbsSlot;
        assembly {
            s_slot := loc
        }
    }

}


// File contracts/smart-pools/PCappedSmartPool.sol

pragma solidity 0.6.4;

contract PCappedSmartPool is PBasicSmartPool {

    bytes32 constant public pcsSlot = keccak256("PCappedSmartPool.storage.location");

    event CapChanged(address indexed setter, uint256 oldCap, uint256 newCap);

    struct pcs {
        uint256 cap;
    }

    modifier withinCap() {
        _;
        require(totalSupply() < lpcs().cap, "PCappedSmartPool.withinCap: Cap limit reached");
    }

    /**
        @notice Set the maximum cap of the contract
        @param _cap New cap in wei
    */
    function setCap(uint256 _cap) onlyController noReentry external {
        emit CapChanged(msg.sender, lpcs().cap, _cap);
        lpcs().cap = _cap;
    }

    /**
        @notice Takes underlying assets and mints smart pool tokens. Enforces the cap
        @param _amount Amount of pool tokens to mint
    */
    function joinPool(uint256 _amount) external override withinCap noReentry {
        super._joinPool(_amount);
    }


    /**
        @notice Get the current cap
        @return The current cap in wei
    */
    function getCap() external view returns(uint256) {
        return lpcs().cap;
    }

    /**
        @notice Load the PCappedSmartPool storage
        @return s Pointer to the storage struct
    */
    function lpcs() internal pure returns (pcs storage s) {
        bytes32 loc = pcsSlot;
        assembly {
            s_slot := loc
        }
    }

}


// File contracts/factory/PProxiedFactory.sol

pragma solidity ^0.6.4;







contract PProxiedFactory is Ownable {

    IBFactory public balancerFactory;
    address public smartPoolImplementation;
    mapping(address => bool) public isPool;
    address[] public pools;

    event SmartPoolCreated(address indexed poolAddress, string name, string symbol);

    function init(address _balancerFactory) public {
        require(smartPoolImplementation == address(0), "Already initialised");
        _setOwner(msg.sender);
        balancerFactory = IBFactory(_balancerFactory);
        
        PCappedSmartPool implementation = new PCappedSmartPool();
        // function init(address _bPool, string calldata _name, string calldata _symbol, uint256 _initialSupply) external {
        implementation.init(address(1), "IMPL", "IMPL", 1 ether);
        smartPoolImplementation = address(implementation);
    }

    function newProxiedSmartPool(
        string memory _name, 
        string memory _symbol,
        uint256 _initialSupply,
        address[] memory _tokens,
        uint256[] memory _amounts,
        uint256[] memory _weights,
        uint256 _cap
    ) public onlyOwner returns(address) {
        // Deploy proxy contract
        PProxyPausable proxy = new PProxyPausable();
        
        // Setup proxy
        proxy.setImplementation(smartPoolImplementation);
        proxy.setPauzer(msg.sender);
        proxy.setProxyOwner(msg.sender); 
        
        // Setup balancer pool
        address balancerPoolAddress = balancerFactory.newBPool();
        IBPool bPool = IBPool(balancerPoolAddress);

        for(uint256 i = 0; i < _tokens.length; i ++) {
            IERC20 token = IERC20(_tokens[i]);
            // Transfer tokens to this contract
            token.transferFrom(msg.sender, address(this), _amounts[i]);
            // Approve the balancer pool
            token.approve(balancerPoolAddress, uint256(-1));
            // Bind tokens
            bPool.bind(_tokens[i], _amounts[i], _weights[i]);
        }
        bPool.setController(address(proxy));
        
        // Setup smart pool
        PCappedSmartPool smartPool = PCappedSmartPool(address(proxy));
    
        smartPool.init(balancerPoolAddress, _name, _symbol, _initialSupply);
        smartPool.setCap(_cap);
        smartPool.setPublicSwapSetter(msg.sender);
        smartPool.setTokenBinder(msg.sender);
        smartPool.setController(msg.sender);
        smartPool.approveTokens();
        
        isPool[address(smartPool)] = true;
        pools.push(address(smartPool));

        emit SmartPoolCreated(address(smartPool), _name, _symbol);

        smartPool.transfer(msg.sender, _initialSupply);

        return address(smartPool);
    }

}


// File contracts/test/TestPCToken.sol

pragma solidity 0.6.4;


contract TestPCToken is PCToken {

    constructor(string memory _name, string memory _symbol) public {
        lpts().name = _name;
        lpts().symbol = _symbol;
    }
    function mint(address _to, uint256 _amount) external {
        _mint(_amount);
        _push(_to, _amount);
    }

    function burn(address _from, uint256 _amount) external {
        _pull(_from, _amount);
        _burn(_amount);
    }
}


// File contracts/test/TestReentryProtection.sol

pragma solidity 0.6.4;


contract TestReentryProtection is ReentryProtection {

    // This should fail
    function test() external noReentry {
        reenter();
    }

    function reenter() public noReentry {
        // Do nothing
    }

}


// File contracts/interfaces/IKyberNetwork.sol

pragma solidity ^0.6.4;

interface IKyberNetwork {

    function trade(
        address src,
        uint srcAmount,
        address dest,
        address payable destAddress,
        uint maxDestAmount,
        uint minConversionRate,
        address walletId
    ) external payable returns(uint256);
}


// File contracts/interfaces/IUniswapExchange.sol

pragma solidity ^0.6.4;

interface IUniswapExchange {
    // Address of ERC20 token sold on this exchange
    function tokenAddress() external view returns (address token);
    // Address of Uniswap Factory
    function factoryAddress() external view returns (address factory);
    // Provide Liquidity
    function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256);
    function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256);
    // Get Prices
    function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought);
    function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold);
    function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought);
    function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold);
    // Trade ETH to ERC20
    function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256  tokens_bought);
    function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256  tokens_bought);
    function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256  eth_sold);
    function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256  eth_sold);
    // Trade ERC20 to ETH
    function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256  eth_bought);
    function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256  eth_bought);
    function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256  tokens_sold);
    function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256  tokens_sold);
    // Trade ERC20 to ERC20
    function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256  tokens_sold);
    function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_sold);
    // Trade ERC20 to Custom Pool
    function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256  tokens_sold);
    function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_sold);
    // ERC20 comaptibility for liquidity tokens
    // bytes32 public name;
    // bytes32 public symbol;
    // uint256 public decimals;
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    // Never use
    function setup(address token_addr) external;
}


// File contracts/interfaces/IUniswapFactory.sol

pragma solidity ^0.6.4;

interface IUniswapFactory {
    // Create Exchange
    function createExchange(address token) external returns (address exchange);
    // Get Exchange and Token Info
    function getExchange(address token) external view returns (address exchange);
    function getToken(address exchange) external view returns (address token);
    function getTokenWithId(uint256 tokenId) external view returns (address token);
    // Never use
    function initializeFactory(address template) external;
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_src","type":"address"},{"indexed":true,"internalType":"address","name":"_dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"CapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"lossTokens","type":"address[]"}],"name":"PoolExitedWithLoss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolJoined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"PublicSwapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousSetter","type":"address"},{"indexed":true,"internalType":"address","name":"newSetter","type":"address"}],"name":"PublicSwapSetterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SwapFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTokenBinder","type":"address"},{"indexed":true,"internalType":"address","name":"newTokenBinder","type":"address"}],"name":"TokenBinderChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"TokensApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_src","type":"address"},{"indexed":true,"internalType":"address","name":"_dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_src","type":"address"},{"internalType":"address","name":"_dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calcTokensForAmount","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address[]","name":"_lossTokens","type":"address[]"}],"name":"exitPoolTakingloss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSwapSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenBinder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bPool","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pbsSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ptSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rpSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_public","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPublicSwapSetter","type":"address"}],"name":"setPublicSwapSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTokenBinder","type":"address"}],"name":"setTokenBinder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_src","type":"address"},{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50613ea6806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063652062c511610130578063be1d24ad116100b8578063dd62ed3e1161007c578063dd62ed3e14610828578063e4e1e53814610856578063ec565ffe14610888578063fd68f22314610890578063fde924f71461089857610232565b8063be1d24ad146106e3578063cf5e7bd314610700578063d2209ad914610726578063d4cadf68146107f4578063d73dd623146107fc57610232565b806392eefe9b116100ff57806392eefe9b1461060b57806395d89b4114610631578063a9059cbb14610639578063aa6ca80814610665578063bd5437e8146106bd57610232565b8063652062c5146105a957806366188463146105b157806370a08231146105dd578063830df8521461060357610232565b806334e19907116101be57806347786d371161018257806347786d371461053757806349b59552146105545780634cde1618146105735780634eee8d151461057b578063554d578d146105a157610232565b806334e199071461040d57806334e7a19f1461042a578063371babdc146104475780633fdddaa2146104fd57806344b250521461052f57610232565b806323b872dd1161020557806323b872dd146103165780632c500bc81461034c5780632fecc529146103705780633018205f146103e7578063313ce567146103ef57610232565b806306fdde0314610237578063095ea7b3146102b4578063099e9e2a146102f457806318160ddd1461030e575b600080fd5b61023f6108a0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360408110156102ca57600080fd5b506001600160a01b038135169060200135610939565b604080519115158252519081900360200190f35b6102fc61099f565b60408051918252519081900360200190f35b6102fc6109d4565b6102e06004803603606081101561032c57600080fd5b506001600160a01b038135811691602081013590911690604001356109e7565b610354610b5c565b604080516001600160a01b039092168252519081900360200190f35b6103e56004803603604081101561038657600080fd5b81359190810190604081016020820135600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460208302840111600160201b831117156103da57600080fd5b509092509050610b75565b005b610354610f8a565b6103f7610fa6565b6040805160ff9092168252519081900360200190f35b6103e56004803603602081101561042357600080fd5b5035610fab565b6103e56004803603602081101561044057600080fd5b5035611104565b6104646004803603602081101561045d57600080fd5b50356111c0565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156104a8578181015183820152602001610490565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104e75781810151838201526020016104cf565b5050505090500194505050505060405180910390f35b6103e56004803603606081101561051357600080fd5b506001600160a01b038135169060208101359060400135611406565b610354611898565b6103e56004803603602081101561054d57600080fd5b50356118b4565b6103e56004803603602081101561056a57600080fd5b50351515611976565b610354611a68565b6103e56004803603602081101561059157600080fd5b50356001600160a01b0316611a84565b6102fc611b6f565b6102fc611b7f565b6102e0600480360360408110156105c757600080fd5b506001600160a01b038135169060200135611b9a565b6102fc600480360360208110156105f357600080fd5b50356001600160a01b0316611c8f565b6102fc611cbb565b6103e56004803603602081101561062157600080fd5b50356001600160a01b0316611cd6565b61023f611dc1565b6102e06004803603604081101561064f57600080fd5b506001600160a01b038135169060200135611e27565b61066d611e3d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a9578181015183820152602001610691565b505050509050019250505060405180910390f35b6103e5600480360360208110156106d357600080fd5b50356001600160a01b0316611f56565b6103e5600480360360208110156106f957600080fd5b5035612041565b6103e56004803603602081101561071657600080fd5b50356001600160a01b0316612378565b6103e56004803603608081101561073c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561076657600080fd5b82018360208201111561077857600080fd5b803590602001918460018302840111600160201b8311171561079957600080fd5b919390929091602081019035600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b919350915035612599565b6102fc6126fd565b6102e06004803603604081101561081257600080fd5b506001600160a01b03813516906020013561277b565b6102fc6004803603604081101561083e57600080fd5b506001600160a01b0381358116916020013516612815565b6103e56004803603606081101561086c57600080fd5b506001600160a01b03813516906020810135906040013561284f565b6102fc612a86565b6103e5612ab6565b6102e0612d17565b60606108aa612d64565b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505090505b90565b600081610944612d64565b336000818152600492909201602090815260408084206001600160a01b03891680865290835293819020949094558351868152935192939192600080516020613d5c8339815191529281900390910190a35060015b92915050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902081565b60006109de612d64565b60020154905090565b6000806109f2612d64565b9050336001600160a01b0386161480610a3057506001600160a01b038516600090815260048201602090815260408083203384529091529020548311155b610a7a576040805162461bcd60e51b815260206004820152601660248201527522a9292fa821aa27a5a2a72fa120a22fa1a0a62622a960511b604482015290519081900360640190fd5b610a85858585612d94565b336001600160a01b03861614801590610ac557506001600160a01b0385166000908152600482016020908152604080832033845290915290205460001914155b15610b51576001600160a01b03851660009081526004820160209081526040808320338452909152902054610b00908463ffffffff612ec816565b6001600160a01b03868116600090815260048401602090815260408083203380855290835292819020859055805194855251928816939192600080516020613d5c8339815191529281900390910190a35b506001949350505050565b6000610b66612f2a565b546001600160a01b0316905090565b6000610b7f612f2a565b546001600160a01b03161415610bdc576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b610be4612f5f565b805460010190556000610bf5612f5f565b5490506000610c02612f2a565b546001600160a01b031690506000610c186109d4565b90506000610c2c878363ffffffff612f8116565b905080610c3857600080fd5b610c423388613094565b610c4b8761309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c8657600080fd5b505afa158015610c9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cc357600080fd5b8101908080516040519392919084600160201b821115610ce257600080fd5b908301906020820185811115610cf757600080fd5b82518660208202830111600160201b82111715610d1357600080fd5b82525081516020918201928201910280838360005b83811015610d40578181015183820152602001610d28565b50505050905001604052505050905060008090505b8151811015610ec457610dae828281518110610d6d57fe5b60200260200101518989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130a792505050565b15610db857610ebc565b6000828281518110610dc657fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b505190506000610e68868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3610eb8833383856131bf565b5050505b600101610d55565b50336001600160a01b03167fe27d877155575efc81398b13b114bbbbfd49b156eb72e9f6c691f3b72b8adf9489898960405180848152602001806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a250505050610f46612f5f565b548114610f845760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b50505050565b6000610f94612f2a565b600101546001600160a01b0316905090565b601281565b610fb3612f2a565b600101546001600160a01b03163314610ffd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611005612f5f565b805460010190556000611016612f5f565b5460408051848152905191925033917f44ef267e747417ef6614a0ab5bee304ba1a35d76759d34170d1b74a850a9d0339181900360200190a2611057612f2a565b54604080516334e1990760e01b81526004810185905290516001600160a01b03909216916334e199079160248082019260009290919082900301818387803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505050506110c2612f5f565b5481146111005760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b5050565b61110c612f5f565b80546001019055600061111d612f5f565b549050611129826133a7565b611131612f5f565b54811461116f5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b506111786136bd565b546111816109d4565b106111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c5a602d913960400191505060405180910390fd5b50565b6060806111cb612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561124b57600080fd5b8101908080516040519392919084600160201b82111561126a57600080fd5b90830190602082018581111561127f57600080fd5b82518660208202830111600160201b8211171561129b57600080fd5b82525081516020918201928201910280838360005b838110156112c85781810151838201526020016112b0565b5050505090500160405250505091508151604051908082528060200260200182016040528015611302578160200160208202803683370190505b509050600061131f6113126109d4565b859063ffffffff612f8116565b905060005b83518110156113ff57600084828151811061133b57fe5b60200260200101519050600061134f612f2a565b546040805163f8b2cb4f60e01b81526001600160a01b0385811660048301529151919092169163f8b2cb4f916024808301926020929190829003018186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d60208110156113c457600080fd5b5051905060006113da858363ffffffff6130fd16565b9050808685815181106113e957fe5b6020908102919091010152505050600101611324565b5050915091565b61140e612f2a565b600301546001600160a01b031633146114585760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b611460612f5f565b805460010190556000611471612f5f565b549050600061147e612f2a565b5460408051631185197d60e31b81526001600160a01b038881166004830152915191909216925086918391638c28cbe89160248082019260009290919082900301818387803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505050506000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50519050808611156116e7576001600160a01b0382166323b872dd33306115978a8663ffffffff612ec816565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506040513d602081101561162957600080fd5b50516116665760405162461bcd60e51b815260040180806020018281038252602b815260200180613cb4602b913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038581166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b505050506040513d60208110156116e457600080fd5b50505b60408051631feeed5160e11b81526001600160a01b0389811660048301526024820189905260448201889052915191851691633fdddaa29160648082019260009290919082900301818387803b15801561174057600080fd5b505af1158015611754573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03861692506370a0823191602480820192602092909190829003018186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d60208110156117cc57600080fd5b50519050801561188c576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561182557600080fd5b505af1158015611839573d6000803e3d6000fd5b505050506040513d602081101561184f57600080fd5b505161188c5760405162461bcd60e51b8152600401808060200182810382526027815260200180613d136027913960400191505060405180910390fd5b50505050610f46612f5f565b60006118a2612f2a565b600301546001600160a01b0316905090565b6118bc612f2a565b600101546001600160a01b031633146119065760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b61190e612f5f565b80546001019055600061191f612f5f565b549050337f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f561194c6136bd565b5460408051918252602082018690528051918290030190a28161196d6136bd565b556110c2612f5f565b61197e612f2a565b600201546001600160a01b031633146119c85760405162461bcd60e51b815260040180806020018281038252603c815260200180613e35603c913960400191505060405180910390fd5b6119d0612f5f565b8054600101905560006119e1612f5f565b546040519091508215159033907feda6fce4059a79def1a5550dd645183dbd84a324dde2aba020658eb3d7f84a8790600090a3611a1c612f2a565b54604080516324dacaa960e11b8152841515600482015290516001600160a01b03909216916349b595529160248082019260009290919082900301818387803b1580156110a257600080fd5b6000611a72612f2a565b600201546001600160a01b0316905090565b611a8c612f2a565b600101546001600160a01b03163314611ad65760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611ade612f5f565b805460010190556000611aef612f5f565b5490506001600160a01b038216611b04612f2a565b600201546040516001600160a01b03909116907fc2f50b6bc4bd45505f1557a7d4b19c5177d334181ae1179d335020424d3736c490600090a381611b46612f2a565b60020180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6000611b796136bd565b54905090565b604051806021613c3982396021019050604051809103902081565b600080611ba5612d64565b33600090815260048201602090815260408083206001600160a01b038916845290915290205490915080841115611c015733600090815260048301602090815260408083206001600160a01b0389168452909152812055611c38565b611c11818563ffffffff612ec816565b33600090815260048401602090815260408083206001600160a01b038a1684529091529020555b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190205481519081529051929392600080516020613d5c833981519152929181900390910190a3506001949350505050565b6000611c99612d64565b6001600160a01b03929092166000908152600390920160205250604090205490565b604051806022613d3a82396022019050604051809103902081565b611cde612f2a565b600101546001600160a01b03163314611d285760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611d30612f5f565b805460010190556000611d41612f5f565b5490506001600160a01b038216611d56612f2a565b600101546040516001600160a01b03909116907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f790600090a381611d98612f2a565b60010180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6060611dcb612d64565b60019081018054604080516020600295841615610100026000190190931694909404601f81018390048302850183019091528084529083018282801561092e5780601f106109035761010080835404028352916020019161092e565b6000611e34338484612d94565b50600192915050565b6060611e47612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec757600080fd5b8101908080516040519392919084600160201b821115611ee657600080fd5b908301906020820185811115611efb57600080fd5b82518660208202830111600160201b82111715611f1757600080fd5b82525081516020918201928201910280838360005b83811015611f44578181015183820152602001611f2c565b50505050905001604052505050905090565b611f5e612f2a565b600101546001600160a01b03163314611fa85760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611fb0612f5f565b805460010190556000611fc1612f5f565b5490506001600160a01b038216611fd6612f2a565b600301546040516001600160a01b03909116907fcbca212b561161352cbd1ef8956a916a93bee0f84bb6a3af9118af675266a96390600090a381612018612f2a565b60030180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b600061204b612f2a565b546001600160a01b031614156120a8576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6120b0612f5f565b8054600101905560006120c1612f5f565b54905060006120ce612f2a565b546001600160a01b0316905060006120e46109d4565b905060006120f8858363ffffffff612f8116565b90508061210457600080fd5b61210e3386613094565b6121178561309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561215257600080fd5b505afa158015612166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218f57600080fd5b8101908080516040519392919084600160201b8211156121ae57600080fd5b9083019060208201858111156121c357600080fd5b82518660208202830111600160201b821117156121df57600080fd5b82525081516020918201928201910280838360005b8381101561220c5781810151838201526020016121f4565b50505050905001604052505050905060008090505b815181101561233557600082828151811061223857fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561229a57600080fd5b505afa1580156122ae573d6000803e3d6000fd5b505050506040513d60208110156122c457600080fd5b5051905060006122da868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a361232a833383856131bf565b505050600101612221565b5060408051878152905133917fbc865856a1e9f1dfe2abde98edc2eefe87b6c391a47032388ef36d8c2474aad3919081900360200190a2505050506110c2612f5f565b612380612f2a565b600301546001600160a01b031633146123ca5760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6123d2612f5f565b8054600101905560006123e3612f5f565b54905060006123f0612f2a565b546040805163cf5e7bd360e01b81526001600160a01b03868116600483015291519190921692508491839163cf5e7bd39160248082019260009290919082900301818387803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03851692506370a0823191602480820192602092909190829003018186803b1580156124a457600080fd5b505afa1580156124b8573d6000803e3d6000fd5b505050506040513d60208110156124ce57600080fd5b50519050801561258e576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b505050506040513d602081101561255157600080fd5b505161258e5760405162461bcd60e51b8152600401808060200182810382526027815260200180613c126027913960400191505060405180910390fd5b5050506110c2612f5f565b60006125a3612f2a565b80549091506001600160a01b0316156125ed5760405162461bcd60e51b8152600401808060200182810382526029815260200180613d7c6029913960400191505060405180910390fd5b6001600160a01b0387166126325760405162461bcd60e51b8152600401808060200182810382526032815260200180613e036032913960400191505060405180910390fd5b8161266e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613be16031913960400191505060405180910390fd5b80546001600160a01b0388166001600160a01b031991821617825560018201805482163390811790915560028301805483168217905560038301805490921617905585856126ba612d64565b6126c5929091613aee565b5083836126d0612d64565b60010191906126e0929190613aee565b506126ea826136df565b6126f433836136e8565b50505050505050565b6000612707612f2a565b5460408051631a995bed60e31b815290516001600160a01b039092169163d4cadf6891600480820192602092909190829003018186803b15801561274a57600080fd5b505afa15801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b5051905090565b600080612786612d64565b33600090815260048201602090815260408083206001600160a01b03891684529091529020549091506127bf908463ffffffff6136f216565b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190208590558051948552519193600080516020613d5c833981519152929081900390910190a35060019392505050565b600061281f612d64565b6001600160a01b039384166000908152600491909101602090815260408083209490951682529290925250205490565b612857612f2a565b600301546001600160a01b031633146128a15760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6128a9612f5f565b8054600101905560006128ba612f5f565b54905060006128c7612f2a565b54604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03928316935087928316916323b872dd9160648083019260209291908290030181600087803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b505050506040513d602081101561294e57600080fd5b505161298b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b876029913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038481166004830152600019602483015291519183169163095ea7b3916044808201926020929091908290030181600087803b1580156129df57600080fd5b505af11580156129f3573d6000803e3d6000fd5b505050506040513d6020811015612a0957600080fd5b505060408051631c9c3ca760e31b81526001600160a01b038881166004830152602482018890526044820187905291519184169163e4e1e5389160648082019260009290919082900301818387803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050505050610f46612f5f565b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902081565b612abe612f5f565b805460010190556000612acf612f5f565b5490506000612adc612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169250606091839163cc77828d916004808301926000929190829003018186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b6157600080fd5b8101908080516040519392919084600160201b821115612b8057600080fd5b908301906020820185811115612b9557600080fd5b82518660208202830111600160201b82111715612bb157600080fd5b82525081516020918201928201910280838360005b83811015612bde578181015183820152602001612bc6565b50505050905001604052505050905060008090505b8151811015612ca557818181518110612c0857fe5b60200260200101516001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c7157600080fd5b505af1158015612c85573d6000803e3d6000fd5b505050506040513d6020811015612c9b57600080fd5b5050600101612bf3565b506040517f198f462153295cccb18f8ac2ae01bf2fc81f948daad29b15c5a9ad53370b07e590600090a15050612cd9612f5f565b5481146111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b6000612d21612f2a565b546040805163fde924f760e01b815290516001600160a01b039092169163fde924f791600480820192602092909190829003018186803b15801561274a57600080fd5b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902090565b6000612d9e612d64565b6001600160a01b0385166000908152600382016020526040902054909150821115612e07576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0384166000908152600382016020526040902054612e32908363ffffffff612ec816565b6001600160a01b0380861660009081526003840160205260408082209390935590851681522054612e69908363ffffffff6136f216565b6001600160a01b03808516600081815260038501602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b6000806000612ed78585613746565b915091508015612f22576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902090565b6000806040518080613d3a602291396040519081900360220190209392505050565b600081612fc4576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612fec5750670de0b6b3a7640000848281612fe957fe5b04145b613030576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561307e576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161308957fe5b049695505050505050565b611100828261376b565b6111bd81613776565b6000805b82518110156130f357836001600160a01b03168382815181106130ca57fe5b60200260200101516001600160a01b031614156130eb576001915050610999565b6001016130ab565b5060009392505050565b600082820283158061311757508284828161311457fe5b04145b61315b576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b200008101818110156131ae576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a764000082613089565b60006131c9612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b15801561321b57600080fd5b505afa15801561322f573d6000803e3d6000fd5b505050506040513d602081101561324557600080fd5b505190506001600160a01b038216633fdddaa287613269868863ffffffff612ec816565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b50505050856001600160a01b031663a9059cbb86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561333857600080fd5b505af115801561334c573d6000803e3d6000fd5b505050506040513d602081101561336257600080fd5b505161339f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613da56030913960400191505060405180910390fd5b505050505050565b60006133b1612f2a565b546001600160a01b0316141561340e576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6000613418612f2a565b546001600160a01b03169050600061342e6109d4565b90506000613442848363ffffffff612f8116565b90508061344e57600080fd5b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156134c657600080fd5b8101908080516040519392919084600160201b8211156134e557600080fd5b9083019060208201858111156134fa57600080fd5b82518660208202830111600160201b8211171561351657600080fd5b82525081516020918201928201910280838360005b8381101561354357818101518382015260200161352b565b50505050905001604052505050905060008090505b815181101561366c57600082828151811061356f57fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505190506000613611868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a919081900360200190a36136618333838561386a565b505050600101613558565b50613676856136df565b61368033866136e8565b60408051868152905133917f7a011ddbb8da163de89faccb018bb75c616e6ac270738b8bf1785f08ae1b2d6f919081900360200190a25050505050565b6000806040518080613c39602191396040519081900360210190209392505050565b6111bd81613a4c565b6111008282613ae3565b60008282018381101561373f576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b60008082841061375c5750508082036000613764565b505081810360015b9250929050565b611100823083612d94565b6000613780612d64565b3060009081526003820160205260409020549091508211156137e0576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152600382016020526040902054613802908363ffffffff612ec816565b3060009081526003830160205260409020556002810154613829908363ffffffff612ec816565b600282015560408051838152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613874612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516323b872dd60e01b81526001600160a01b038881166004830152306024830152604482018890529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50516139b55760405162461bcd60e51b8152600401808060200182810382526034815260200180613cdf6034913960400191505060405180910390fd5b6001600160a01b038216633fdddaa2876139d5868863ffffffff6136f216565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b50505050505050505050565b6000613a56612d64565b306000908152600382016020526040902054909150613a7b908363ffffffff6136f216565b3060009081526003830160205260409020556002810154613aa2908363ffffffff6136f216565b600282015560408051838152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b611100308383612d94565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b2f5782800160ff19823516178555613b5c565b82800160010185558215613b5c579182015b82811115613b5c578235825591602001919060010190613b41565b50613b68929150613b6c565b5090565b61093691905b80821115613b685760008155600101613b7256fe504261736963536d617274506f6f6c2e62696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e6f6e6c79546f6b656e42696e6465723a206e6f7420746f6b656e2062696e646572504261736963536d617274506f6f6c2e696e69743a205f696e697469616c537570706c792063616e206e6f74207a65726f504261736963536d617274506f6f6c2e756e62696e643a207472616e73666572206661696c656450436170706564536d617274506f6f6c2e73746f726167652e6c6f636174696f6e50436170706564536d617274506f6f6c2e77697468696e4361703a20436170206c696d697420726561636865645265656e74727950726f74656374696f6e2e6e6f5265656e7472793a207265656e747279206465746563746564504261736963536d617274506f6f6c2e726562696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e5f70756c6c556e6465726c79696e673a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e726562696e643a207472616e73666572206661696c65645265656e74727950726f74656374696f6e2e73746f726167652e6c6f636174696f6e8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925504261736963536d617274506f6f6c2e696e69743a20616c726561647920696e697469616c69736564504261736963536d617274506f6f6c2e5f70757368556e6465726c79696e673a207472616e73666572206661696c6564504261736963536d617274506f6f6c2e6f6e6c79436f6e74726f6c6c65723a206e6f7420636f6e74726f6c6c6572504261736963536d617274506f6f6c2e696e69743a205f62506f6f6c2063616e6e6f7420626520307830302e2e2e2e303030504261736963536d617274506f6f6c2e6f6e6c795075626c6963537761705365747465723a206e6f74207075626c6963207377617020736574746572a2646970667358221220921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e564736f6c63430006040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063652062c511610130578063be1d24ad116100b8578063dd62ed3e1161007c578063dd62ed3e14610828578063e4e1e53814610856578063ec565ffe14610888578063fd68f22314610890578063fde924f71461089857610232565b8063be1d24ad146106e3578063cf5e7bd314610700578063d2209ad914610726578063d4cadf68146107f4578063d73dd623146107fc57610232565b806392eefe9b116100ff57806392eefe9b1461060b57806395d89b4114610631578063a9059cbb14610639578063aa6ca80814610665578063bd5437e8146106bd57610232565b8063652062c5146105a957806366188463146105b157806370a08231146105dd578063830df8521461060357610232565b806334e19907116101be57806347786d371161018257806347786d371461053757806349b59552146105545780634cde1618146105735780634eee8d151461057b578063554d578d146105a157610232565b806334e199071461040d57806334e7a19f1461042a578063371babdc146104475780633fdddaa2146104fd57806344b250521461052f57610232565b806323b872dd1161020557806323b872dd146103165780632c500bc81461034c5780632fecc529146103705780633018205f146103e7578063313ce567146103ef57610232565b806306fdde0314610237578063095ea7b3146102b4578063099e9e2a146102f457806318160ddd1461030e575b600080fd5b61023f6108a0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360408110156102ca57600080fd5b506001600160a01b038135169060200135610939565b604080519115158252519081900360200190f35b6102fc61099f565b60408051918252519081900360200190f35b6102fc6109d4565b6102e06004803603606081101561032c57600080fd5b506001600160a01b038135811691602081013590911690604001356109e7565b610354610b5c565b604080516001600160a01b039092168252519081900360200190f35b6103e56004803603604081101561038657600080fd5b81359190810190604081016020820135600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460208302840111600160201b831117156103da57600080fd5b509092509050610b75565b005b610354610f8a565b6103f7610fa6565b6040805160ff9092168252519081900360200190f35b6103e56004803603602081101561042357600080fd5b5035610fab565b6103e56004803603602081101561044057600080fd5b5035611104565b6104646004803603602081101561045d57600080fd5b50356111c0565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156104a8578181015183820152602001610490565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104e75781810151838201526020016104cf565b5050505090500194505050505060405180910390f35b6103e56004803603606081101561051357600080fd5b506001600160a01b038135169060208101359060400135611406565b610354611898565b6103e56004803603602081101561054d57600080fd5b50356118b4565b6103e56004803603602081101561056a57600080fd5b50351515611976565b610354611a68565b6103e56004803603602081101561059157600080fd5b50356001600160a01b0316611a84565b6102fc611b6f565b6102fc611b7f565b6102e0600480360360408110156105c757600080fd5b506001600160a01b038135169060200135611b9a565b6102fc600480360360208110156105f357600080fd5b50356001600160a01b0316611c8f565b6102fc611cbb565b6103e56004803603602081101561062157600080fd5b50356001600160a01b0316611cd6565b61023f611dc1565b6102e06004803603604081101561064f57600080fd5b506001600160a01b038135169060200135611e27565b61066d611e3d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a9578181015183820152602001610691565b505050509050019250505060405180910390f35b6103e5600480360360208110156106d357600080fd5b50356001600160a01b0316611f56565b6103e5600480360360208110156106f957600080fd5b5035612041565b6103e56004803603602081101561071657600080fd5b50356001600160a01b0316612378565b6103e56004803603608081101561073c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561076657600080fd5b82018360208201111561077857600080fd5b803590602001918460018302840111600160201b8311171561079957600080fd5b919390929091602081019035600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b919350915035612599565b6102fc6126fd565b6102e06004803603604081101561081257600080fd5b506001600160a01b03813516906020013561277b565b6102fc6004803603604081101561083e57600080fd5b506001600160a01b0381358116916020013516612815565b6103e56004803603606081101561086c57600080fd5b506001600160a01b03813516906020810135906040013561284f565b6102fc612a86565b6103e5612ab6565b6102e0612d17565b60606108aa612d64565b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505090505b90565b600081610944612d64565b336000818152600492909201602090815260408084206001600160a01b03891680865290835293819020949094558351868152935192939192600080516020613d5c8339815191529281900390910190a35060015b92915050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902081565b60006109de612d64565b60020154905090565b6000806109f2612d64565b9050336001600160a01b0386161480610a3057506001600160a01b038516600090815260048201602090815260408083203384529091529020548311155b610a7a576040805162461bcd60e51b815260206004820152601660248201527522a9292fa821aa27a5a2a72fa120a22fa1a0a62622a960511b604482015290519081900360640190fd5b610a85858585612d94565b336001600160a01b03861614801590610ac557506001600160a01b0385166000908152600482016020908152604080832033845290915290205460001914155b15610b51576001600160a01b03851660009081526004820160209081526040808320338452909152902054610b00908463ffffffff612ec816565b6001600160a01b03868116600090815260048401602090815260408083203380855290835292819020859055805194855251928816939192600080516020613d5c8339815191529281900390910190a35b506001949350505050565b6000610b66612f2a565b546001600160a01b0316905090565b6000610b7f612f2a565b546001600160a01b03161415610bdc576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b610be4612f5f565b805460010190556000610bf5612f5f565b5490506000610c02612f2a565b546001600160a01b031690506000610c186109d4565b90506000610c2c878363ffffffff612f8116565b905080610c3857600080fd5b610c423388613094565b610c4b8761309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c8657600080fd5b505afa158015610c9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cc357600080fd5b8101908080516040519392919084600160201b821115610ce257600080fd5b908301906020820185811115610cf757600080fd5b82518660208202830111600160201b82111715610d1357600080fd5b82525081516020918201928201910280838360005b83811015610d40578181015183820152602001610d28565b50505050905001604052505050905060008090505b8151811015610ec457610dae828281518110610d6d57fe5b60200260200101518989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130a792505050565b15610db857610ebc565b6000828281518110610dc657fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b505190506000610e68868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3610eb8833383856131bf565b5050505b600101610d55565b50336001600160a01b03167fe27d877155575efc81398b13b114bbbbfd49b156eb72e9f6c691f3b72b8adf9489898960405180848152602001806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a250505050610f46612f5f565b548114610f845760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b50505050565b6000610f94612f2a565b600101546001600160a01b0316905090565b601281565b610fb3612f2a565b600101546001600160a01b03163314610ffd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611005612f5f565b805460010190556000611016612f5f565b5460408051848152905191925033917f44ef267e747417ef6614a0ab5bee304ba1a35d76759d34170d1b74a850a9d0339181900360200190a2611057612f2a565b54604080516334e1990760e01b81526004810185905290516001600160a01b03909216916334e199079160248082019260009290919082900301818387803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505050506110c2612f5f565b5481146111005760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b5050565b61110c612f5f565b80546001019055600061111d612f5f565b549050611129826133a7565b611131612f5f565b54811461116f5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b506111786136bd565b546111816109d4565b106111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c5a602d913960400191505060405180910390fd5b50565b6060806111cb612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561124b57600080fd5b8101908080516040519392919084600160201b82111561126a57600080fd5b90830190602082018581111561127f57600080fd5b82518660208202830111600160201b8211171561129b57600080fd5b82525081516020918201928201910280838360005b838110156112c85781810151838201526020016112b0565b5050505090500160405250505091508151604051908082528060200260200182016040528015611302578160200160208202803683370190505b509050600061131f6113126109d4565b859063ffffffff612f8116565b905060005b83518110156113ff57600084828151811061133b57fe5b60200260200101519050600061134f612f2a565b546040805163f8b2cb4f60e01b81526001600160a01b0385811660048301529151919092169163f8b2cb4f916024808301926020929190829003018186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d60208110156113c457600080fd5b5051905060006113da858363ffffffff6130fd16565b9050808685815181106113e957fe5b6020908102919091010152505050600101611324565b5050915091565b61140e612f2a565b600301546001600160a01b031633146114585760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b611460612f5f565b805460010190556000611471612f5f565b549050600061147e612f2a565b5460408051631185197d60e31b81526001600160a01b038881166004830152915191909216925086918391638c28cbe89160248082019260009290919082900301818387803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505050506000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50519050808611156116e7576001600160a01b0382166323b872dd33306115978a8663ffffffff612ec816565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506040513d602081101561162957600080fd5b50516116665760405162461bcd60e51b815260040180806020018281038252602b815260200180613cb4602b913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038581166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b505050506040513d60208110156116e457600080fd5b50505b60408051631feeed5160e11b81526001600160a01b0389811660048301526024820189905260448201889052915191851691633fdddaa29160648082019260009290919082900301818387803b15801561174057600080fd5b505af1158015611754573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03861692506370a0823191602480820192602092909190829003018186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d60208110156117cc57600080fd5b50519050801561188c576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561182557600080fd5b505af1158015611839573d6000803e3d6000fd5b505050506040513d602081101561184f57600080fd5b505161188c5760405162461bcd60e51b8152600401808060200182810382526027815260200180613d136027913960400191505060405180910390fd5b50505050610f46612f5f565b60006118a2612f2a565b600301546001600160a01b0316905090565b6118bc612f2a565b600101546001600160a01b031633146119065760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b61190e612f5f565b80546001019055600061191f612f5f565b549050337f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f561194c6136bd565b5460408051918252602082018690528051918290030190a28161196d6136bd565b556110c2612f5f565b61197e612f2a565b600201546001600160a01b031633146119c85760405162461bcd60e51b815260040180806020018281038252603c815260200180613e35603c913960400191505060405180910390fd5b6119d0612f5f565b8054600101905560006119e1612f5f565b546040519091508215159033907feda6fce4059a79def1a5550dd645183dbd84a324dde2aba020658eb3d7f84a8790600090a3611a1c612f2a565b54604080516324dacaa960e11b8152841515600482015290516001600160a01b03909216916349b595529160248082019260009290919082900301818387803b1580156110a257600080fd5b6000611a72612f2a565b600201546001600160a01b0316905090565b611a8c612f2a565b600101546001600160a01b03163314611ad65760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611ade612f5f565b805460010190556000611aef612f5f565b5490506001600160a01b038216611b04612f2a565b600201546040516001600160a01b03909116907fc2f50b6bc4bd45505f1557a7d4b19c5177d334181ae1179d335020424d3736c490600090a381611b46612f2a565b60020180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6000611b796136bd565b54905090565b604051806021613c3982396021019050604051809103902081565b600080611ba5612d64565b33600090815260048201602090815260408083206001600160a01b038916845290915290205490915080841115611c015733600090815260048301602090815260408083206001600160a01b0389168452909152812055611c38565b611c11818563ffffffff612ec816565b33600090815260048401602090815260408083206001600160a01b038a1684529091529020555b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190205481519081529051929392600080516020613d5c833981519152929181900390910190a3506001949350505050565b6000611c99612d64565b6001600160a01b03929092166000908152600390920160205250604090205490565b604051806022613d3a82396022019050604051809103902081565b611cde612f2a565b600101546001600160a01b03163314611d285760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611d30612f5f565b805460010190556000611d41612f5f565b5490506001600160a01b038216611d56612f2a565b600101546040516001600160a01b03909116907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f790600090a381611d98612f2a565b60010180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6060611dcb612d64565b60019081018054604080516020600295841615610100026000190190931694909404601f81018390048302850183019091528084529083018282801561092e5780601f106109035761010080835404028352916020019161092e565b6000611e34338484612d94565b50600192915050565b6060611e47612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec757600080fd5b8101908080516040519392919084600160201b821115611ee657600080fd5b908301906020820185811115611efb57600080fd5b82518660208202830111600160201b82111715611f1757600080fd5b82525081516020918201928201910280838360005b83811015611f44578181015183820152602001611f2c565b50505050905001604052505050905090565b611f5e612f2a565b600101546001600160a01b03163314611fa85760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611fb0612f5f565b805460010190556000611fc1612f5f565b5490506001600160a01b038216611fd6612f2a565b600301546040516001600160a01b03909116907fcbca212b561161352cbd1ef8956a916a93bee0f84bb6a3af9118af675266a96390600090a381612018612f2a565b60030180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b600061204b612f2a565b546001600160a01b031614156120a8576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6120b0612f5f565b8054600101905560006120c1612f5f565b54905060006120ce612f2a565b546001600160a01b0316905060006120e46109d4565b905060006120f8858363ffffffff612f8116565b90508061210457600080fd5b61210e3386613094565b6121178561309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561215257600080fd5b505afa158015612166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218f57600080fd5b8101908080516040519392919084600160201b8211156121ae57600080fd5b9083019060208201858111156121c357600080fd5b82518660208202830111600160201b821117156121df57600080fd5b82525081516020918201928201910280838360005b8381101561220c5781810151838201526020016121f4565b50505050905001604052505050905060008090505b815181101561233557600082828151811061223857fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561229a57600080fd5b505afa1580156122ae573d6000803e3d6000fd5b505050506040513d60208110156122c457600080fd5b5051905060006122da868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a361232a833383856131bf565b505050600101612221565b5060408051878152905133917fbc865856a1e9f1dfe2abde98edc2eefe87b6c391a47032388ef36d8c2474aad3919081900360200190a2505050506110c2612f5f565b612380612f2a565b600301546001600160a01b031633146123ca5760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6123d2612f5f565b8054600101905560006123e3612f5f565b54905060006123f0612f2a565b546040805163cf5e7bd360e01b81526001600160a01b03868116600483015291519190921692508491839163cf5e7bd39160248082019260009290919082900301818387803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03851692506370a0823191602480820192602092909190829003018186803b1580156124a457600080fd5b505afa1580156124b8573d6000803e3d6000fd5b505050506040513d60208110156124ce57600080fd5b50519050801561258e576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b505050506040513d602081101561255157600080fd5b505161258e5760405162461bcd60e51b8152600401808060200182810382526027815260200180613c126027913960400191505060405180910390fd5b5050506110c2612f5f565b60006125a3612f2a565b80549091506001600160a01b0316156125ed5760405162461bcd60e51b8152600401808060200182810382526029815260200180613d7c6029913960400191505060405180910390fd5b6001600160a01b0387166126325760405162461bcd60e51b8152600401808060200182810382526032815260200180613e036032913960400191505060405180910390fd5b8161266e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613be16031913960400191505060405180910390fd5b80546001600160a01b0388166001600160a01b031991821617825560018201805482163390811790915560028301805483168217905560038301805490921617905585856126ba612d64565b6126c5929091613aee565b5083836126d0612d64565b60010191906126e0929190613aee565b506126ea826136df565b6126f433836136e8565b50505050505050565b6000612707612f2a565b5460408051631a995bed60e31b815290516001600160a01b039092169163d4cadf6891600480820192602092909190829003018186803b15801561274a57600080fd5b505afa15801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b5051905090565b600080612786612d64565b33600090815260048201602090815260408083206001600160a01b03891684529091529020549091506127bf908463ffffffff6136f216565b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190208590558051948552519193600080516020613d5c833981519152929081900390910190a35060019392505050565b600061281f612d64565b6001600160a01b039384166000908152600491909101602090815260408083209490951682529290925250205490565b612857612f2a565b600301546001600160a01b031633146128a15760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6128a9612f5f565b8054600101905560006128ba612f5f565b54905060006128c7612f2a565b54604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03928316935087928316916323b872dd9160648083019260209291908290030181600087803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b505050506040513d602081101561294e57600080fd5b505161298b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b876029913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038481166004830152600019602483015291519183169163095ea7b3916044808201926020929091908290030181600087803b1580156129df57600080fd5b505af11580156129f3573d6000803e3d6000fd5b505050506040513d6020811015612a0957600080fd5b505060408051631c9c3ca760e31b81526001600160a01b038881166004830152602482018890526044820187905291519184169163e4e1e5389160648082019260009290919082900301818387803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050505050610f46612f5f565b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902081565b612abe612f5f565b805460010190556000612acf612f5f565b5490506000612adc612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169250606091839163cc77828d916004808301926000929190829003018186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b6157600080fd5b8101908080516040519392919084600160201b821115612b8057600080fd5b908301906020820185811115612b9557600080fd5b82518660208202830111600160201b82111715612bb157600080fd5b82525081516020918201928201910280838360005b83811015612bde578181015183820152602001612bc6565b50505050905001604052505050905060008090505b8151811015612ca557818181518110612c0857fe5b60200260200101516001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c7157600080fd5b505af1158015612c85573d6000803e3d6000fd5b505050506040513d6020811015612c9b57600080fd5b5050600101612bf3565b506040517f198f462153295cccb18f8ac2ae01bf2fc81f948daad29b15c5a9ad53370b07e590600090a15050612cd9612f5f565b5481146111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b6000612d21612f2a565b546040805163fde924f760e01b815290516001600160a01b039092169163fde924f791600480820192602092909190829003018186803b15801561274a57600080fd5b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902090565b6000612d9e612d64565b6001600160a01b0385166000908152600382016020526040902054909150821115612e07576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0384166000908152600382016020526040902054612e32908363ffffffff612ec816565b6001600160a01b0380861660009081526003840160205260408082209390935590851681522054612e69908363ffffffff6136f216565b6001600160a01b03808516600081815260038501602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b6000806000612ed78585613746565b915091508015612f22576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902090565b6000806040518080613d3a602291396040519081900360220190209392505050565b600081612fc4576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612fec5750670de0b6b3a7640000848281612fe957fe5b04145b613030576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561307e576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161308957fe5b049695505050505050565b611100828261376b565b6111bd81613776565b6000805b82518110156130f357836001600160a01b03168382815181106130ca57fe5b60200260200101516001600160a01b031614156130eb576001915050610999565b6001016130ab565b5060009392505050565b600082820283158061311757508284828161311457fe5b04145b61315b576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b200008101818110156131ae576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a764000082613089565b60006131c9612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b15801561321b57600080fd5b505afa15801561322f573d6000803e3d6000fd5b505050506040513d602081101561324557600080fd5b505190506001600160a01b038216633fdddaa287613269868863ffffffff612ec816565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b50505050856001600160a01b031663a9059cbb86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561333857600080fd5b505af115801561334c573d6000803e3d6000fd5b505050506040513d602081101561336257600080fd5b505161339f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613da56030913960400191505060405180910390fd5b505050505050565b60006133b1612f2a565b546001600160a01b0316141561340e576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6000613418612f2a565b546001600160a01b03169050600061342e6109d4565b90506000613442848363ffffffff612f8116565b90508061344e57600080fd5b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156134c657600080fd5b8101908080516040519392919084600160201b8211156134e557600080fd5b9083019060208201858111156134fa57600080fd5b82518660208202830111600160201b8211171561351657600080fd5b82525081516020918201928201910280838360005b8381101561354357818101518382015260200161352b565b50505050905001604052505050905060008090505b815181101561366c57600082828151811061356f57fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505190506000613611868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a919081900360200190a36136618333838561386a565b505050600101613558565b50613676856136df565b61368033866136e8565b60408051868152905133917f7a011ddbb8da163de89faccb018bb75c616e6ac270738b8bf1785f08ae1b2d6f919081900360200190a25050505050565b6000806040518080613c39602191396040519081900360210190209392505050565b6111bd81613a4c565b6111008282613ae3565b60008282018381101561373f576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b60008082841061375c5750508082036000613764565b505081810360015b9250929050565b611100823083612d94565b6000613780612d64565b3060009081526003820160205260409020549091508211156137e0576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152600382016020526040902054613802908363ffffffff612ec816565b3060009081526003830160205260409020556002810154613829908363ffffffff612ec816565b600282015560408051838152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613874612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516323b872dd60e01b81526001600160a01b038881166004830152306024830152604482018890529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50516139b55760405162461bcd60e51b8152600401808060200182810382526034815260200180613cdf6034913960400191505060405180910390fd5b6001600160a01b038216633fdddaa2876139d5868863ffffffff6136f216565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b50505050505050505050565b6000613a56612d64565b306000908152600382016020526040902054909150613a7b908363ffffffff6136f216565b3060009081526003830160205260409020556002810154613aa2908363ffffffff6136f216565b600282015560408051838152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b611100308383612d94565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b2f5782800160ff19823516178555613b5c565b82800160010185558215613b5c579182015b82811115613b5c578235825591602001919060010190613b41565b50613b68929150613b6c565b5090565b61093691905b80821115613b685760008155600101613b7256fe504261736963536d617274506f6f6c2e62696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e6f6e6c79546f6b656e42696e6465723a206e6f7420746f6b656e2062696e646572504261736963536d617274506f6f6c2e696e69743a205f696e697469616c537570706c792063616e206e6f74207a65726f504261736963536d617274506f6f6c2e756e62696e643a207472616e73666572206661696c656450436170706564536d617274506f6f6c2e73746f726167652e6c6f636174696f6e50436170706564536d617274506f6f6c2e77697468696e4361703a20436170206c696d697420726561636865645265656e74727950726f74656374696f6e2e6e6f5265656e7472793a207265656e747279206465746563746564504261736963536d617274506f6f6c2e726562696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e5f70756c6c556e6465726c79696e673a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e726562696e643a207472616e73666572206661696c65645265656e74727950726f74656374696f6e2e73746f726167652e6c6f636174696f6e8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925504261736963536d617274506f6f6c2e696e69743a20616c726561647920696e697469616c69736564504261736963536d617274506f6f6c2e5f70757368556e6465726c79696e673a207472616e73666572206661696c6564504261736963536d617274506f6f6c2e6f6e6c79436f6e74726f6c6c65723a206e6f7420636f6e74726f6c6c6572504261736963536d617274506f6f6c2e696e69743a205f62506f6f6c2063616e6e6f7420626520307830302e2e2e2e303030504261736963536d617274506f6f6c2e6f6e6c795075626c6963537761705365747465723a206e6f74207075626c6963207377617020736574746572a2646970667358221220921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e564736f6c63430006040033

Deployed Bytecode Sourcemap

36262:1432:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36262:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;16365:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;16365:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16567:214;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16567:214:0;;-1:-1:-1;;;;;16567:214:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19442:79;;;:::i;:::-;;;;;;;;;;;;;;;;16254:103;;;:::i;17716:566::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;17716:566:0;;;;;;;;;;;;;;;;;:::i;32549:98::-;;;:::i;:::-;;;;-1:-1:-1;;;;;32549:98:0;;;;;;;;;;;;;;26884:936;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;26884:936:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26884:936:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26884:936:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;26884:936:0;;-1:-1:-1;26884:936:0;-1:-1:-1;26884:936:0;:::i;:::-;;31386:108;;;:::i;14729:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24460:172;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24460:172:0;;:::i;37107:116::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37107:116:0;;:::i;30738:530::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30738:530:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30738:530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30738:530:0;;;;;;;;;;;;;;;;;;;28665:1003;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28665:1003:0;;-1:-1:-1;;;;;28665:1003:0;;;;;;;;;;;:::i;31858:101::-;;;:::i;36785:156::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36785:156:0;;:::i;24108:181::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24108:181:0;;;;:::i;31627:111::-;;;:::i;23301:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23301:244:0;-1:-1:-1;;;;;23301:244:0;;:::i;37327:85::-;;;:::i;36316:80::-;;;:::i;17097:451::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17097:451:0;;-1:-1:-1;;;;;17097:451:0;;;;;;:::i;16127:119::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16127:119:0;-1:-1:-1;;;;;16127:119:0;;:::i;18486:80::-;;;:::i;22924:193::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22924:193:0;-1:-1:-1;;;;;22924:193:0;;:::i;16464:95::-;;;:::i;17556:152::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17556:152:0;;-1:-1:-1;;;;;17556:152:0;;;;;;:::i;30285:127::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;30285:127:0;;;;;;;;;;;;;;;;;23716:209;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23716:209:0;-1:-1:-1;;;;;23716:209:0;;:::i;25934:717::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25934:717:0;;:::i;29764:513::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29764:513:0;-1:-1:-1;;;;;29764:513:0;;:::i;21531:741::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;21531:741:0;;-1:-1:-1;;;;;21531:741:0;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;21531:741:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;21531:741:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;21531:741:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;21531:741:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;21531:741:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;21531:741:0;;-1:-1:-1;21531:741:0;-1:-1:-1;21531:741:0;;:::i;32293:105::-;;;:::i;16789:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16789:300:0;;-1:-1:-1;;;;;16789:300:0;;;;;;:::i;15980:139::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15980:139:0;;;;;;;;;;:::i;28068:407::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28068:407:0;;-1:-1:-1;;;;;28068:407:0;;;;;;;;;;;:::i;11402:70::-;;;:::i;22437:316::-;;;:::i;32082:106::-;;;:::i;16365:91::-;16404:13;16437:6;:4;:6::i;:::-;16430:18;;;;;;;;;;;;;-1:-1:-1;;16430:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16365:91;;:::o;16567:214::-;16639:4;16693:7;16656:6;:4;:6::i;:::-;16673:10;16656:28;;;;:16;;;;;:28;;;;;;;;-1:-1:-1;;;;;16656:34:0;;;;;;;;;;;:44;;;;16716:35;;;;;;;-1:-1:-1;;16673:10:0;;16716:35;;;;16656:28;;-1:-1:-1;16656:28:0;-1:-1:-1;;;;;16716:35:0;;;;;;;;;-1:-1:-1;16769:4:0;16567:214;;;;;:::o;19442:79::-;19476:45;;;;;;;;;;;;;;;;19442:79;:::o;16254:103::-;16307:4;16331:6;:4;:6::i;:::-;:18;;;16324:25;;16254:103;:::o;17716:566::-;17807:4;17824:13;17840:6;:4;:6::i;:::-;17824:22;-1:-1:-1;;;;;;17865:18:0;;:10;:18;;:62;;-1:-1:-1;;;;;;17898:17:0;;;;;;:11;;;:17;;;;;;;;17916:10;17898:29;;;;;;;;17887:40;;;17865:62;17857:97;;;;;-1:-1:-1;;;17857:97:0;;;;;;;;;;;;-1:-1:-1;;;17857:97:0;;;;;;;;;;;;;;;17965:26;17971:4;17977;17983:7;17965:5;:26::i;:::-;-1:-1:-1;;;;;18006:18:0;;:10;:18;;;;:66;;-1:-1:-1;;;;;;18028:17:0;;;;;;:11;;;:17;;;;;;;;18046:10;18028:29;;;;;;;;-1:-1:-1;;18028:44:0;;18006:66;18002:251;;;-1:-1:-1;;;;;18121:17:0;;;;;;:11;;;:17;;;;;;;;18139:10;18121:29;;;;;;;;:43;;18156:7;18121:34;:43::i;:::-;-1:-1:-1;;;;;18089:17:0;;;;;;;:11;;;:17;;;;;;;;18107:10;18089:29;;;;;;;;;:75;;;18184:57;;;;;;;-1:-1:-1;;18184:57:0;;;;18107:10;;18184:57;;;;18089:17;-1:-1:-1;18089:17:0;-1:-1:-1;;;;;18184:57:0;;;;;;;;;18002:251;-1:-1:-1;18270:4:0;;17716:566;-1:-1:-1;;;;17716:566:0:o;32549:98::-;32591:7;32626:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;32626:12:0;;32549:98;-1:-1:-1;32549:98:0:o;26884:936::-;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;27012:6:::2;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;27012:12:0::2;::::0;-1:-1:-1;27012:12:0::2;27052:13;:11;:13::i;:::-;27035:30:::0;-1:-1:-1;27076:10:0::2;27089:23;:7:::0;27035:30;27089:23:::2;:12;:23;:::i;:::-;27076:36:::0;-1:-1:-1;27131:10:0;27123:19:::2;;12:1:-1;9::::0;2:12:::2;27123:19:0;27155:35;27170:10;27182:7;27155:14;:35::i;:::-;27201:23;27216:7;27201:14;:23::i;:::-;27237;27263:5;-1:-1:-1::0;;;;;27263:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;27263:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;27263:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27263:24:0;80:15:-1::0;;::::2;-1:-1:::0;;76:31:::2;65:43:::0;::::2;120:4;113:20:::0;15:2:::2;7:11:::0;::::2;4:2;;;31:1;28::::0;21:12:::2;4:2;27263:24:0::0;;::::2;::::0;;;;::::2;::::0;;;;;-1:-1:-1;;;11:20;::::2;8:2;;;44:1;41::::0;34:12:::2;8:2;62:21:::0;;::::2;::::0;123:4:::2;114:14:::0;::::2;138:31:::0;;::::2;135:2;;;182:1;179::::0;172:12:::2;135:2;213:10:::0;;-1:-1;;;244:29;::::2;325:2;307:21:::0;::::2;285:44:::0;::::2;282:59:::0;-1:-1;233:116:::2;230:2;;;362:1;359::::0;352:12:::2;230:2;373:25:::0;;-1:-1;27263:24:0;;421:4:-1::2;412:14:::0;;::::2;::::0;27263:24:0;::::2;::::0;::::2;::::0;412:14:-1;27263:24:0;23:1:-1::2;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;27263:24:0;;;;;;;;::::0;::::2;;27237:50;;27305:6;27314:1:::0;27305:10:::2;;27300:445;27321:6;:13;27317:1;:17;27300:445;;;27430:33;27440:6;27447:1;27440:9;;;;;;;;;;;;;;27451:11;;27430:33;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;27430:9:0::2;::::0;-1:-1:-1;;;27430:33:0:i:2;:::-;27427:80;;;27483:8;;27427:80;27521:9;27533:6;27540:1;27533:9;;;;;;;;;::::0;;::::2;::::0;;;;;;;27568:19:::2;::::0;;-1:-1:-1;;;27568:19:0;;-1:-1:-1;;;;;27568:19:0;;::::2;;::::0;::::2;::::0;;;27533:9;;-1:-1:-1;27557:8:0::2;::::0;27568:16;;::::2;::::0;::::2;::::0;:19;;;;;27533:9;;27568:19;;;;;;:16;:19;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;27568:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;27568:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;27568:19:0;;-1:-1:-1;27602:8:0::2;27613:15;:5:::0;27568:19;27613:15:::2;:10;:15;:::i;:::-;27648:28;::::0;;;;;;;;;-1:-1:-1;;;;;;27648:28:0;::::2;::::0;27657:10:::2;::::0;27648:28:::2;::::0;;;;;::::2;::::0;;::::2;27693:40;27709:1;27712:10;27724:3;27729;27693:15;:40::i;:::-;27300:445;;;;27336:3;;27300:445;;;-1:-1:-1::0;27760:52:0::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;27779:10:::2;::::0;27760:52:::2;::::0;27791:7;;27800:11;;;;27760:52;;;;;27800:11;;27760:52;::::2;::::0;27800:11;27760:52;1:33:-1::2;99:1;81:16:::0;;::::2;74:27:::0;27760:52:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;27760:52:0::0;;::::2;::::0;-1:-1:-1;27760:52:0;;-1:-1:-1;;;;;27760:52:0::2;18832:1;;;;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19795:1;26884:936:::0;;;:::o;31386:108::-;31442:7;31469:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;31469:17:0;;31386:108;-1:-1:-1;31386:108:0:o;14729:35::-;14762:2;14729:35;:::o;24460:172::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;24548:32:::2;::::0;;;;;;;18803:18;;-1:-1:-1;24559:10:0::2;::::0;24548:32:::2;::::0;;;;::::2;::::0;;::::2;24591:6;:4;:6::i;:::-;:12:::0;:33:::2;::::0;;-1:-1:-1;;;24591:33:0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;24591:12:0;;::::2;::::0;-1:-1:-1;;24591:33:0;;;;;-1:-1:-1;;24591:33:0;;;;;;;;-1:-1:-1;24591:12:0;:33;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;24591:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;24591:33:0;;;;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20883:1;24460:172:::0;:::o;37107:116::-;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;37191:24:0::2;37207:7:::0;37191:15:::2;:24::i;:::-;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36567:1;36603:6:::0;:4;:6::i;:::-;:10;36587:13;:11;:13::i;:::-;:26;36579:84;;;;-1:-1:-1;;;36579:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37107:116;:::o;30738:530::-;30815:23;30840:24;30886:6;:4;:6::i;:::-;:12;:31;;;-1:-1:-1;;;30886:31:0;;;;-1:-1:-1;;;;;30886:12:0;;;;-1:-1:-1;;30886:31:0;;;;;:12;;:31;;;;;;;;:12;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;30886:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30886:31:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30886:31:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;30886:31:0;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;325:2;307:21;;285:44;;282:59;-1:-1;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;30886:31:0;;421:4:-1;412:14;;;;30886:31:0;;;;;412:14:-1;30886:31:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30886:31:0;;;;;;;;;;;30877:40;;30952:6;:13;30938:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;30938:28:0;;30928:38;;30977:13;30993:27;31006:13;:11;:13::i;:::-;30993:7;;:27;:12;:27;:::i;:::-;30977:43;-1:-1:-1;31037:9:0;31033:228;31056:6;:13;31052:1;:17;31033:228;;;31092:9;31104:6;31111:1;31104:9;;;;;;;;;;;;;;31092:21;;31128:11;31142:6;:4;:6::i;:::-;:12;:26;;;-1:-1:-1;;;31142:26:0;;-1:-1:-1;;;;;31142:26:0;;;;;;;;;:12;;;;;-1:-1:-1;;31142:26:0;;;;;;;;;;;;;;:12;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;31142:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31142:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31142:26:0;;-1:-1:-1;31183:14:0;31200:15;:5;31142:26;31200:15;:10;:15;:::i;:::-;31183:32;;31243:6;31230:7;31238:1;31230:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;;31071:4:0;;31033:228;;;;30738:530;;;;:::o;28665:1003::-;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;28793:6:::2;:4;:6::i;:::-;:12:::0;28934:18:::2;::::0;;-1:-1:-1;;;28934:18:0;;-1:-1:-1;;;;;28934:18:0;;::::2;;::::0;::::2;::::0;;;28793:12;;;::::2;::::0;-1:-1:-1;28934:18:0;;28793:12;;28934:10:::2;::::0;:18;;;;;-1:-1:-1;;28934:18:0;;;;;;;;-1:-1:-1;28793:12:0;28934:18;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28934:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;28986:31:0::2;::::0;;-1:-1:-1;;;28986:31:0;;-1:-1:-1;;;;;28986:31:0;;::::2;;::::0;::::2;::::0;;;28965:18:::2;::::0;-1:-1:-1;28986:15:0;;::::2;::::0;-1:-1:-1;28986:15:0::2;::::0;:31;;;;;::::2;::::0;;;;;;;;:15;:31;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28986:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28986:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;28986:31:0;;-1:-1:-1;29087:21:0;;::::2;29084:238;;;-1:-1:-1::0;;;;;29133:18:0;::::2;;29152:10;29172:4;29179:25;:8:::0;29193:10;29179:13:::2;:25::i;:::-;29133:72;::::0;;-1:-1:-1;;;;;;29133:72:0::2;::::0;;;;;;-1:-1:-1;;;;;29133:72:0;;::::2;;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;;;::::2;::::0;;;;;;;;-1:-1:-1;29133:72:0;;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29133:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29133:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29133:72:0;29125:128:::2;;;;-1:-1:-1::0;;;29125:128:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29268:42;::::0;;-1:-1:-1;;;29268:42:0;;-1:-1:-1;;;;;29268:42:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;29268:42:0;;;;;;:13;;::::2;::::0;-1:-1:-1;;29268:42:0;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;29268:13:0;:42;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29268:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29268:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;;29084:238:0::2;29334:39;::::0;;-1:-1:-1;;;29334:39:0;;-1:-1:-1;;;;;29334:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;:12;;::::2;::::0;::::2;::::0;:39;;;;;-1:-1:-1;;29334:39:0;;;;;;;;-1:-1:-1;29334:12:0;:39;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29334:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;29480:30:0::2;::::0;;-1:-1:-1;;;29480:30:0;;29504:4:::2;29480:30;::::0;::::2;::::0;;;-1:-1:-1;;;;;;;;29480:15:0;::::2;::::0;-1:-1:-1;;;29480:30:0;;;;;::::2;::::0;;;;;;;;;:15;:30;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29480:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29480:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29480:30:0;;-1:-1:-1;29524:16:0;;29521:140:::2;;29565:40;::::0;;-1:-1:-1;;;29565:40:0;;29580:10:::2;29565:40;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;29565:14:0;::::2;::::0;-1:-1:-1;;29565:40:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;29565:14:0;:40;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29565:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29565:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29565:40:0;29557:92:::2;;;;-1:-1:-1::0;;;29557:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18832:1;;;;18865:6:::1;:4;:6::i;31858:101::-:0;31906:7;31933:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;31933:18:0;;31858:101;-1:-1:-1;31858:101:0:o;36785:156::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;36876:10:0::2;36865:40;36888:6;:4;:6::i;:::-;:10:::0;36865:40:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;::::2;36929:4;36916:6;:4;:6::i;:::-;:17:::0;18865:6:::1;:4;:6::i;24108:181::-:0;20965:6;:4;:6::i;:::-;:23;;;-1:-1:-1;;;;;20965:23:0;20951:10;:37;20943:110;;;;-1:-1:-1;;;20943:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;24201:34:::2;::::0;18803:18;;-1:-1:-1;24201:34:0;::::2;;::::0;24215:10:::2;::::0;24201:34:::2;::::0;18803:18:::1;::::0;24201:34:::2;24246:6;:4;:6::i;:::-;:12:::0;:35:::2;::::0;;-1:-1:-1;;;24246:35:0;;;::::2;;;::::0;::::2;::::0;;;-1:-1:-1;;;;;24246:12:0;;::::2;::::0;:26:::2;::::0;:35;;;;;-1:-1:-1;;24246:35:0;;;;;;;;-1:-1:-1;24246:12:0;:35;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;31627:111:0::0;31680:7;31707:6;:4;:6::i;:::-;:23;;;-1:-1:-1;;;;;31707:23:0;;31627:111;-1:-1:-1;31627:111:0:o;23301:244::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23410:70:0;::::2;23434:6;:4;:6::i;:::-;:23;;::::0;23410:70:::2;::::0;-1:-1:-1;;;;;23434:23:0;;::::2;::::0;23410:70:::2;::::0;23434:23:::2;::::0;23410:70:::2;23517:20;23491:6;:4;:6::i;:::-;:23;;:46:::0;;-1:-1:-1;;;;;;23491:46:0::2;-1:-1:-1::0;;;;;23491:46:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;37327:85::-:0;37367:7;37394:6;:4;:6::i;:::-;:10;;-1:-1:-1;37327:85:0;:::o;36316:80::-;36350:46;;;;;;;;;;;;;;;;;;36316:80;:::o;17097:451::-;17169:4;17186:13;17202:6;:4;:6::i;:::-;17247:10;17219:13;17235:23;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17235:29:0;;;;;;;;;;:11;;-1:-1:-1;17279:18:0;;;17275:171;;;17326:10;17346:1;17314:23;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17314:29:0;;;;;;;;;:33;17275:171;;;17412:22;:8;17426:7;17412:22;:13;:22;:::i;:::-;17392:10;17380:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17380:29:0;;;;;;;;;:54;17275:171;17470:10;17488:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17461:57:0;;17488:29;;;;;;;;;;17461:57;;;;;;;-1:-1:-1;;17461:57:0;;17470:10;17461:57;;17488:23;-1:-1:-1;17488:23:0;-1:-1:-1;;;;;17461:57:0;;;;;;;;;;-1:-1:-1;17536:4:0;;17097:451;-1:-1:-1;;;;17097:451:0:o;16127:119::-;16193:4;16217:6;:4;:6::i;:::-;-1:-1:-1;;;;;16217:21:0;;;;;;;;:14;;;;:21;;-1:-1:-1;16217:21:0;;;;;16127:119::o;18486:80::-;18519:47;;;;;;;;;;;;;;;;;;18486:80;:::o;22924:193::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23018:49:0;::::2;23036:6;:4;:6::i;:::-;:17;;::::0;23018:49:::2;::::0;-1:-1:-1;;;;;23036:17:0;;::::2;::::0;23018:49:::2;::::0;23036:17:::2;::::0;23018:49:::2;23098:11;23078:6;:4;:6::i;:::-;:17;;:31:::0;;-1:-1:-1;;;;;;23078:31:0::2;-1:-1:-1::0;;;;;23078:31:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;16464:95::-:0;16505:13;16538:6;:4;:6::i;:::-;:13;;;;16531:20;;;;;;;;;;;;;-1:-1:-1;;16531:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16538:13;16531:20;;;;;;;;;;;;;;;;;;;;;;;;17556:152;17629:4;17646:32;17652:10;17664:4;17670:7;17646:5;:32::i;:::-;-1:-1:-1;17696:4:0;17556:152;;;;:::o;30285:127::-;30337:16;30373:6;:4;:6::i;:::-;:12;:31;;;-1:-1:-1;;;30373:31:0;;;;-1:-1:-1;;;;;30373:12:0;;;;-1:-1:-1;;30373:31:0;;;;;:12;;:31;;;;;;;;:12;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;30373:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30373:31:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30373:31:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;30373:31:0;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;325:2;307:21;;285:44;;282:59;-1:-1;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;30373:31:0;;421:4:-1;412:14;;;;30373:31:0;;;;;412:14:-1;30373:31:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30373:31:0;;;;;;;;;;;30366:38;;30285:127;:::o;23716:209::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23815:55:0;::::2;23834:6;:4;:6::i;:::-;:18;;::::0;23815:55:::2;::::0;-1:-1:-1;;;;;23834:18:0;;::::2;::::0;23815:55:::2;::::0;23834:18:::2;::::0;23815:55:::2;23902:15;23881:6;:4;:6::i;:::-;:18;;:36:::0;;-1:-1:-1;;;;;;23881:36:0::2;-1:-1:-1::0;;;;;23881:36:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;25934:717::-:0;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;26029:6:::2;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;26029:12:0::2;::::0;-1:-1:-1;26029:12:0::2;26069:13;:11;:13::i;:::-;26052:30:::0;-1:-1:-1;26093:10:0::2;26106:23;:7:::0;26052:30;26106:23:::2;:12;:23;:::i;:::-;26093:36:::0;-1:-1:-1;26148:10:0;26140:19:::2;;12:1:-1;9::::0;2:12:::2;26140:19:0;26172:35;26187:10;26199:7;26172:14;:35::i;:::-;26218:23;26233:7;26218:14;:23::i;:::-;26254;26280:5;-1:-1:-1::0;;;;;26280:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;26280:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;26280:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;26280:24:0;80:15:-1::0;;::::2;-1:-1:::0;;76:31:::2;65:43:::0;::::2;120:4;113:20:::0;15:2:::2;7:11:::0;::::2;4:2;;;31:1;28::::0;21:12:::2;4:2;26280:24:0::0;;::::2;::::0;;;;::::2;::::0;;;;;-1:-1:-1;;;11:20;::::2;8:2;;;44:1;41::::0;34:12:::2;8:2;62:21:::0;;::::2;::::0;123:4:::2;114:14:::0;::::2;138:31:::0;;::::2;135:2;;;182:1;179::::0;172:12:::2;135:2;213:10:::0;;-1:-1;;;244:29;::::2;325:2;307:21:::0;::::2;285:44:::0;::::2;282:59:::0;-1:-1;233:116:::2;230:2;;;362:1;359::::0;352:12:::2;230:2;373:25:::0;;-1:-1;26280:24:0;;421:4:-1::2;412:14:::0;;::::2;::::0;26280:24:0;::::2;::::0;::::2;::::0;412:14:-1;26280:24:0;23:1:-1::2;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;26280:24:0;;;;;;;;::::0;::::2;;26254:50;;26322:6;26331:1:::0;26322:10:::2;;26317:280;26338:6;:13;26334:1;:17;26317:280;;;26373:9;26385:6;26392:1;26385:9;;;;;;;;;::::0;;::::2;::::0;;;;;;;26420:19:::2;::::0;;-1:-1:-1;;;26420:19:0;;-1:-1:-1;;;;;26420:19:0;;::::2;;::::0;::::2;::::0;;;26385:9;;-1:-1:-1;26409:8:0::2;::::0;26420:16;;::::2;::::0;::::2;::::0;:19;;;;;26385:9;;26420:19;;;;;;:16;:19;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;26420:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;26420:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;26420:19:0;;-1:-1:-1;26454:8:0::2;26465:15;:5:::0;26420:19;26465:15:::2;:10;:15;:::i;:::-;26500:28;::::0;;;;;;;;;-1:-1:-1;;;;;;26500:28:0;::::2;::::0;26509:10:::2;::::0;26500:28:::2;::::0;;;;;::::2;::::0;;::::2;26545:40;26561:1;26564:10;26576:3;26581;26545:15;:40::i;:::-;-1:-1:-1::0;;;26353:3:0::2;;26317:280;;;-1:-1:-1::0;26612:31:0::2;::::0;;;;;;;26623:10:::2;::::0;26612:31:::2;::::0;;;;;::::2;::::0;;::::2;18832:1;;;;18865:6:::1;:4;:6::i;29764:513::-:0;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;29857:6:::2;:4;:6::i;:::-;:12:::0;29962:20:::2;::::0;;-1:-1:-1;;;29962:20:0;;-1:-1:-1;;;;;29962:20:0;;::::2;;::::0;::::2;::::0;;;29857:12;;;::::2;::::0;-1:-1:-1;29962:20:0;;29857:12;;-1:-1:-1;;29962:20:0;;;;;-1:-1:-1;;29962:20:0;;;;;;;;-1:-1:-1;29857:12:0;29962:20;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29962:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;30089:30:0::2;::::0;;-1:-1:-1;;;30089:30:0;;30113:4:::2;30089:30;::::0;::::2;::::0;;;-1:-1:-1;;;;;;;;30089:15:0;::::2;::::0;-1:-1:-1;;;30089:30:0;;;;;::::2;::::0;;;;;;;;;:15;:30;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;30089:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;30089:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;30089:30:0;;-1:-1:-1;30133:16:0;;30130:140:::2;;30174:40;::::0;;-1:-1:-1;;;30174:40:0;;30189:10:::2;30174:40;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;30174:14:0;::::2;::::0;-1:-1:-1;;30174:40:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;30174:14:0;:40;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;30174:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;30174:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;30174:40:0;30166:92:::2;;;;-1:-1:-1::0;;;30166:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18832:1;;;18865:6:::1;:4;:6::i;21531:741::-:0;21653:13;21669:6;:4;:6::i;:::-;21702:7;;;;-1:-1:-1;;;;;;21702:7:0;21694:30;21686:84;;;;-1:-1:-1;;;21686:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21789:20:0;;21781:83;;;;-1:-1:-1;;;21781:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21883:19;21875:81;;;;-1:-1:-1;;;21875:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21967:24;;-1:-1:-1;;;;;;21967:24:0;;;-1:-1:-1;;;;;21967:24:0;;;;;-1:-1:-1;22002:12:0;;:25;;22017:10;22002:25;;;;;;;;22038:18;;;:31;;;;;;;;22080:13;;;:26;;;;;;;;22131:5;;22117:6;:4;:6::i;:::-;:19;;:11;;:19;:::i;:::-;;22163:7;;22147:6;:4;:6::i;:::-;:13;;:23;;;;;;;:::i;:::-;;22181:30;22196:14;22181;:30::i;:::-;22222:42;22237:10;22249:14;22222;:42::i;:::-;21531:741;;;;;;;:::o;32293:105::-;32338:7;32365:6;:4;:6::i;:::-;:12;:25;;;-1:-1:-1;;;32365:25:0;;;;-1:-1:-1;;;;;32365:12:0;;;;:23;;:25;;;;;;;;;;;;;;;:12;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;32365:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32365:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32365:25:0;;-1:-1:-1;32293:105:0;:::o;16789:300::-;16861:4;16878:13;16894:6;:4;:6::i;:::-;16955:10;16943:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;16943:29:0;;;;;;;;;;:11;;-1:-1:-1;16943:43:0;;16978:7;16943:34;:43::i;:::-;16923:10;16911:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;16911:29:0;;;;;;;;;;;:75;;;17002:57;;;;;;;-1:-1:-1;;16911:29:0;;17002:57;;;;16911:23;-1:-1:-1;16911:23:0;-1:-1:-1;;;;;17002:57:0;;;;;;;;;;-1:-1:-1;17077:4:0;;16789:300;-1:-1:-1;;;16789:300:0:o;15980:139::-;16059:4;16083:6;:4;:6::i;:::-;-1:-1:-1;;;;;16083:22:0;;;;;;;:16;;;;;:22;;;;;;;;:28;;;;;;;;;;-1:-1:-1;16083:28:0;;;15980:139::o;28068:407::-;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;28194:6:::2;:4;:6::i;:::-;:12:::0;28265:55:::2;::::0;;-1:-1:-1;;;28265:55:0;;28284:10:::2;28265:55;::::0;::::2;::::0;28304:4:::2;28265:55:::0;;;;;;;;;;;;-1:-1:-1;;;;;28194:12:0;;::::2;::::0;-1:-1:-1;28239:6:0;;28265:18;::::2;::::0;-1:-1:-1;;28265:55:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;28265:18:0;:55;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28265:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28265:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;28265:55:0;28257:109:::2;;;;-1:-1:-1::0;;;28257:109:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28377:42;::::0;;-1:-1:-1;;;28377:42:0;;-1:-1:-1;;;;;28377:42:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;28377:42:0;;;;;;:13;;::::2;::::0;-1:-1:-1;;28377:42:0;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;28377:13:0;:42;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28377:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28377:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;;28430:37:0::2;::::0;;-1:-1:-1;;;28430:37:0;;-1:-1:-1;;;;;28430:37:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;:10;;::::2;::::0;::::2;::::0;:37;;;;;-1:-1:-1;;28430:37:0;;;;;;;;-1:-1:-1;28430:10:0;:37;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28430:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28430:37:0;;;;18832:1;;18865:6:::1;:4;:6::i;11402:70::-:0;11435:37;;;-1:-1:-1;;;11435:37:0;;;;;;;;;;;;11402:70;:::o;22437:316::-;18751:6;:4;:6::i;:::-;:21;;;;;;:18;18803:6;:4;:6::i;:::-;:18;;-1:-1:-1;18803:18:0;22505:6:::1;:4;:6::i;:::-;:12:::0;22554:24:::1;::::0;;-1:-1:-1;;;22554:24:0;;;;-1:-1:-1;;;;;22505:12:0;;::::1;::::0;-1:-1:-1;22528:23:0::1;::::0;22505:12;;-1:-1:-1;;22554:24:0::1;::::0;;::::1;::::0;22505:12:::1;::::0;22554:24;;;;;;;22505:12;22554:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22554:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22554:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;22554:24:0;80:15:-1::0;;::::1;-1:-1:::0;;76:31:::1;65:43:::0;::::1;120:4;113:20:::0;15:2:::1;7:11:::0;::::1;4:2;;;31:1;28::::0;21:12:::1;4:2;22554:24:0::0;;::::1;::::0;;;;::::1;::::0;;;;;-1:-1:-1;;;11:20;::::1;8:2;;;44:1;41::::0;34:12:::1;8:2;62:21:::0;;::::1;::::0;123:4:::1;114:14:::0;::::1;138:31:::0;;::::1;135:2;;;182:1;179::::0;172:12:::1;135:2;213:10:::0;;-1:-1;;;244:29;::::1;325:2;307:21:::0;::::1;285:44:::0;::::1;282:59:::0;-1:-1;233:116:::1;230:2;;;362:1;359::::0;352:12:::1;230:2;373:25:::0;;-1:-1;22554:24:0;;421:4:-1::1;412:14:::0;;::::1;::::0;22554:24:0;::::1;::::0;::::1;::::0;412:14:-1;22554:24:0;23:1:-1::1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;22554:24:0;;;;;;;;::::0;::::1;;22528:50;;22593:9;22605:1:::0;22593:13:::1;;22589:125;22612:6;:13;22608:1;:17;22589:125;;;22655:6;22662:1;22655:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;22648:54:::1;::::0;;-1:-1:-1;;;22648:54:0;;-1:-1:-1;;;;;22648:54:0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;22648:54:0;;;;;;:25;;;::::1;::::0;::::1;::::0;:54;;;;;;;;;;;-1:-1:-1;22648:25:0;:54;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22648:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22648:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;22627:4:0::1;;22589:125;;;-1:-1:-1::0;22729:16:0::1;::::0;::::1;::::0;;;::::1;18832:1;;18865:6:::0;:4;:6::i;:::-;:18;18852:31;;18844:89;;;;-1:-1:-1;;;18844:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32082:106;32129:4;32153:6;:4;:6::i;:::-;:12;:27;;;-1:-1:-1;;;32153:27:0;;;;-1:-1:-1;;;;;32153:12:0;;;;-1:-1:-1;;32153:27:0;;;;;;;;;;;;;;;:12;:27;;;2:2:-1;;;;27:1;24;17:12;11812:151:0;11435:37;;;-1:-1:-1;;;11435:37:0;;;;;;;;;;;;;11917:39::o;15406:338::-;15483:13;15499:6;:4;:6::i;:::-;-1:-1:-1;;;;;15524:15:0;;;;;;:9;;;:15;;;;;;:9;;-1:-1:-1;;;15524:26:0;15516:59;;;;;-1:-1:-1;;;15516:59:0;;;;;;;;;;;;-1:-1:-1;;;15516:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15604:15:0;;;;;;:9;;;:15;;;;;;:29;;15625:7;15604:20;:29::i;:::-;-1:-1:-1;;;;;15586:15:0;;;;;;;:9;;;:15;;;;;;:47;;;;15662:15;;;;;;;:29;;15683:7;15662:20;:29::i;:::-;-1:-1:-1;;;;;15644:15:0;;;;;;;:9;;;:15;;;;;;;;;:47;;;;15707:29;;;;;;;15644:15;;15707:29;;;;;;;;;;;;;15406:338;;;;:::o;12671:202::-;12742:4;12765:6;12773:9;12786:14;12795:1;12798;12786:8;:14::i;:::-;12764:36;;;;12820:4;12819:5;12811:35;;;;;-1:-1:-1;;;12811:35:0;;;;;;;;;;;;-1:-1:-1;;;12811:35:0;;;;;;;;;;;;;;;-1:-1:-1;12864:1:0;12671:202;-1:-1:-1;;;12671:202:0:o;36019:152::-;19476:45;;;;;;;;;;;;;;;;;36125:39::o;19083:151::-;19122:13;19148:11;18519:47;;;;;;;;;;;;;;;;;;;19188:39;-1:-1:-1;;;19188:39:0:o;13280:387::-;13351:4;13381:6;13373:31;;;;;-1:-1:-1;;;13373:31:0;;;;;;;;;;;;-1:-1:-1;;;13373:31:0;;;;;;;;;;;;;;;12056:6;13425:8;;13452:6;;;:24;;;12056:6;13467:1;13462:2;:6;;;;;;:14;13452:24;13444:53;;;;;-1:-1:-1;;;13444:53:0;;;;;;;;;;;;-1:-1:-1;;;13444:53:0;;;;;;;;;;;;;;;13545:1;13541:5;;13535:12;;13566:8;;;;13558:37;;;;;-1:-1:-1;;;13558:37:0;;;;;;;;;;;;-1:-1:-1;;;13558:37:0;;;;;;;;;;;;;;;13623:7;13638:1;13633:2;:6;;;;;;;13280:387;-1:-1:-1;;;;;;13280:387:0:o;34538:119::-;34628:21;34634:5;34641:7;34628:5;:21::i;34770:97::-;34845:14;34851:7;34845:5;:14::i;35624:280::-;35710:4;;35727:147;35750:9;:16;35746:1;:20;35727:147;;;35792:12;;-1:-1:-1;;;;;35792:23:0;;;:9;;35802:1;;35792:12;;;;;;;;;;;;-1:-1:-1;;;;;35792:23:0;;35789:74;;;35843:4;35836:11;;;;;35789:74;35768:4;;35727:147;;;-1:-1:-1;35891:5:0;;35624:280;-1:-1:-1;;;35624:280:0:o;12922:311::-;12993:4;13025:5;;;13049:6;;;:21;;;13069:1;13064;13059:2;:6;;;;;;:11;13049:21;13041:50;;;;;-1:-1:-1;;;13041:50:0;;;;;;;;;;;;-1:-1:-1;;;13041:50:0;;;;;;;;;;;;;;;13118:8;13112:15;;13146:8;;;;13138:37;;;;;-1:-1:-1;;;13138:37:0;;;;;;;;;;;;-1:-1:-1;;;13138:37:0;;;;;;;;;;;;;;;13186:7;12056:6;13196:2;:9;;33867:503;33998:12;34013:6;:4;:6::i;:::-;:12;34143:35;;;-1:-1:-1;;;34143:35:0;;-1:-1:-1;;;;;34143:35:0;;;;;;;;;34013:12;;;;;-1:-1:-1;;;34013:12:0;;34143:27;;:35;;;;;;;;;;;;;;;34013:12;34143:35;;;2:2:-1;;;;27:1;24;17:12;2:2;34143:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34143:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34143:35:0;;-1:-1:-1;;;;;;34189:12:0;;;34202:6;34210:27;:13;34229:7;34210:18;:27::i;:::-;34189:62;;;-1:-1:-1;;;;;;34189:62:0;;;;;;;-1:-1:-1;;;;;34189:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34189:62:0;;;;;;;-1:-1:-1;34189:62:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;34189:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34272:37:0;;;-1:-1:-1;;;34272:37:0;;-1:-1:-1;;;;;34272:37:0;;;;;;;;;;;;;;;:23;;;;-1:-1:-1;34272:23:0;;-1:-1:-1;34272:37:0;;;;;;;;;;;;;;;-1:-1:-1;34272:23:0;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;34272:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34272:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34272:37:0;34264:98;;;;-1:-1:-1;;;34264:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33867:503;;;;;;:::o;25049:733::-;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25119:12:::1;25134:6;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;25134:12:0::1;::::0;-1:-1:-1;25134:12:0::1;25174:13;:11;:13::i;:::-;25157:30:::0;-1:-1:-1;25198:10:0::1;25211:23;:7:::0;25157:30;25211:23:::1;:12;:23;:::i;:::-;25198:36:::0;-1:-1:-1;25253:10:0;25245:19:::1;;12:1:-1;9::::0;2:12:::1;25245:19:0;25277:23;25303:5;-1:-1:-1::0;;;;;25303:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;25303:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25303:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;25303:24:0;80:15:-1::0;;::::1;-1:-1:::0;;76:31:::1;65:43:::0;::::1;120:4;113:20:::0;15:2:::1;7:11:::0;::::1;4:2;;;31:1;28::::0;21:12:::1;4:2;25303:24:0::0;;::::1;::::0;;;;::::1;::::0;;;;;-1:-1:-1;;;11:20;::::1;8:2;;;44:1;41::::0;34:12:::1;8:2;62:21:::0;;::::1;::::0;123:4:::1;114:14:::0;::::1;138:31:::0;;::::1;135:2;;;182:1;179::::0;172:12:::1;135:2;213:10:::0;;-1:-1;;;244:29;::::1;325:2;307:21:::0;::::1;285:44:::0;::::1;282:59:::0;-1:-1;233:116:::1;230:2;;;362:1;359::::0;352:12:::1;230:2;373:25:::0;;-1:-1;25303:24:0;;421:4:-1::1;412:14:::0;;::::1;::::0;25303:24:0;::::1;::::0;::::1;::::0;412:14:-1;25303:24:0;23:1:-1::1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;25303:24:0;;;;;;;;::::0;::::1;;25277:50;;25345:6;25354:1:::0;25345:10:::1;;25340:308;25361:6;:13;25357:1;:17;25340:308;;;25396:9;25408:6;25415:1;25408:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;25443:19:::1;::::0;;-1:-1:-1;;;25443:19:0;;-1:-1:-1;;;;;25443:19:0;;::::1;;::::0;::::1;::::0;;;25408:9;;-1:-1:-1;25432:8:0::1;::::0;25443:16;;::::1;::::0;::::1;::::0;:19;;;;;25408:9;;25443:19;;;;;;:16;:19;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25443:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25443:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25443:19:0;;-1:-1:-1;25477:18:0::1;25498:15;:5:::0;25443:19;25498:15:::1;:10;:15;:::i;:::-;25533:38;::::0;;;;;;;;;-1:-1:-1;;;;;;25533:38:0;::::1;::::0;25542:10:::1;::::0;25533:38:::1;::::0;;;;;::::1;::::0;;::::1;25586:50;25602:1;25605:10;25617:13;25632:3;25586:15;:50::i;:::-;-1:-1:-1::0;;;25376:3:0::1;;25340:308;;;;25658:23;25673:7;25658:14;:23::i;:::-;25692:35;25707:10;25719:7;25692:14;:35::i;:::-;25743:31;::::0;;;;;;;25754:10:::1;::::0;25743:31:::1;::::0;;;;;::::1;::::0;;::::1;19795:1;;;;25049:733:::0;:::o;37537:152::-;37576:13;37602:11;36350:46;;;;;;;;;;;;;;;;;;;37643:39;-1:-1:-1;;;37643:39:0:o;34982:97::-;35057:14;35063:7;35057:5;:14::i;35258:115::-;35346:19;35352:3;35357:7;35346:5;:19::i;12127:180::-;12198:4;12229:5;;;12253:6;;;;12245:35;;;;;-1:-1:-1;;;12245:35:0;;;;;;;;;;;;-1:-1:-1;;;12245:35:0;;;;;;;;;;;;;;;12298:1;12127:180;-1:-1:-1;;;12127:180:0:o;12387:223::-;12462:4;12468;12499:1;12494;:6;12490:113;;-1:-1:-1;;12525:5:0;;;12532;12517:21;;12490:113;-1:-1:-1;;12579:5:0;;;12586:4;12490:113;12387:223;;;;;:::o;15864:108::-;15928:36;15934:5;15949:4;15956:7;15928:5;:36::i;15050:348::-;15099:13;15115:6;:4;:6::i;:::-;15158:4;15140:24;;;;:9;;;:24;;;;;;15099:22;;-1:-1:-1;15140:35:0;-1:-1:-1;15140:35:0;15132:68;;;;;-1:-1:-1;;;15132:68:0;;;;;;;;;;;;-1:-1:-1;;;15132:68:0;;;;;;;;;;;;;;;15256:4;15238:24;;;;:9;;;:24;;;;;;:38;;15268:7;15238:38;:29;:38;:::i;:::-;15229:4;15211:24;;;;:9;;;:24;;;;;:65;15303:13;;;;:27;;15322:7;15303:27;:18;:27;:::i;:::-;15287:13;;;:43;15346:44;;;;;;;;15378:1;;15363:4;;15346:44;;;;;;;;;15050:348;;:::o;32999:530::-;33132:12;33147:6;:4;:6::i;:::-;:12;33277:35;;;-1:-1:-1;;;33277:35:0;;-1:-1:-1;;;;;33277:35:0;;;;;;;;;33147:12;;;;;-1:-1:-1;;;33147:12:0;;33277:27;;:35;;;;;;;;;;;;;;;33147:12;33277:35;;;2:2:-1;;;;27:1;24;17:12;2:2;33277:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33277:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33277:35:0;33333:58;;;-1:-1:-1;;;33333:58:0;;-1:-1:-1;;;;;33333:58:0;;;;;;;33376:4;33333:58;;;;;;;;;;;;33277:35;;-1:-1:-1;33333:27:0;;;;-1:-1:-1;;33333:58:0;;;;;33277:35;;33333:58;;;;;;;;-1:-1:-1;33333:27:0;:58;;;2:2:-1;;;;27:1;24;17:12;2:2;33333:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33333:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33333:58:0;33325:123;;;;-1:-1:-1;;;33325:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33459:12:0;;;33472:6;33480:27;:13;33499:7;33480:18;:27::i;:::-;33459:62;;;-1:-1:-1;;;;;;33459:62:0;;;;;;;-1:-1:-1;;;;;33459:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33459:62:0;;;;;;;-1:-1:-1;33459:62:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;33459:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33459:62:0;;;;32999:530;;;;;;:::o;14773:269::-;14822:13;14838:6;:4;:6::i;:::-;14900:4;14882:24;;;;:9;;;:24;;;;;;14822:22;;-1:-1:-1;14882:38:0;;14912:7;14882:38;:29;:38;:::i;:::-;14873:4;14855:24;;;;:9;;;:24;;;;;:65;14947:13;;;;:27;;14966:7;14947:27;:18;:27;:::i;:::-;14931:13;;;:43;14990:44;;;;;;;;15019:4;;15007:1;;14990:44;;;;;;;;;14773:269;;:::o;15752:104::-;15814:34;15828:4;15835:3;15840:7;15814:5;:34::i;36262:1432::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36262:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36262:1432:0;;;-1:-1:-1;36262:1432:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e5

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  ]

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.