Contract 0x9E0510F6FD105fb23E16Ff607d36c2d6D7d2eF3a

PSA: API Key will be required starting from  April 15th, 2021.  Learn More. 
Txn Hash
Block
From
To
Value [Txn Fee]
0x0d0ba76096d7d171319d24ceeef4049e1c39484b64e5c66d10f4f2cb0993255e53882452021-03-04 14:43:3042 days 3 hrs ago0xf78af0039a22cbd45444edaeab2ce9f086d8ec99 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00014493
0xb1c8fbd3ebeb54d1607088e84c5288b64b28a505ef007d596a92026ae80b930853856302021-03-04 12:32:4542 days 5 hrs ago0x6ef31c881e253e41b29522fed76cb653caa1b07f IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00014493
0xeecdb26e3b4f4c01c524805d8af9773b1a15467720813f9759e2e83ccc3316f750487952021-02-20 17:04:0354 days 41 mins ago0x660c6e11612cdf5fceb297a84071aff390e13c06 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00109907
0xd6fb997f5bd2a7b753715995f41ee3be261410c600fb004a338b606b6b574f4844933972021-02-01 6:23:4373 days 11 hrs ago0xc6d5c1d5df10855b04e4ed388b62503c779fa010 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219814
0xf7bdb8c2123e8460cc35acc1672950b1b98565af18fe8a92ec031ae0279318c043576422021-01-27 13:05:3578 days 4 hrs ago0xa718148937e68e68d1ec883870d7e0da6d65c96b IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00249862
0x82f8b525f434d883858581dc9ac834423248feb4b51de5764c5e547eca1685df43144272021-01-26 1:03:5479 days 16 hrs ago0xd3f4381936a90db280c62b2783664c993eb6a952 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00199446
0x9ade7482ef5e385cf566925c4af18df790b18a026e1d83ad60afb6e980e7475e40680282021-01-17 11:42:2988 days 6 hrs ago0xfdd084be702420663122d5aca926e6b302f109ef IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00196956
0x755082e006a96958c76b79025456acef334a3b3678f30f1b3f34d00320ddd62b37808142021-01-07 12:20:0198 days 5 hrs ago0x514314904ea85ad3ef6df1d1030537453a4310a4 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219814
0xab98fc01c1c6c36f079e14b44dff2aa723ae063d2a4300e5fa0050f5deb7a11f36844772021-01-04 3:59:18101 days 13 hrs ago0x9888a608451d5d03038d59bac068679686c018da IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00199446
0xebc465fc8290bb87fd7decefd2e92a21debaa91f8d6031751f53083eb3a2f4b134538132020-12-27 3:39:41109 days 14 hrs ago0xd3f4381936a90db280c62b2783664c993eb6a952 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00169446
0xcc3f83af9b105865eedd1d96d4688900dd4907952afb51dcd7feebb3e26cd1e433825212020-12-24 16:12:28112 days 1 hr ago0x8474a0b51a8e9e77ab9446228554853a8e290635 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00196932
0x32c81c0213a133a4e9f5b3a327e48d43e8968a55f7e5a15f91f65183ff4ca14933083482020-12-22 2:22:05114 days 15 hrs ago0x8474a0b51a8e9e77ab9446228554853a8e290635 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00196932
0x6560a75c06ee4ee1adf31b33821a25ca25f2cd79e72cb58f7555b7833c2a985b32881582020-12-21 9:31:37115 days 8 hrs ago0x8474a0b51a8e9e77ab9446228554853a8e290635 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00279814
0x0e02b64caabd4af2d56a95a9abfb59b149f7371b8b50c26cad458afced30742532781382020-12-21 1:10:15115 days 16 hrs ago0x8474a0b51a8e9e77ab9446228554853a8e290635 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00166956
0x39eb6503db74c1356cf986ffd7e8f183f168ed56b63eccba6b18224c8ba5478532613172020-12-20 11:09:01116 days 6 hrs ago0x5391bfa3ebf1907c5ebb941a74b6690780cf93fc IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00028986
0x848b600383f6aef3c00e1c7a9177324773adc4f85d6fc2d439159e2e5fc91fe632592062020-12-20 9:23:28116 days 8 hrs ago0xc2bd25138e153db429f16af0cd12f9f44c23ceaf IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00196956
0xea3f8875236de0da602102aab0c93648edd66d1466df333eae167779cce8302132393372020-12-19 16:47:20117 days 57 mins ago0xd51801cf90da0b7ac3375b915bba2ebeae9ae1d0 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00028986
0x19b1ca4e11878d4ab23bd28d33c439bf4db7c46f9ebe7d93bd5450429b62a38a30672202020-12-13 17:03:40123 days 41 mins ago0x572dfa4d355a27d63a9faebcb055ca6826430d5a IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00028986
0xdd7e399a79418cdb811360e8aeb4472686bfc23a2cdd7644ed2ffc74646c8dc328044242020-12-04 13:34:28132 days 4 hrs ago0x5036d886044966eb325cb216283ee13eb85496b0 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.0017196
0x1b4964bf7e07d4758865d9ad8e3804d7c9e14a987f57a2a131c36ff9df5d23c228003202020-12-04 10:09:11132 days 7 hrs ago0x00000000623761d4b60d62bb0f47b62ecfe0910e IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219838
0xf83a137b04230d866f64ea4f54639f74a67ebac5678b4878a7130833639050ca28002372020-12-04 10:05:02132 days 7 hrs ago0xdf7b69c22b96f2c7e07687971551021058260451 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00249838
0x23389444d6778e8639ae761d22929fa475b0f3a693dec8e5977f583e5198493728001842020-12-04 10:02:19132 days 7 hrs ago0x6e7e7b1f39fb544c51fa091584cca8ab68c3cbec IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219838
0xa8333df9f443ba0da57f24fda5e6a4a245c23660b7e09e2898082e9173fc0aed28001672020-12-04 10:01:28132 days 7 hrs ago0xac4ead9668112b5743c5044f12feee62b50cd31c IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219862
0x25f8d08bcd8fda719d483589cf41bccd6a33df89def7b60f84381f0c689ff6b228001412020-12-04 10:00:10132 days 7 hrs ago0x1cc3a102c4db5fce3377683f1126cf14c4b5aaa3 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219838
0x4f55ef3e81674519aa7b32197be89d6f97e47bc6ce99a2cf2bb3f540e5a11d1927928172020-12-04 3:53:58132 days 13 hrs ago0x2eac336ae41ec3fcdbd0e4b6b83a6a8df23573a5 IN  0x9e0510f6fd105fb23e16ff607d36c2d6d7d2ef3a0 BNB0.00219838
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xd14ecf5d12bef43be9dd6eec192f442bd5ee7e47b1d9503a28e45b5d9c6de90815968992020-10-23 14:18:05174 days 3 hrs ago 0x4d55a7d68e2671477b1d112c65f064611aa608eb  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x4168119765a6f62df0b4f87d21ec533bbbf6c4d6

Contract Name:
BPool

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-10-13
*/

/**
 *Submitted for verification at BscScan.com on 2020-09-26
*/

// File: contracts/BColor.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.5.12;

contract BColor {
    function getColor()
        external view
        returns (bytes32);
}

contract BBronze is BColor {
    function getColor()
        external view
        returns (bytes32) {
            return bytes32("BRONZE");
        }
}

// File: contracts/BConst.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.5.12;


contract BConst is BBronze {
    uint public constant BONE              = 10**18;

    uint public constant MIN_BOUND_TOKENS  = 2;
    uint public constant MAX_BOUND_TOKENS  = 8;

    uint public constant MIN_FEE           = BONE / 10**6;
    uint public constant MAX_FEE           = BONE / 10;
    uint public constant EXIT_FEE          = 0;

    uint public constant MIN_WEIGHT        = BONE;
    uint public constant MAX_WEIGHT        = BONE * 50;
    uint public constant MAX_TOTAL_WEIGHT  = BONE * 50;
    uint public constant MIN_BALANCE       = BONE / 10**12;

    uint public constant INIT_POOL_SUPPLY  = BONE * 100;

    uint public constant MIN_BPOW_BASE     = 1 wei;
    uint public constant MAX_BPOW_BASE     = (2 * BONE) - 1 wei;
    uint public constant BPOW_PRECISION    = BONE / 10**10;

    uint public constant MAX_IN_RATIO      = BONE / 2;
    uint public constant MAX_OUT_RATIO     = (BONE / 3) + 1 wei;
}

// File: contracts/BNum.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.5.12;


contract BNum is BConst {

    function btoi(uint a)
        internal pure
        returns (uint)
    {
        return a / BONE;
    }

    function bfloor(uint a)
        internal pure
        returns (uint)
    {
        return btoi(a) * BONE;
    }

    function badd(uint a, uint b)
        internal pure
        returns (uint)
    {
        uint c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint a, uint b)
        internal pure
        returns (uint)
    {
        (uint c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint a, uint b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    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;
    }

    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;
    }

    // DSMath.wpow
    function bpowi(uint a, uint n)
        internal pure
        returns (uint)
    {
        uint z = n % 2 != 0 ? a : BONE;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    // Compute b^(e.w) by splitting it into (b^e)*(b^0.w).
    // Use `bpowi` for `b^e` and `bpowK` for k iterations
    // of approximation of b^0.w
    function bpow(uint base, uint exp)
        internal pure
        returns (uint)
    {
        require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH");

        uint whole  = bfloor(exp);
        uint remain = bsub(exp, whole);

        uint wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint partialResult = bpowApprox(base, remain, BPOW_PRECISION);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint base, uint exp, uint precision)
        internal pure
        returns (uint)
    {
        // term 0:
        uint a     = exp;
        (uint x, bool xneg)  = bsubSign(base, BONE);
        uint term = BONE;
        uint sum   = term;
        bool negative = false;


        // term(k) = numer / denom
        //         = (product(a - i - 1, i=1-->k) * x^k) / (k!)
        // each iteration, multiply previous term by (a-(k-1)) * x / k
        // continue until term is less than precision
        for (uint i = 1; term >= precision; i++) {
            uint bigK = i * BONE;
            (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }

}

// File: contracts/BToken.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.5.12;


// Highly opinionated token implementation

interface IERC20 {
    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    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 amt) external returns (bool);
    function transfer(address dst, uint amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint amt
    ) external returns (bool);
}

contract BTokenBase is BNum {

    mapping(address => uint)                   internal _balance;
    mapping(address => mapping(address=>uint)) internal _allowance;
    uint internal _totalSupply;

    event Approval(address indexed src, address indexed dst, uint amt);
    event Transfer(address indexed src, address indexed dst, uint amt);

    function _mint(uint amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        _totalSupply = badd(_totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint amt) internal {
        require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL");
        _balance[address(this)] = bsub(_balance[address(this)], amt);
        _totalSupply = bsub(_totalSupply, amt);
        emit Transfer(address(this), address(0), amt);
    }

    function _move(address src, address dst, uint amt) internal {
        require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL");
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint amt) internal {
        _move(address(this), to, amt);
    }

    function _pull(address from, uint amt) internal {
        _move(from, address(this), amt);
    }
}

contract BToken is BTokenBase, IERC20 {

    string  private _name     = "Equator Pool Token";
    string  private _symbol   = "EPT";
    uint8   private _decimals = 18;

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns(uint8) {
        return _decimals;
    }

    function allowance(address src, address dst) external view returns (uint) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint) {
        return _balance[whom];
    }

    function totalSupply() public view returns (uint) {
        return _totalSupply;
    }

    function approve(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint amt) external returns (bool) {
        uint oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function transfer(address dst, uint amt) external returns (bool) {
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint amt) external returns (bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER");
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
}

// File: contracts/BMath.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.5.12;


contract BMath is BBronze, BConst, BNum {
    /**********************************************************************************************
    // calcSpotPrice                                                                             //
    // sP = spotPrice                                                                            //
    // bI = tokenBalanceIn                ( bI / wI )         1                                  //
    // bO = tokenBalanceOut         sP =  -----------  *  ----------                             //
    // wI = tokenWeightIn                 ( bO / wO )     ( 1 - sF )                             //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcSpotPrice(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint swapFee
    )
        public pure
        returns (uint spotPrice)
    {
        uint numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint ratio = bdiv(numer, denom);
        uint scale = bdiv(BONE, bsub(BONE, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }

    /**********************************************************************************************
    // calcOutGivenIn                                                                            //
    // aO = tokenAmountOut                                                                       //
    // bO = tokenBalanceOut                                                                      //
    // bI = tokenBalanceIn              /      /            bI             \    (wI / wO) \      //
    // aI = tokenAmountIn    aO = bO * |  1 - | --------------------------  | ^            |     //
    // wI = tokenWeightIn               \      \ ( bI + ( aI * ( 1 - sF )) /              /      //
    // wO = tokenWeightOut                                                                       //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcOutGivenIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint adjustedIn = bsub(BONE, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint foo = bpow(y, weightRatio);
        uint bar = bsub(BONE, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcInGivenOut                                                                            //
    // aI = tokenAmountIn                                                                        //
    // bO = tokenBalanceOut               /  /     bO      \    (wO / wI)      \                 //
    // bI = tokenBalanceIn          bI * |  | ------------  | ^            - 1  |                //
    // aO = tokenAmountOut    aI =        \  \ ( bO - aO ) /                   /                 //
    // wI = tokenWeightIn           --------------------------------------------                 //
    // wO = tokenWeightOut                          ( 1 - sF )                                   //
    // sF = swapFee                                                                              //
    **********************************************************************************************/
    function calcInGivenOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint y = bdiv(tokenBalanceOut, diff);
        uint foo = bpow(y, weightRatio);
        foo = bsub(foo, BONE);
        tokenAmountIn = bsub(BONE, swapFee);
        tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), tokenAmountIn);
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcPoolOutGivenSingleIn                                                                  //
    // pAo = poolAmountOut         /                                              \              //
    // tAi = tokenAmountIn        ///      /     //    wI \      \\       \     wI \             //
    // wI = tokenWeightIn        //| tAi *| 1 - || 1 - --  | * sF || + tBi \    --  \            //
    // tW = totalWeight     pAo=||  \      \     \\    tW /      //         | ^ tW   | * pS - pS //
    // tBi = tokenBalanceIn      \\  ------------------------------------- /        /            //
    // pS = poolSupply            \\                    tBi               /        /             //
    // sF = swapFee                \                                              /              //
    **********************************************************************************************/
    function calcPoolOutGivenSingleIn(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountIn,
        uint swapFee
    )
        public pure
        returns (uint poolAmountOut)
    {
        // Charge the trading fee for the proportion of tokenAi
        ///  which is implicitly traded to the other pool tokens.
        // That proportion is (1- weightTokenIn)
        // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee);
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
        uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz));

        uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee);
        uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn);

        // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply;
        uint poolRatio = bpow(tokenInRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        poolAmountOut = bsub(newPoolSupply, poolSupply);
        return poolAmountOut;
    }

    /**********************************************************************************************
    // calcSingleInGivenPoolOut                                                                  //
    // tAi = tokenAmountIn              //(pS + pAo)\     /    1    \\                           //
    // pS = poolSupply                 || ---------  | ^ | --------- || * bI - bI                //
    // pAo = poolAmountOut              \\    pS    /     \(wI / tW)//                           //
    // bI = balanceIn          tAi =  --------------------------------------------               //
    // wI = weightIn                              /      wI  \                                   //
    // tW = totalWeight                          |  1 - ----  |  * sF                            //
    // sF = swapFee                               \      tW  /                                   //
    **********************************************************************************************/
    function calcSingleInGivenPoolOut(
        uint tokenBalanceIn,
        uint tokenWeightIn,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountOut,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountIn)
    {
        uint normalizedWeight = bdiv(tokenWeightIn, totalWeight);
        uint newPoolSupply = badd(poolSupply, poolAmountOut);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);

        //uint newBalTi = poolRatio^(1/weightTi) * balTi;
        uint boo = bdiv(BONE, normalizedWeight);
        uint tokenInRatio = bpow(poolRatio, boo);
        uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn);
        uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn);
        // Do reverse order of fees charged in joinswap_ExternAmountIn, this way
        //     ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ```
        //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ;
        uint zar = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar));
        return tokenAmountIn;
    }

    /**********************************************************************************************
    // calcSingleOutGivenPoolIn                                                                  //
    // tAo = tokenAmountOut            /      /                                             \\   //
    // bO = tokenBalanceOut           /      // pS - (pAi * (1 - eF)) \     /    1    \      \\  //
    // pAi = poolAmountIn            | bO - || ----------------------- | ^ | --------- | * b0 || //
    // ps = poolSupply                \      \\          pS           /     \(wO / tW)/      //  //
    // wI = tokenWeightIn      tAo =   \      \                                             //   //
    // tW = totalWeight                    /     /      wO \       \                             //
    // sF = swapFee                    *  | 1 - |  1 - ---- | * sF  |                            //
    // eF = exitFee                        \     \      tW /       /                             //
    **********************************************************************************************/
    function calcSingleOutGivenPoolIn(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint poolAmountIn,
        uint swapFee
    )
        public pure
        returns (uint tokenAmountOut)
    {
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        // charge exit fee on the pool token side
        // pAiAfterExitFee = pAi*(1-exitFee)
        uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE));
        uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee);
        uint poolRatio = bdiv(newPoolSupply, poolSupply);

        // newBalTo = poolRatio^(1/weightTo) * balTo;
        uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight));
        uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut);

        uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut);

        // charge swap fee on the output token side
        //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee)
        uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee);
        tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz));
        return tokenAmountOut;
    }

    /**********************************************************************************************
    // calcPoolInGivenSingleOut                                                                  //
    // pAi = poolAmountIn               // /               tAo             \\     / wO \     \   //
    // bO = tokenBalanceOut            // | bO - -------------------------- |\   | ---- |     \  //
    // tAo = tokenAmountOut      pS - ||   \     1 - ((1 - (tO / tW)) * sF)/  | ^ \ tW /  * pS | //
    // ps = poolSupply                 \\ -----------------------------------/                /  //
    // wO = tokenWeightOut  pAi =       \\               bO                 /                /   //
    // tW = totalWeight           -------------------------------------------------------------  //
    // sF = swapFee                                        ( 1 - eF )                            //
    // eF = exitFee                                                                              //
    **********************************************************************************************/
    function calcPoolInGivenSingleOut(
        uint tokenBalanceOut,
        uint tokenWeightOut,
        uint poolSupply,
        uint totalWeight,
        uint tokenAmountOut,
        uint swapFee
    )
        public pure
        returns (uint poolAmountIn)
    {

        // charge swap fee on the output token side
        uint normalizedWeight = bdiv(tokenWeightOut, totalWeight);
        //uint tAoBeforeSwapFee = tAo / (1 - (1-weightTo) * swapFee) ;
        uint zoo = bsub(BONE, normalizedWeight);
        uint zar = bmul(zoo, swapFee);
        uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar));

        uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee);
        uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut);

        //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply;
        uint poolRatio = bpow(tokenOutRatio, normalizedWeight);
        uint newPoolSupply = bmul(poolRatio, poolSupply);
        uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply);

        // charge exit fee on the pool token side
        // pAi = pAiAfterExitFee/(1-exitFee)
        poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE));
        return poolAmountIn;
    }


}

// File: contracts/BPool.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.5.12;



contract BPool is BBronze, BToken, BMath {

    struct Record {
        bool bound;   // is token bound to pool
        uint index;   // private
        uint denorm;  // denormalized weight
        uint balance;
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut
    );

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

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

    event LOG_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    modifier _lock_() {
        require(!_mutex, "ERR_REENTRY");
        _mutex = true;
        _;
        _mutex = false;
    }

    modifier _viewlock_() {
        require(!_mutex, "ERR_REENTRY");
        _;
    }

    bool private _mutex;

    address private _factory;    // BFactory address to push token exitFee to
    address private _controller; // has CONTROL role
    bool private _publicSwap; // true if PUBLIC can call SWAP functions

    // `setSwapFee` and `finalize` require CONTROL
    // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN`
    uint private _swapFee;
    bool private _finalized;

    address[] private _tokens;
    mapping(address=>Record) private  _records;
    uint private _totalWeight;

    constructor() public {
        _controller = msg.sender;
        _factory = msg.sender;
        _swapFee = MIN_FEE;
        _publicSwap = false;
        _finalized = false;
    }

    function isPublicSwap()
        external view
        returns (bool)
    {
        return _publicSwap;
    }

    function isFinalized()
        external view
        returns (bool)
    {
        return _finalized;
    }

    function isBound(address t)
        external view
        returns (bool)
    {
        return _records[t].bound;
    }

    function getNumTokens()
        external view
        returns (uint)
    {
        return _tokens.length;
    }

    function getCurrentTokens()
        external view _viewlock_
        returns (address[] memory tokens)
    {
        return _tokens;
    }

    function getFinalTokens()
        external view
        _viewlock_
        returns (address[] memory tokens)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        return _tokens;
    }

    function getDenormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].denorm;
    }

    function getTotalDenormalizedWeight()
        external view
        _viewlock_
        returns (uint)
    {
        return _totalWeight;
    }

    function getNormalizedWeight(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound, "ERR_NOT_BOUND");
        uint denorm = _records[token].denorm;
        return bdiv(denorm, _totalWeight);
    }

    function getBalance(address token)
        external view
        _viewlock_
        returns (uint)
    {

        require(_records[token].bound, "ERR_NOT_BOUND");
        return _records[token].balance;
    }

    function getSwapFee()
        external view
        _viewlock_
        returns (uint)
    {
        return _swapFee;
    }

    function getController()
        external view
        _viewlock_
        returns (address)
    {
        return _controller;
    }

    function setSwapFee(uint swapFee)
        external
        _logs_
        _lock_
    {
        require(!_finalized, "ERR_IS_FINALIZED");
        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        require(swapFee >= MIN_FEE, "ERR_MIN_FEE");
        require(swapFee <= MAX_FEE, "ERR_MAX_FEE");
        _swapFee = swapFee;
    }

    function setController(address manager)
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        _controller = manager;
    }

    function setPublicSwap(bool public_)
        external
        _logs_
        _lock_
    {
        require(!_finalized, "ERR_IS_FINALIZED");
        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        _publicSwap = public_;
    }

    function finalize()
        external
        _logs_
        _lock_
    {
        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        require(!_finalized, "ERR_IS_FINALIZED");
        require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS");

        _finalized = true;
        _publicSwap = true;

        _mintPoolShare(INIT_POOL_SUPPLY);
        _pushPoolShare(msg.sender, INIT_POOL_SUPPLY);
    }


    function bind(address token, uint balance, uint denorm)
        external
        _logs_
        // _lock_  Bind does not lock because it jumps to `rebind`, which does
    {
        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        require(!_records[token].bound, "ERR_IS_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

        require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS");

        _records[token] = Record({
            bound: true,
            index: _tokens.length,
            denorm: 0,    // balance and denorm will be validated
            balance: 0   // and set by `rebind`
        });
        _tokens.push(token);
        rebind(token, balance, denorm);
    }

    function rebind(address token, uint balance, uint denorm)
        public
        _logs_
        _lock_
    {

        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        require(_records[token].bound, "ERR_NOT_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

        require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT");
        require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT");
        require(balance >= MIN_BALANCE, "ERR_MIN_BALANCE");

        // Adjust the denorm and totalWeight
        uint oldWeight = _records[token].denorm;
        if (denorm > oldWeight) {
            _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight));
            require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT");
        } else if (denorm < oldWeight) {
            _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm));
        }
        _records[token].denorm = denorm;

        // Adjust the balance record and actual token balance
        uint oldBalance = _records[token].balance;
        _records[token].balance = balance;
        if (balance > oldBalance) {
            _pullUnderlying(token, msg.sender, bsub(balance, oldBalance));
        } else if (balance < oldBalance) {
            // In this case liquidity is being withdrawn, so charge EXIT_FEE
            uint tokenBalanceWithdrawn = bsub(oldBalance, balance);
            uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE);
            _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee));
            _pushUnderlying(token, _factory, tokenExitFee);
        }
    }

    function unbind(address token)
        external
        _logs_
        _lock_
    {

        require(msg.sender == _controller, "ERR_NOT_CONTROLLER");
        require(_records[token].bound, "ERR_NOT_BOUND");
        require(!_finalized, "ERR_IS_FINALIZED");

        uint tokenBalance = _records[token].balance;
        uint tokenExitFee = bmul(tokenBalance, EXIT_FEE);

        _totalWeight = bsub(_totalWeight, _records[token].denorm);

        // Swap the token-to-unbind with the last token,
        // then delete the last token
        uint index = _records[token].index;
        uint last = _tokens.length - 1;
        _tokens[index] = _tokens[last];
        _records[_tokens[index]].index = index;
        _tokens.pop();
        _records[token] = Record({
            bound: false,
            index: 0,
            denorm: 0,
            balance: 0
        });

        _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee));
        _pushUnderlying(token, _factory, tokenExitFee);
    }

    // Absorb any tokens that have been sent to this contract into the pool
    function gulp(address token)
        external
        _logs_
        _lock_
    {
        require(_records[token].bound, "ERR_NOT_BOUND");
        _records[token].balance = IERC20(token).balanceOf(address(this));
    }

    function getSpotPrice(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee);
    }

    function getSpotPriceSansFee(address tokenIn, address tokenOut)
        external view
        _viewlock_
        returns (uint spotPrice)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        Record storage inRecord = _records[tokenIn];
        Record storage outRecord = _records[tokenOut];
        return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0);
    }

    function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn)
        external
        _logs_
        _lock_
    {
        require(_finalized, "ERR_NOT_FINALIZED");

        uint poolTotal = totalSupply();
        uint ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountIn = bmul(ratio, bal);
            require(tokenAmountIn != 0, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            _records[t].balance = badd(_records[t].balance, tokenAmountIn);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
        }
        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
    }

    function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut)
        external
        _logs_
        _lock_
    {
        require(_finalized, "ERR_NOT_FINALIZED");

        uint poolTotal = totalSupply();
        uint exitFee = bmul(poolAmountIn, EXIT_FEE);
        uint pAiAfterExitFee = bsub(poolAmountIn, exitFee);
        uint ratio = bdiv(pAiAfterExitFee, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pullPoolShare(msg.sender, poolAmountIn);
        _pushPoolShare(_factory, exitFee);
        _burnPoolShare(pAiAfterExitFee);

        for (uint i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint bal = _records[t].balance;
            uint tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut != 0, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT");
            _records[t].balance = bsub(_records[t].balance, tokenAmountOut);
            emit LOG_EXIT(msg.sender, t, tokenAmountOut);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }

    }


    function swapExactAmountIn(
        address tokenIn,
        uint tokenAmountIn,
        address tokenOut,
        uint minAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut, uint spotPriceAfter)
    {

        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountOut = calcOutGivenIn(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountIn,
                            _swapFee
                        );
        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountOut, spotPriceAfter);
    }

    function swapExactAmountOut(
        address tokenIn,
        uint maxAmountIn,
        address tokenOut,
        uint tokenAmountOut,
        uint maxPrice
    )
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn, uint spotPriceAfter)
    {
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(_publicSwap, "ERR_SWAP_NOT_PUBLIC");

        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];

        require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        uint spotPriceBefore = calcSpotPrice(
                                    inRecord.balance,
                                    inRecord.denorm,
                                    outRecord.balance,
                                    outRecord.denorm,
                                    _swapFee
                                );
        require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE");

        tokenAmountIn = calcInGivenOut(
                            inRecord.balance,
                            inRecord.denorm,
                            outRecord.balance,
                            outRecord.denorm,
                            tokenAmountOut,
                            _swapFee
                        );
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);
        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        spotPriceAfter = calcSpotPrice(
                                inRecord.balance,
                                inRecord.denorm,
                                outRecord.balance,
                                outRecord.denorm,
                                _swapFee
                            );
        require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX");
        require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE");
        require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX");

        emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut);

        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return (tokenAmountIn, spotPriceAfter);
    }


    function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut)
        external
        _logs_
        _lock_
        returns (uint poolAmountOut)

    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");
        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        Record storage inRecord = _records[tokenIn];

        poolAmountOut = calcPoolOutGivenSingleIn(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountIn,
                            _swapFee
                        );

        require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT");

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return poolAmountOut;
    }

    function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn)
        external
        _logs_
        _lock_
        returns (uint tokenAmountIn)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenIn].bound, "ERR_NOT_BOUND");

        Record storage inRecord = _records[tokenIn];

        tokenAmountIn = calcSingleInGivenPoolOut(
                            inRecord.balance,
                            inRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountOut,
                            _swapFee
                        );

        require(tokenAmountIn != 0, "ERR_MATH_APPROX");
        require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN");

        require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO");

        inRecord.balance = badd(inRecord.balance, tokenAmountIn);

        emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn);

        _mintPoolShare(poolAmountOut);
        _pushPoolShare(msg.sender, poolAmountOut);
        _pullUnderlying(tokenIn, msg.sender, tokenAmountIn);

        return tokenAmountIn;
    }

    function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut)
        external
        _logs_
        _lock_
        returns (uint tokenAmountOut)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");

        Record storage outRecord = _records[tokenOut];

        tokenAmountOut = calcSingleOutGivenPoolIn(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            poolAmountIn,
                            _swapFee
                        );

        require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT");

        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return tokenAmountOut;
    }

    function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn)
        external
        _logs_
        _lock_
        returns (uint poolAmountIn)
    {
        require(_finalized, "ERR_NOT_FINALIZED");
        require(_records[tokenOut].bound, "ERR_NOT_BOUND");
        require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO");

        Record storage outRecord = _records[tokenOut];

        poolAmountIn = calcPoolInGivenSingleOut(
                            outRecord.balance,
                            outRecord.denorm,
                            _totalSupply,
                            _totalWeight,
                            tokenAmountOut,
                            _swapFee
                        );

        require(poolAmountIn != 0, "ERR_MATH_APPROX");
        require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN");

        outRecord.balance = bsub(outRecord.balance, tokenAmountOut);

        uint exitFee = bmul(poolAmountIn, EXIT_FEE);

        emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut);

        _pullPoolShare(msg.sender, poolAmountIn);
        _burnPoolShare(bsub(poolAmountIn, exitFee));
        _pushPoolShare(_factory, exitFee);
        _pushUnderlying(tokenOut, msg.sender, tokenAmountOut);

        return poolAmountIn;
    }


    // ==
    // 'Underlying' token-manipulation functions make external calls but are NOT locked
    // You must `_lock_` or otherwise ensure reentry-safety

    function _pullUnderlying(address erc20, address from, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer, "ERR_ERC20_FALSE");
    }

    function _pushUnderlying(address erc20, address to, uint amount)
        internal
    {
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer, "ERR_ERC20_FALSE");
    }

    function _pullPoolShare(address from, uint amount)
        internal
    {
        _pull(from, amount);
    }

    function _pushPoolShare(address to, uint amount)
        internal
    {
        _push(to, amount);
    }

    function _mintPoolShare(uint amount)
        internal
    {
        _mint(amount);
    }

    function _burnPoolShare(uint amount)
        internal
    {
        _burn(amount);
    }

}

// File: contracts/BFactory.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.5.12;

// Builds new BPools, logging their addresses and providing `isBPool(address) -> (bool)`


contract BFactory is BBronze {
    event LOG_NEW_POOL(
        address indexed caller,
        address indexed pool
    );

    event LOG_BLABS(
        address indexed caller,
        address indexed blabs
    );

    mapping(address=>bool) private _isBPool;

    function isBPool(address b)
        external view returns (bool)
    {
        return _isBPool[b];
    }

    function newBPool()
        external
        returns (BPool)
    {
        BPool bpool = new BPool();
        _isBPool[address(bpool)] = true;
        emit LOG_NEW_POOL(msg.sender, address(bpool));
        bpool.setController(msg.sender);
        return bpool;
    }

    address private _blabs;

    constructor() public {
        _blabs = msg.sender;
    }

    function getBLabs()
        external view
        returns (address)
    {
        return _blabs;
    }

    function setBLabs(address b)
        external
    {
        require(msg.sender == _blabs, "ERR_NOT_BLABS");
        emit LOG_BLABS(msg.sender, b);
        _blabs = b;
    }

    function collect(BPool pool)
        external
    {
        require(msg.sender == _blabs, "ERR_NOT_BLABS");
        uint collected = IERC20(pool).balanceOf(address(this));
        bool xfer = pool.transfer(_blabs, collected);
        require(xfer, "ERR_ERC20_FAILED");
    }
}

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","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":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","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":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60c0604052601260808190527f45717561746f7220506f6f6c20546f6b656e000000000000000000000000000060a0908152620000409160039190620000f4565b506040805180820190915260038082527f455054000000000000000000000000000000000000000000000000000000000060209092019182526200008791600491620000f4565b506005805460ff19166012179055348015620000a257600080fd5b50600680546005805462010000600160b01b031916336201000081029190911790915564e8d4a510006007556001600160a01b03199091161760ff60a01b191690556008805460ff1916905562000199565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013757805160ff191683800117855562000167565b8280016001018555821562000167579182015b82811115620001675782518255916020019190600101906200014a565b506200017592915062000179565b5090565b6200019691905b8082111562000175576000815560010162000180565b90565b61556680620001a96000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c80638d4e40831161020a578063bc694ea211610125578063d73dd623116100b8578063ec09302111610087578063ec09302114610c6e578063f1b8a9b714610c76578063f8b2cb4f14610c9c578063f8d6aed414610cc2578063fde924f714610cfd576103db565b8063d73dd62314610be2578063dd62ed3e14610c0e578063e4a28a52146104e1578063e4e1e53814610c3c576103db565b8063cc77828d116100f4578063cc77828d14610ba4578063cd2ed8fb14610bac578063cf5e7bd314610bb4578063d4cadf6814610bda576103db565b8063bc694ea214610b3c578063be3bbd2e14610b44578063c36596a614610555578063c6580d1214610b9c576103db565b8063a221ee491161019d578063b7b800a41161016c578063b7b800a414610ae9578063ba019dab14610af1578063ba9530a614610af9578063bc063e1a14610b34576103db565b8063a221ee4914610a09578063a9059cbb14610a3e578063b02f0b7314610a6a578063b0e0d13614610ae1576103db565b8063948d8ce6116101d9578063948d8ce6146109cb57806395d89b41146109f1578063992e2a92146109f95780639a86139b14610a01576103db565b80638d4e40831461098d57806392eefe9b14610995578063936c3477146109bb5780639381cd2b146109c3576103db565b806349b59552116102fa57806376c7a3c71161028d5780638656b6531161025c5780638656b653146108e9578063867378c514610924578063892980121461092c5780638c28cbe814610967576103db565b806376c7a3c71461080d5780637c5e9ea4146108155780638201aa3f1461086e57806382f652ad146108ae576103db565b80635db34277116102c95780635db342771461075757806366188463146107895780636d06dfa0146107b557806370a08231146107e7576103db565b806349b595521461067e5780634bb278f31461069d5780634f69c0d4146106a55780635c1bbaf71461071c576103db565b8063218b538211610372578063313ce56711610341578063313ce567146105dd57806334e19907146105fb5780633fdddaa21461061a57806346ab38f11461064c576103db565b8063218b53821461055557806323b872dd1461055d5780632f37b624146105935780633018205f146105b9576103db565b80631446a7ff116103ae5780631446a7ff146104e957806315e84af91461051757806318160ddd14610545578063189d00ca1461054d576103db565b806302c96748146103e057806306fdde0314610424578063095ea7b3146104a157806309a3bbe4146104e1575b600080fd5b610412600480360360608110156103f657600080fd5b506001600160a01b038135169060208101359060400135610d05565b60408051918252519081900360200190f35b61042c611065565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046657818101518382015260200161044e565b50505050905090810190601f1680156104935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104cd600480360360408110156104b757600080fd5b506001600160a01b0381351690602001356110fb565b604080519115158252519081900360200190f35b610412611150565b610412600480360360408110156104ff57600080fd5b506001600160a01b038135811691602001351661115d565b6104126004803603604081101561052d57600080fd5b506001600160a01b03813581169160200135166112b2565b6104126113fe565b610412611404565b610412611418565b6104cd6004803603606081101561057357600080fd5b506001600160a01b03813581169160208101359091169060400135611424565b6104cd600480360360208110156105a957600080fd5b50356001600160a01b031661157e565b6105c161159c565b604080516001600160a01b039092168252519081900360200190f35b6105e56115fa565b6040805160ff9092168252519081900360200190f35b6106186004803603602081101561061157600080fd5b5035611603565b005b6106186004803603606081101561063057600080fd5b506001600160a01b038135169060208101359060400135611800565b6104126004803603606081101561066257600080fd5b506001600160a01b038135169060208101359060400135611c0d565b6106186004803603602081101561069457600080fd5b50351515611f0c565b61061861208f565b610618600480360360408110156106bb57600080fd5b813591908101906040810160208201356401000000008111156106dd57600080fd5b8201836020820111156106ef57600080fd5b8035906020019184602083028401116401000000008311171561071157600080fd5b509092509050612286565b610412600480360360c081101561073257600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561257f565b6104126004803603606081101561076d57600080fd5b506001600160a01b038135169060208101359060400135612637565b6104cd6004803603604081101561079f57600080fd5b506001600160a01b03813516906020013561291a565b610412600480360360608110156107cb57600080fd5b506001600160a01b0381351690602081013590604001356129f2565b610412600480360360208110156107fd57600080fd5b50356001600160a01b0316612d03565b610412612d1e565b610855600480360360a081101561082b57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612d30565b6040805192835260208301919091528051918290030190f35b610855600480360360a081101561088457600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356131f3565b610412600480360360c08110156108c457600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561369d565b610412600480360360c08110156108ff57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561375c565b6104126137fd565b610412600480360360c081101561094257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613811565b6106186004803603602081101561097d57600080fd5b50356001600160a01b03166138c1565b6104cd613a75565b610618600480360360208110156109ab57600080fd5b50356001600160a01b0316613a7e565b610412613bbc565b610412613c11565b610412600480360360208110156109e157600080fd5b50356001600160a01b0316613c1e565b61042c613ce8565b610412613d49565b610412613d55565b610412600480360360a0811015610a1f57600080fd5b5080359060208101359060408101359060608101359060800135613d62565b6104cd60048036036040811015610a5457600080fd5b506001600160a01b038135169060200135613dc7565b61061860048036036040811015610a8057600080fd5b81359190810190604081016020820135640100000000811115610aa257600080fd5b820183602082011115610ab457600080fd5b80359060200191846020830284011164010000000083111715610ad657600080fd5b509092509050613ddd565b610412614124565b610412614129565b61041261412e565b610412600480360360c0811015610b0f57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614133565b6104126141b4565b6104126141c4565b610b4c6141d0565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b88578181015183820152602001610b70565b505050509050019250505060405180910390f35b6104126142c8565b610b4c6142cd565b61041261431b565b61061860048036036020811015610bca57600080fd5b50356001600160a01b0316614321565b6104126146a3565b6104cd60048036036040811015610bf857600080fd5b506001600160a01b0381351690602001356146f8565b61041260048036036040811015610c2457600080fd5b506001600160a01b0381358116916020013516614779565b61061860048036036060811015610c5257600080fd5b506001600160a01b0381351690602081013590604001356147a4565b6104126149fb565b61041260048036036020811015610c8c57600080fd5b50356001600160a01b0316614a0b565b61041260048036036020811015610cb257600080fd5b50356001600160a01b0316614ae7565b610412600480360360c0811015610cd857600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614bb1565b6104cd614c34565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610db3576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16610e0d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16610e6a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600390810154610e9f91670de0b6b3a76400005b04600101614c44565b831115610ee7576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754610f219493929190899061369d565b915081610f67576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115610fab576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b610fb9816003015485614d0d565b60038201556000610fca8382614c44565b6040805187815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36110183384614d6f565b61102a6110258483614d0d565b614d7d565b600554611046906201000090046001600160a01b031682614d89565b611051863387614d93565b50506005805461ff00191690559392505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f15780601f106110c6576101008083540402835291602001916110f1565b820191906000526020600020905b8154815290600101906020018083116110d457829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615512833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156111ab576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16611208576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16611265576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a602052604080822092851682528120600380840154600280860154928401549084015493946112a99492939290613d62565b95945050505050565b600554600090610100900460ff1615611300576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661135d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff166113ba576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600a60205260408082209285168252902060038083015460028085015492840154908401546007546112a994929190613d62565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b6000336001600160a01b038516148061146057506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6114a9576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b6114b4848484614e5e565b336001600160a01b038516148015906114f257506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611574576001600160a01b03841660009081526001602090815260408083203384529091529020546115259083614d0d565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206155128339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600a602052604090205460ff1690565b600554600090610100900460ff16156115ea576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156116af576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615611709576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b0316331461175d576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b64e8d4a510008110156117a5576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b67016345785d8a00008111156117f0576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118ac576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611911576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff1661196e576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff16156119b9576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b670de0b6b3a7640000811015611a07576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115611a56576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b620f4240821015611aa0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090206002015480821115611b3757611ad9600b54611ad48484614d0d565b614f6e565b600b8190556802b5e3af16b18800001015611b32576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b611b58565b80821015611b5857611b54600b54611b4f8385614d0d565b614d0d565b600b555b6001600160a01b0384166000908152600a602052604090206002810183905560030180549084905580841115611ba157611b9c8533611b978785614d0d565b614fbb565b611bfb565b80841015611bfb576000611bb58286614d0d565b90506000611bc4826000614c44565b9050611bda8733611bd58585614d0d565b614d93565b600554611bf89088906201000090046001600160a01b031683614d93565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611cbb576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16611d15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16611d72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754611dac94939291908990613811565b915082821015611df3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a60205260409020600390810154611e2391670de0b6b3a7640000610e96565b821115611e6b576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b611e79816003015483614d0d565b60038201556000611e8a8582614c44565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3611ed83386614d6f565b611ee56110258683614d0d565b600554611f01906201000090046001600160a01b031682614d89565b611051863385614d93565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611fb8576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1615612012576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6006546001600160a01b03163314612066576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561213b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b03909116146121a0576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b60085460ff16156121eb576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60095460021115612234576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b6008805460ff191660011790556006805460ff60a01b1916600160a01b17905561226668056bc75e2d63100000615014565b6122793368056bc75e2d63100000614d89565b6005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612332576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661238c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006123966113fe565b905060006123a4858361501d565b9050806123ea576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b60095481101561256b5760006009828154811061240657fe5b60009182526020808320909101546001600160a01b0316808352600a90915260408220600301549092509061243b8583614c44565b905080612481576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87878581811061248d57fe5b905060200201358111156124d7576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546124fd9082614f6e565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3612560833383614fbb565b5050506001016123ed565b5061257585615014565b611bfb3386614d89565b60008061258c878661501d565b9050600061259a8786614f6e565b905060006125a8828961501d565b905060006125be670de0b6b3a76400008561501d565b905060006125cc8383615125565b905060006125da828e614c44565b905060006125e8828f614d0d565b90506000612607612601670de0b6b3a76400008a614d0d565b8b614c44565b90506126248261261f670de0b6b3a764000084614d0d565b61501d565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156126e5576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff1661273f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff1661279c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a60205260409020600301546127ce906002670de0b6b3a76400005b04614c44565b831115612815576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b5460075461284f9493929190899061375c565b915082821015612896576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6128a4816003015485614f6e565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a36128f282615014565b6128fc3383614d89565b612907853386614fbb565b506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561296f573360009081526001602090815260408083206001600160a01b038816845290915281205561299e565b6129798184614d0d565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615512833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612aa0576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16612afa576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a602052604090205460ff16612b57576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600a6020526040902060038101546002808301549054600b54600754612b919493929190899061257f565b915081612bd7576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612c1b576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a6020526040902060030154612c4b906002670de0b6b3a76400006127c8565b821115612c92576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b612ca0816003015483614f6e565b60038201556040805183815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3612cee84615014565b612cf83385614d89565b612907853384614fbb565b6001600160a01b031660009081526020819052604090205490565b620f4240670de0b6b3a7640000611414565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612dcd576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff16612e39576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16612e96576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612eea576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600a602052604080822092881682529020600380820154612f2391670de0b6b3a7640000610e96565b861115612f6b576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612f8c8360030154846002015484600301548560020154600754613d62565b905085811115612fd9576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612ff983600301548460020154846003015485600201548b600754614bb1565b94508885111561303f576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b61304d836003015486614f6e565b8360030181905550613063826003015488614d0d565b600380840182905584015460028086015490850154600754613086949190613d62565b9350808410156130cf576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b85841115613116576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b613120858861501d565b811115613166576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46131ce8a3387614fbb565b6131d9883389614d93565b5050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613290576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600a602052604090205460ff166132fc576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600a602052604090205460ff16613359576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff166133ad576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600a60205260408082209288168252902060038201546133e7906002670de0b6b3a76400006127c8565b88111561342e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b600061344f8360030154846002015484600301548560020154600754613d62565b90508581111561349c576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6134bc83600301548460020154846003015485600201548d600754614133565b945086851015613503576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61351183600301548a614f6e565b8360030181905550613527826003015486614d0d565b60038084018290558401546002808601549085015460075461354a949190613d62565b935080841015613593576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b858411156135da576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6135e4898661501d565b81111561362a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136928a338b614fbb565b6131d9883387614d93565b6000806136aa878661501d565b905060006136c0670de0b6b3a764000083614d0d565b905060006136ce8286614c44565b905060006136e88761261f670de0b6b3a764000085614d0d565b905060006136f68c83614d0d565b90506000613704828e61501d565b905060006137128288615125565b90506000613720828e614c44565b9050600061372e8e83614d0d565b90506137478161261f670de0b6b3a76400006000614d0d565b99505050505050505050509695505050505050565b600080613769878661501d565b90506000613788613782670de0b6b3a764000084614d0d565b85614c44565b905060006137a7866137a2670de0b6b3a764000085614d0d565b614c44565b905060006137b58b83614f6e565b905060006137c3828d61501d565b905060006137d18287615125565b905060006137df828d614c44565b90506137eb818d614d0d565b9e9d5050505050505050505050505050565b64e8d4a51000670de0b6b3a7640000611414565b60008061381e878661501d565b90506000613839856137a2670de0b6b3a76400006000614d0d565b905060006138478883614d0d565b90506000613855828a61501d565b905060006138748261386f670de0b6b3a76400008861501d565b615125565b90506000613882828e614c44565b905060006138908e83614d0d565b905060006138a9612601670de0b6b3a76400008a614d0d565b9050612624826137a2670de0b6b3a764000084614d0d565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561396d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600a602052604090205460ff166139d9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b158015613a1f57600080fd5b505afa158015613a33573d6000803e3d6000fd5b505050506040513d6020811015613a4957600080fd5b50516001600160a01b039091166000908152600a60205260409020600301556005805461ff0019169055565b60085460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614613b8f576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613c0a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b50600b5490565b68056bc75e2d6310000081565b600554600090610100900460ff1615613c6c576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16613cc9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110f15780601f106110c6576101008083540402835291602001916110f1565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b600080613d6f878761501d565b90506000613d7d868661501d565b90506000613d8b838361501d565b90506000613dad670de0b6b3a764000061261f670de0b6b3a764000089614d0d565b9050613db98282614c44565b9a9950505050505050505050565b6000613dd4338484614e5e565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e89576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff00191661010017905560085460ff16613ee3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613eed6113fe565b90506000613efc856000614c44565b90506000613f0a8683614d0d565b90506000613f18828561501d565b905080613f5e576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613f683388614d6f565b600554613f84906201000090046001600160a01b031684614d89565b613f8d82614d7d565b60005b60095481101561410f57600060098281548110613fa957fe5b60009182526020808320909101546001600160a01b0316808352600a909152604082206003015490925090613fde8583614c44565b905080614024576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b89898581811061403057fe5b9050602002013581101561407b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a60205260409020600301546140a19082614d0d565b6001600160a01b0384166000818152600a60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614104833383614d93565b505050600101613f90565b50506005805461ff0019169055505050505050565b600881565b600281565b600181565b600080614140878661501d565b90506000614156670de0b6b3a764000085614d0d565b90506141628582614c44565b905060006141748a61261f8c85614f6e565b905060006141828285615125565b90506000614198670de0b6b3a764000083614d0d565b90506141a48a82614c44565b9c9b505050505050505050505050565b600a670de0b6b3a7640000611414565b671bc16d674ec7ffff81565b600554606090610100900460ff161561421e576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60085460ff16614269576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60098054806020026020016040519081016040528092919081815260200182805480156110f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116142a1575050505050905090565b600081565b600554606090610100900460ff1615614269576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60095490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156143cd576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6005805461ff001916610100179055600654336001600160a01b0390911614614432576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a602052604090205460ff1661448f576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b60085460ff16156144da576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040812060030154906145018282614c44565b600b546001600160a01b0385166000908152600a602052604090206002015491925061452c91614d0d565b600b556001600160a01b0383166000908152600a602052604090206001015460098054600019810191908290811061456057fe5b600091825260209091200154600980546001600160a01b03909216918490811061458657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600a6000600985815481106145c657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206001015560098054806145f957fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600a909552929094209051815460ff191690151517815592516001840155516002830155516003909101556146858533611bd58787614d0d565b600554611bfb9086906201000090046001600160a01b031685614d93565b600554600090610100900460ff16156146f1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546147269083614f6e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615512833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b03163314614859576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a602052604090205460ff16156148b6576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b60085460ff1615614901576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600954600811614949576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b6040805160808101825260018082526009805460208085019182526000858701818152606087018281526001600160a01b038c16808452600a9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b03191690911790556149f6838383611800565b505050565b6002670de0b6b3a7640000611414565b600554600090610100900460ff1615614a59576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614ab6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a6020526040902060020154600b54614ae090829061501d565b9392505050565b600554600090610100900460ff1615614b35576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16614b92576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600a602052604090206003015490565b600080614bbe858861501d565b90506000614bcc8786614d0d565b90506000614bda888361501d565b90506000614be88285615125565b9050614bfc81670de0b6b3a7640000614d0d565b9050614c10670de0b6b3a764000087614d0d565b9450614c25614c1f8c83614c44565b8661501d565b9b9a5050505050505050505050565b600654600160a01b900460ff1690565b6000828202831580614c5e575082848281614c5b57fe5b04145b614ca2576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614cf5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b6000806000614d1c8585615233565b915091508015614d67576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b614d798282615258565b5050565b614d8681615263565b50565b614d798282615333565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614de657600080fd5b505af1158015614dfa573d6000803e3d6000fd5b505050506040513d6020811015614e1057600080fd5b5051905080614e58576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614ec2576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b038316600090815260208190526040902054614ee59082614d0d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614f149082614f6e565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082820183811015614ae0576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614de657600080fd5b614d868161533e565b600081615060576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806150885750670de0b6b3a764000084828161508557fe5b04145b6150cc576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561511a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281614d0257fe5b60006001831015615175576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156151cb576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006151d6836153b3565b905060006151e48483614d0d565b905060006151fa866151f5856153ce565b6153dc565b90508161520b57925061114a915050565b600061521c87846305f5e100615433565b90506152288282614c44565b979650505050505050565b6000808284106152495750508082036000615251565b505081810360015b9250929050565b614d79823083614e5e565b306000908152602081905260409020548111156152be576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152602081905260409020546152d89082614d0d565b306000908152602081905260409020556002546152f59082614d0d565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b614d79308383614e5e565b306000908152602081905260409020546153589082614f6e565b306000908152602081905260409020556002546153759082614f6e565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b6000670de0b6b3a76400006153c7836153ce565b0292915050565b670de0b6b3a7640000900490565b600080600283066153f557670de0b6b3a76400006153f7565b835b90506002830492505b8215614ae0576154108485614c44565b93506002830615615428576154258185614c44565b90505b600283049250615400565b600082818061544a87670de0b6b3a7640000615233565b9092509050670de0b6b3a764000080600060015b888410615502576000670de0b6b3a7640000820290506000806154928a61548d85670de0b6b3a7640000614d0d565b615233565b915091506154a4876137a2848c614c44565b96506154b0878461501d565b9650866154bf57505050615502565b87156154c9579315935b80156154d3579315935b84156154ea576154e38688614d0d565b95506154f7565b6154f48688614f6e565b95505b50505060010161545e565b5090999850505050505050505056fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820febbe73d4127aeb7ee537d2f2af0a6025927436167402edd6b6943b9fc9857bc64736f6c634300050c0032

Deployed ByteCode Sourcemap

27707:23204:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27707:23204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48496:1378;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48496:1378:0;;-1:-1:-1;;;;;48496:1378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10134:83;;;:::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;10134:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10744:184;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10744:184:0;;-1:-1:-1;;;;;10744:184:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2233:50;;;:::i;37146:491::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37146:491:0;;;;;;;;;;:::i;36647:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36647:491:0;;;;;;;;;;:::i;10648:88::-;;;:::i;2532:54::-;;;:::i;2124:45::-;;;:::i;11742:491::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11742:491:0;;;;;;;;;;;;;;;;;:::i;29848:123::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29848:123:0;-1:-1:-1;;;;;29848:123:0;;:::i;31496:137::-;;;:::i;:::-;;;;-1:-1:-1;;;;;31496:137:0;;;;;;;;;;;;;;10320:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31641:350;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31641:350:0;;:::i;:::-;;33649:1631;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33649:1631:0;;-1:-1:-1;;;;;33649:1631:0;;;;;;;;;;;:::i;47168:1320::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47168:1320:0;;-1:-1:-1;;;;;47168:1320:0;;;;;;;;;;;:::i;32209:250::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32209:250:0;;;;:::i;32467:432::-;;;:::i;37645:948::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37645:948:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37645:948:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37645:948:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;37645:948:0;;-1:-1:-1;37645:948:0;-1:-1:-1;37645:948:0;:::i;21015:1185::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;21015:1185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44711:1198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44711:1198:0;;-1:-1:-1;;;;;44711:1198:0;;;;;;;;;;;:::i;11196:397::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11196:397:0;;-1:-1:-1;;;;;11196:397:0;;;;;;:::i;45917:1243::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45917:1243:0;;-1:-1:-1;;;;;45917:1243:0;;;;;;;;;;;:::i;10538:102::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10538:102:0;-1:-1:-1;;;;;10538:102:0;;:::i;1956:53::-;;;:::i;42222:2479::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;42222:2479:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39733:2481;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39733:2481:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25694:1283::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;25694:1283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18831:1166::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;18831:1166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2290:54::-;;;:::i;23319:1256::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;23319:1256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36414:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36414:225:0;-1:-1:-1;;;;;36414:225:0;;:::i;29729:111::-;;;:::i;31999:202::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31999:202:0;-1:-1:-1;;;;;31999:202:0;;:::i;30697:148::-;;;:::i;2353:51::-;;;:::i;30463:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30463:226:0;-1:-1:-1;;;;;30463:226:0;;:::i;10225:87::-;;;:::i;2651:59::-;;;:::i;920:121::-;;;:::i;13913:509::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13913:509:0;;;;;;;;;;;;;;;;;;;;;;:::i;11601:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11601:133:0;;-1:-1:-1;;;;;11601:133:0;;;;;;:::i;38601:1122::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38601:1122:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38601:1122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38601:1122:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;38601:1122:0;;-1:-1:-1;38601:1122:0;-1:-1:-1;38601:1122:0;:::i;1905:42::-;;;:::i;1856:::-;;;:::i;2413:46::-;;;:::i;15440:683::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;15440:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2016:50::-;;;:::i;2466:59::-;;;:::i;30254:201::-;;;:::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;30254:201:0;;;;;;;;;;;;;;;;;2073:42;;;:::i;30103:143::-;;;:::i;29979:116::-;;;:::i;35288:1041::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35288:1041:0;-1:-1:-1;;;;;35288:1041:0;;:::i;31360:128::-;;;:::i;10936:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10936:252:0;;-1:-1:-1;;;;;10936:252:0;;;;;;:::i;10410:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10410:120:0;;;;;;;;;;:::i;32909:732::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32909:732:0;;-1:-1:-1;;;;;32909:732:0;;;;;;;;;;;:::i;2595:49::-;;;:::i;30853:275::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30853:275:0;-1:-1:-1;;;;;30853:275:0;;:::i;31136:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31136:216:0;-1:-1:-1;;;;;31136:216:0;;:::i;17141:672::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17141:672:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29608:113::-;;;:::i;48496:1378::-;28596:39;;;;;;;28626:8;28596:39;;;;;;48658:17;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;48658:17;;28626:8;;28596:39;;;;;48658:17;28626:8;;48658:17;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;48701:10;;28734:13;48701:10;48693:40;;;;;-1:-1:-1;;;48693:40:0;;;;;;;;;;;;-1:-1:-1;;;48693:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48752:18:0;;;;;;:8;:18;;;;;:24;;;48744:50;;;;;-1:-1:-1;;;48744:50:0;;;;;;;;;;;;-1:-1:-1;;;48744:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48836:18:0;;;;;;:8;:18;;;;;:26;;;;;48831:47;;1841:6;2693:8;;2705:5;2692:18;48831:4;:47::i;:::-;48813:14;:65;;48805:95;;;;;-1:-1:-1;;;48805:95:0;;;;;;;;;;;;-1:-1:-1;;;48805:95:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48940:18:0;;48913:24;48940:18;;;:8;:18;;;;;49041:17;;;;49089:16;;;;;49136:12;;49179;;49267:8;;48986:316;;49041:17;49089:16;49136:12;49179;49222:14;;48986:24;:316::i;:::-;48971:331;-1:-1:-1;49323:17:0;49315:45;;;;;-1:-1:-1;;;49315:45:0;;;;;;;;;;;;-1:-1:-1;;;49315:45:0;;;;;;;;;;;;;;;49395:15;49379:12;:31;;49371:56;;;;;-1:-1:-1;;;49371:56:0;;;;;;;;;;;;-1:-1:-1;;;49371:56:0;;;;;;;;;;;;;;;49460:39;49465:9;:17;;;49484:14;49460:4;:39::i;:::-;49440:17;;;:59;49512:12;49527:28;49532:12;49512;49527:4;:28::i;:::-;49573:46;;;;;;;;49512:43;;-1:-1:-1;;;;;;49573:46:0;;;49582:10;;49573:46;;;;;;;;;;49632:40;49647:10;49659:12;49632:14;:40::i;:::-;49683:43;49698:27;49703:12;49717:7;49698:4;:27::i;:::-;49683:14;:43::i;:::-;49752:8;;49737:33;;49752:8;;;-1:-1:-1;;;;;49752:8:0;49762:7;49737:14;:33::i;:::-;49781:53;49797:8;49807:10;49819:14;49781:15;:53::i;:::-;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;48496:1378;;-1:-1:-1;;;48496:1378:0:o;10134:83::-;10204:5;10197:12;;;;;;;;;;;;;-1:-1:-1;;10197:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;10171:13;;10197:12;;10204:5;;10197:12;;;10204:5;10197:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10134:83;:::o;10744:184::-;10830:10;10802:4;10819:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10819:27:0;;;;;;;;;;;:33;;;10868:30;;;;;;;-1:-1:-1;;10802:4:0;;10819:27;;10830:10;;10868:30;;10802:4;;10819:22;-1:-1:-1;10802:4:0;-1:-1:-1;;;;;10868:30:0;;;;;;;-1:-1:-1;10916:4:0;10744:184;;;;;:::o;2233:50::-;2274:9;2233:50;:::o;37146:491::-;28842:6;;37271:14;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37311:17:0;;;;;;:8;:17;;;;;:23;;;37303:49;;;;;-1:-1:-1;;;37303:49:0;;;;;;;;;;;;-1:-1:-1;;;37303:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37371:18:0;;;;;;:8;:18;;;;;:24;;;37363:50;;;;;-1:-1:-1;;;37363:50:0;;;;;;;;;;;;-1:-1:-1;;;37363:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37450:17:0;;;37424:23;37450:17;;;:8;:17;;;;;;37505:18;;;;;;;37555:16;;;;;37573:15;;;;;37590:17;;;;37609:16;;;;37505:18;;37541:88;;37555:16;;37573:15;37609:16;37541:13;:88::i;:::-;37534:95;37146:491;-1:-1:-1;;;;;37146:491:0:o;36647:::-;28842:6;;36765:14;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36805:17:0;;;;;;:8;:17;;;;;:23;;;36797:49;;;;;-1:-1:-1;;;36797:49:0;;;;;;;;;;;;-1:-1:-1;;;36797:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36865:18:0;;;;;;:8;:18;;;;;:24;;;36857:50;;;;;-1:-1:-1;;;36857:50:0;;;;;;;;;;;;-1:-1:-1;;;36857:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36944:17:0;;;36918:23;36944:17;;;:8;:17;;;;;;36999:18;;;;;;;37049:16;;;;;37067:15;;;;;37084:17;;;;37103:16;;;;37121:8;;37035:95;;37067:15;37084:17;37103:16;37035:13;:95::i;10648:88::-;10716:12;;10648:88;:::o;2532:54::-;2580:6;1841;2573:13;;2532:54;:::o;2124:45::-;1841:6;2124:45;:::o;11742:491::-;11818:4;-1:-1:-1;;;;;11843:17:0;;:10;:17;;:55;;-1:-1:-1;;;;;;11871:15:0;;;;;;-1:-1:-1;11871:15:0;;;;;;;;11887:10;11871:27;;;;;;;;11864:34;;;11843:55;11835:89;;;;;-1:-1:-1;;;11835:89:0;;;;;;;;;;;;-1:-1:-1;;;11835:89:0;;;;;;;;;;;;;;;11935:20;11941:3;11946;11951;11935:5;:20::i;:::-;-1:-1:-1;;;;;11970:17:0;;:10;:17;;;;:63;;-1:-1:-1;;;;;;11991:15:0;;;;;;-1:-1:-1;11991:15:0;;;;;;;;12007:10;11991:27;;;;;;;;-1:-1:-1;;11991:42:0;;11970:63;11966:238;;;-1:-1:-1;;;;;12085:15:0;;;;;;-1:-1:-1;12085:15:0;;;;;;;;12101:10;12085:27;;;;;;;;12080:38;;12114:3;12080:4;:38::i;:::-;-1:-1:-1;;;;;12050:15:0;;;;;;;-1:-1:-1;12050:15:0;;;;;;;;12066:10;12050:27;;;;;;;;;:68;;;12138:54;;;;;;;-1:-1:-1;;12138:54:0;;;;12066:10;;12138:54;;;;12050:15;-1:-1:-1;12050:15:0;-1:-1:-1;;;;;12138:54:0;;;;;;;;;11966:238;-1:-1:-1;12221:4:0;11742:491;;;;;:::o;29848:123::-;-1:-1:-1;;;;;29946:11:0;29917:4;29946:11;;;:8;:11;;;;;:17;;;;29848:123::o;31496:137::-;28842:6;;31582:7;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;31614:11:0;;-1:-1:-1;;;;;31614:11:0;;31496:137::o;10320:82::-;10385:9;;;;10320:82;:::o;31641:350::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;31750:10;;28734:13;31750:10;31749:11;31741:40;;;;;-1:-1:-1;;;31741:40:0;;;;;;;;;;;;-1:-1:-1;;;31741:40:0;;;;;;;;;;;;;;;31814:11;;-1:-1:-1;;;;;31814:11:0;31800:10;:25;31792:56;;;;;-1:-1:-1;;;31792:56:0;;;;;;;;;;;;-1:-1:-1;;;31792:56:0;;;;;;;;;;;;;;;1997:12;31867:18;;;31859:42;;;;;-1:-1:-1;;;31859:42:0;;;;;;;;;;;;-1:-1:-1;;;31859:42:0;;;;;;;;;;;;;;;2057:9;31920:18;;;31912:42;;;;;-1:-1:-1;;;31912:42:0;;;;;;;;;;;;-1:-1:-1;;;31912:42:0;;;;;;;;;;;;;;;31965:8;:18;28770:6;:14;;-1:-1:-1;;28770:14:0;;;31641:350::o;33649:1631::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;33795:11;;-1:-1:-1;;;;;33795:11:0;33781:10;:25;33773:56;;;;;-1:-1:-1;;;33773:56:0;;;;;;;;;;;;-1:-1:-1;;;33773:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33848:15:0;;;;;;:8;:15;;;;;:21;;;33840:47;;;;;-1:-1:-1;;;33840:47:0;;;;;;;;;;;;-1:-1:-1;;;33840:47:0;;;;;;;;;;;;;;;33907:10;;;;33906:11;33898:40;;;;;-1:-1:-1;;;33898:40:0;;;;;;;;;;;;-1:-1:-1;;;33898:40:0;;;;;;;;;;;;;;;1841:6;33959;:20;;33951:47;;;;;-1:-1:-1;;;33951:47:0;;;;;;;;;;;;-1:-1:-1;;;33951:47:0;;;;;;;;;;;;;;;2217:9;34017:20;;;34009:47;;;;;-1:-1:-1;;;34009:47:0;;;;;;;;;;;;-1:-1:-1;;;34009:47:0;;;;;;;;;;;;;;;2331:13;34075:22;;;34067:50;;;;;-1:-1:-1;;;34067:50:0;;;;;;;;;;;;-1:-1:-1;;;34067:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34193:15:0;;34176:14;34193:15;;;:8;:15;;;;;:22;;;34230:18;;;34226:304;;;34280:43;34285:12;;34299:23;34304:6;34312:9;34299:4;:23::i;:::-;34280:4;:43::i;:::-;34265:12;:58;;;2274:9;-1:-1:-1;34346:32:0;34338:65;;;;;-1:-1:-1;;;34338:65:0;;;;;;;;;;;;-1:-1:-1;;;34338:65:0;;;;;;;;;;;;;;;34226:304;;;34434:9;34425:6;:18;34421:109;;;34475:43;34480:12;;34494:23;34499:9;34510:6;34494:4;:23::i;:::-;34475:4;:43::i;:::-;34460:12;:58;34421:109;-1:-1:-1;;;;;34540:15:0;;;;;;:8;:15;;;;;:22;;;:31;;;34665:23;;;;34699:33;;;;34747:20;;;34743:530;;;34784:61;34800:5;34807:10;34819:25;34824:7;34833:10;34819:4;:25::i;:::-;34784:15;:61::i;:::-;34743:530;;;34877:10;34867:7;:20;34863:410;;;34982:26;35011:25;35016:10;35028:7;35011:4;:25::i;:::-;34982:54;;35051:17;35071:37;35076:21;2114:1;35071:4;:37::i;:::-;35051:57;;35123:77;35139:5;35146:10;35158:41;35163:21;35186:12;35158:4;:41::i;:::-;35123:15;:77::i;:::-;35238:8;;35215:46;;35231:5;;35238:8;;;-1:-1:-1;;;;;35238:8:0;35248:12;35215:15;:46::i;:::-;34863:410;;;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;;;33649:1631:0:o;47168:1320::-;28596:39;;;;;;;28626:8;28596:39;;;;;;47322:19;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;47322:19;;28626:8;;28596:39;;;;;47322:19;28626:8;;47322:19;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;47367:10;;28734:13;47367:10;47359:40;;;;;-1:-1:-1;;;47359:40:0;;;;;;;;;;;;-1:-1:-1;;;47359:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47418:18:0;;;;;;:8;:18;;;;;:24;;;47410:50;;;;;-1:-1:-1;;;47410:50:0;;;;;;;;;;;;-1:-1:-1;;;47410:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47500:18:0;;47473:24;47500:18;;;:8;:18;;;;;47603:17;;;;47651:16;;;;;47698:12;;47741;;47827:8;;47548:314;;47603:17;47651:16;47698:12;47741;47784;;47548:24;:314::i;:::-;47531:331;;47901:12;47883:14;:30;;47875:56;;;;;-1:-1:-1;;;47875:56:0;;;;;;;;;;;;-1:-1:-1;;;47875:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47975:18:0;;;;;;:8;:18;;;;;:26;;;;;47970:47;;1841:6;2693:8;;47970:47;47952:14;:65;;47944:95;;;;;-1:-1:-1;;;47944:95:0;;;;;;;;;;;;-1:-1:-1;;;47944:95:0;;;;;;;;;;;;;;;48072:39;48077:9;:17;;;48096:14;48072:4;:39::i;:::-;48052:17;;;:59;48124:12;48139:28;48144:12;48124;48139:4;:28::i;:::-;48185:46;;;;;;;;48124:43;;-1:-1:-1;;;;;;48185:46:0;;;48194:10;;48185:46;;;;;;;;;;48244:40;48259:10;48271:12;48244:14;:40::i;:::-;48295:43;48310:27;48315:12;48329:7;48310:4;:27::i;48295:43::-;48364:8;;48349:33;;48364:8;;;-1:-1:-1;;;;;48364:8:0;48374:7;48349:14;:33::i;:::-;48393:53;48409:8;48419:10;48431:14;48393:15;:53::i;32209:250::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;32321:10;;28734:13;32321:10;32320:11;32312:40;;;;;-1:-1:-1;;;32312:40:0;;;;;;;;;;;;-1:-1:-1;;;32312:40:0;;;;;;;;;;;;;;;32385:11;;-1:-1:-1;;;;;32385:11:0;32371:10;:25;32363:56;;;;;-1:-1:-1;;;32363:56:0;;;;;;;;;;;;-1:-1:-1;;;32363:56:0;;;;;;;;;;;;;;;32430:11;:21;;;;;-1:-1:-1;;;32430:21:0;-1:-1:-1;;;;32430:21:0;;;;;;;;;28770:6;:14;;-1:-1:-1;;28770:14:0;;;32209:250::o;32467:432::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;32575:11;;-1:-1:-1;;;;;32575:11:0;32561:10;:25;32553:56;;;;;-1:-1:-1;;;32553:56:0;;;;;;;;;;;;-1:-1:-1;;;32553:56:0;;;;;;;;;;;;;;;32629:10;;;;32628:11;32620:40;;;;;-1:-1:-1;;;32620:40:0;;;;;;;;;;;;-1:-1:-1;;;32620:40:0;;;;;;;;;;;;;;;32679:7;:14;1897:1;-1:-1:-1;32679:34:0;32671:61;;;;;-1:-1:-1;;;32671:61:0;;;;;;;;;;;;-1:-1:-1;;;32671:61:0;;;;;;;;;;;;;;;32745:10;:17;;-1:-1:-1;;32745:17:0;32758:4;32745:17;;;32773:11;:18;;-1:-1:-1;;;;32773:18:0;-1:-1:-1;;;32773:18:0;;;32804:32;2394:10;32804:14;:32::i;:::-;32847:44;32862:10;2394;32847:14;:44::i;:::-;28770:6;:14;;-1:-1:-1;;28770:14:0;;;32467:432::o;37645:948::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;37787:10;;28734:13;37787:10;37779:40;;;;;-1:-1:-1;;;37779:40:0;;;;;;;;;;;;-1:-1:-1;;;37779:40:0;;;;;;;;;;;;;;;37832:14;37849:13;:11;:13::i;:::-;37832:30;;37873:10;37886:30;37891:13;37906:9;37886:4;:30::i;:::-;37873:43;-1:-1:-1;37935:10:0;37927:38;;;;;-1:-1:-1;;;37927:38:0;;;;;;;;;;;;-1:-1:-1;;;37927:38:0;;;;;;;;;;;;;;;37983:6;37978:516;37999:7;:14;37995:18;;37978:516;;;38035:9;38047:7;38055:1;38047:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38047:10:0;38083:11;;;:8;:11;;;;;;:19;;;38047:10;;-1:-1:-1;38083:19:0;38138:16;38143:5;38083:19;38138:4;:16::i;:::-;38117:37;-1:-1:-1;38177:18:0;38169:46;;;;;-1:-1:-1;;;38169:46:0;;;;;;;;;;;;-1:-1:-1;;;38169:46:0;;;;;;;;;;;;;;;38255:12;;38268:1;38255:15;;;;;;;;;;;;;38238:13;:32;;38230:57;;;;;-1:-1:-1;;;38230:57:0;;;;;;;;;;;;-1:-1:-1;;;38230:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38329:11:0;;;;;;:8;:11;;;;;:19;;;38324:40;;38350:13;38324:4;:40::i;:::-;-1:-1:-1;;;;;38302:11:0;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;38384:38;;;;;;;38302:11;;38393:10;;38384:38;;;;;;;;;;38437:45;38453:1;38456:10;38468:13;38437:15;:45::i;:::-;-1:-1:-1;;;38015:3:0;;37978:516;;;;38504:29;38519:13;38504:14;:29::i;:::-;38544:41;38559:10;38571:13;38544:14;:41::i;21015:1185::-;21259:18;21295:21;21319:32;21324:13;21339:11;21319:4;:32::i;:::-;21295:56;;21362:18;21383:31;21388:10;21400:13;21383:4;:31::i;:::-;21362:52;;21425:14;21442:31;21447:13;21462:10;21442:4;:31::i;:::-;21425:48;;21545:8;21556:28;1841:6;21567:16;21556:4;:28::i;:::-;21545:39;;21595:17;21615:20;21620:9;21631:3;21615:4;:20::i;:::-;21595:40;;21646:22;21671:34;21676:12;21690:14;21671:4;:34::i;:::-;21646:59;;21716:26;21745:39;21750:17;21769:14;21745:4;:39::i;:::-;21716:68;;22036:8;22047:43;22052:28;1841:6;22063:16;22052:4;:28::i;:::-;22082:7;22047:4;:43::i;:::-;22036:54;;22117:44;22122:21;22145:15;1841:6;22156:3;22145:4;:15::i;:::-;22117:4;:44::i;:::-;22101:60;21015:1185;-1:-1:-1;;;;;;;;;;;;;;;21015:1185:0:o;44711:1198::-;28596:39;;;;;;;28626:8;28596:39;;;;;;44871:18;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;44871:18;;28626:8;;28596:39;;;;;44871:18;28626:8;;44871:18;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;44917:10;;28734:13;44917:10;44909:40;;;;;-1:-1:-1;;;44909:40:0;;;;;;;;;;;;-1:-1:-1;;;44909:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44968:17:0;;;;;;:8;:17;;;;;:23;;;44960:49;;;;;-1:-1:-1;;;44960:49:0;;;;;;;;;;;;-1:-1:-1;;;44960:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45050:17:0;;;;;;:8;:17;;;;;:25;;;45045:45;;2643:1;1841:6;2636:8;;45045:4;:45::i;:::-;45028:13;:62;;45020:91;;;;;-1:-1:-1;;;45020:91:0;;;;;;;;;;;;-1:-1:-1;;;45020:91:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45150:17:0;;45124:23;45150:17;;;:8;:17;;;;;45251:16;;;;45298:15;;;;;45344:12;;45387;;45474:8;;45196:313;;45251:16;45298:15;45344:12;45387;45430:13;;45196:24;:313::i;:::-;45180:329;;45547:16;45530:13;:33;;45522:59;;;;;-1:-1:-1;;;45522:59:0;;;;;;;;;;;;-1:-1:-1;;;45522:59:0;;;;;;;;;;;;;;;45613:37;45618:8;:16;;;45636:13;45613:4;:37::i;:::-;45594:16;;;:56;45668:44;;;;;;;;-1:-1:-1;;;;;45668:44:0;;;45677:10;;45668:44;;;;;;;;;45725:29;45740:13;45725:14;:29::i;:::-;45765:41;45780:10;45792:13;45765:14;:41::i;:::-;45817:51;45833:7;45842:10;45854:13;45817:15;:51::i;:::-;-1:-1:-1;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;44711:1198;;-1:-1:-1;;;44711:1198:0:o;11196:397::-;11307:10;11263:4;11296:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11296:27:0;;;;;;;;;;11338:14;;;11334:160;;;11380:10;11399:1;11369:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11369:27:0;;;;;;;;;:31;11334:160;;;11463:19;11468:8;11478:3;11463:4;:19::i;:::-;11444:10;11433:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11433:27:0;;;;;;;;;:49;11334:160;11518:10;11535:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11509:54:0;;11535:27;;;;;;;;;;11509:54;;;;;;;-1:-1:-1;;11509:54:0;;11518:10;11509:54;;11535:22;-1:-1:-1;11535:22:0;-1:-1:-1;;;;;11509:54:0;;;;;;;;;;-1:-1:-1;11581:4:0;;11196:397;-1:-1:-1;;;11196:397:0:o;45917:1243::-;28596:39;;;;;;;28626:8;28596:39;;;;;;46071:18;;28614:10;;-1:-1:-1;;;;;;28605:7:0;;;;46071:18;;28626:8;;28596:39;;;;;46071:18;28626:8;;46071:18;28596:39;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;46115:10;;28734:13;46115:10;46107:40;;;;;-1:-1:-1;;;46107:40:0;;;;;;;;;;;;-1:-1:-1;;;46107:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46166:17:0;;;;;;:8;:17;;;;;:23;;;46158:49;;;;;-1:-1:-1;;;46158:49:0;;;;;;;;;;;;-1:-1:-1;;;46158:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46246:17:0;;46220:23;46246:17;;;:8;:17;;;;;46347:16;;;;46394:15;;;;;46440:12;;46483;;46570:8;;46292:313;;46347:16;46394:15;46440:12;46483;46526:13;;46292:24;:313::i;:::-;46276:329;-1:-1:-1;46626:18:0;46618:46;;;;;-1:-1:-1;;;46618:46:0;;;;;;;;;;;;-1:-1:-1;;;46618:46:0;;;;;;;;;;;;;;;46700:11;46683:13;:28;;46675:53;;;;;-1:-1:-1;;;46675:53:0;;;;;;;;;;;;-1:-1:-1;;;46675:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46771:17:0;;;;;;:8;:17;;;;;:25;;;46766:45;;2643:1;1841:6;2636:8;;46766:45;46749:13;:62;;46741:91;;;;;-1:-1:-1;;;46741:91:0;;;;;;;;;;;;-1:-1:-1;;;46741:91:0;;;;;;;;;;;;;;;46864:37;46869:8;:16;;;46887:13;46864:4;:37::i;:::-;46845:16;;;:56;46919:44;;;;;;;;-1:-1:-1;;;;;46919:44:0;;;46928:10;;46919:44;;;;;;;;;46976:29;46991:13;46976:14;:29::i;:::-;47016:41;47031:10;47043:13;47016:14;:41::i;:::-;47068:51;47084:7;47093:10;47105:13;47068:15;:51::i;10538:102::-;-1:-1:-1;;;;;10618:14:0;10594:4;10618:14;;;;;;;;;;;;10538:102::o;1956:53::-;2004:5;1841:6;1997:12;;42222:2479;28596:39;;;;;;;28626:8;28596:39;;;;;;-1:-1:-1;;;;28614:10:0;;28605:7;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28596:39:0;;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;42524:17:0;;-1:-1:-1;42524:17:0;;;:8;:17;;;;;:23;28734:13;42524:23;42516:49;;;;;-1:-1:-1;;;42516:49:0;;;;;;;;;;;;-1:-1:-1;;;42516:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42584:18:0;;;;;;:8;:18;;;;;:24;;;42576:50;;;;;-1:-1:-1;;;42576:50:0;;;;;;;;;;;;-1:-1:-1;;;42576:50:0;;;;;;;;;;;;;;;42645:11;;-1:-1:-1;;;42645:11:0;;;;42637:43;;;;;-1:-1:-1;;;42637:43:0;;;;;;;;;;;;-1:-1:-1;;;42637:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42719:26:0;;;42693:23;42719:26;;;:8;:26;;;;;;42783:27;;;;;;;42854:17;;;;;42849:38;;1841:6;2693:8;;42849:38;42831:14;:56;;42823:86;;;;;-1:-1:-1;;;42823:86:0;;;;;;;;;;;;-1:-1:-1;;;42823:86:0;;;;;;;;;;;;;;;42922:20;42945:315;42997:8;:16;;;43052:8;:15;;;43106:9;:17;;;43162:9;:16;;;43217:8;;42945:13;:315::i;:::-;42922:338;;43298:8;43279:15;:27;;43271:59;;;;;-1:-1:-1;;;43271:59:0;;;;;;;;;;;;-1:-1:-1;;;43271:59:0;;;;;;;;;;;;;;;43359:313;43404:8;:16;;;43451:8;:15;;;43497:9;:17;;;43545:9;:16;;;43592:14;43637:8;;43359:14;:313::i;:::-;43343:329;;43708:11;43691:13;:28;;43683:53;;;;;-1:-1:-1;;;43683:53:0;;;;;;;;;;;;-1:-1:-1;;;43683:53:0;;;;;;;;;;;;;;;43768:37;43773:8;:16;;;43791:13;43768:4;:37::i;:::-;43749:8;:16;;:56;;;;43836:39;43841:9;:17;;;43860:14;43836:4;:39::i;:::-;43816:17;;;;:59;;;43953:16;;;44004:15;;;;;44106:16;;;;44157:8;;43905:291;;43816:59;44106:16;43905:13;:291::i;:::-;43888:308;;44233:15;44215:14;:33;;44207:61;;;;;-1:-1:-1;;;44207:61:0;;;;;;;;;;;;-1:-1:-1;;;44207:61:0;;;;;;;;;;;;;;;44305:8;44287:14;:26;;44279:54;;;;;-1:-1:-1;;;44279:54:0;;;;;;;;;;;;-1:-1:-1;;;44279:54:0;;;;;;;;;;;;;;;44371:35;44376:13;44391:14;44371:4;:35::i;:::-;44352:15;:54;;44344:82;;;;;-1:-1:-1;;;44344:82:0;;;;;;;;;;;;-1:-1:-1;;;44344:82:0;;;;;;;;;;;;;;;44444:70;;;;;;;;;;;;;;-1:-1:-1;;;;;44444:70:0;;;;;;;;44453:10;;44444:70;;;;;;;;;;;44527:51;44543:7;44552:10;44564:13;44527:15;:51::i;:::-;44589:53;44605:8;44615:10;44627:14;44589:15;:53::i;:::-;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;42222:2479:0;;;;-1:-1:-1;42222:2479:0;-1:-1:-1;;;;42222:2479:0:o;39733:2481::-;28596:39;;;;;;;28626:8;28596:39;;;;;;-1:-1:-1;;;;28614:10:0;;28605:7;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28596:39:0;;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;40037:17:0;;-1:-1:-1;40037:17:0;;;:8;:17;;;;;:23;28734:13;40037:23;40029:49;;;;;-1:-1:-1;;;40029:49:0;;;;;;;;;;;;-1:-1:-1;;;40029:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40097:18:0;;;;;;:8;:18;;;;;:24;;;40089:50;;;;;-1:-1:-1;;;40089:50:0;;;;;;;;;;;;-1:-1:-1;;;40089:50:0;;;;;;;;;;;;;;;40158:11;;-1:-1:-1;;;40158:11:0;;;;40150:43;;;;;-1:-1:-1;;;40150:43:0;;;;;;;;;;;;-1:-1:-1;;;40150:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40232:26:0;;;40206:23;40232:26;;;:8;:26;;;;;;40296:27;;;;;;;40366:16;;;;40361:36;;2643:1;1841:6;2636:8;;40361:36;40344:13;:53;;40336:82;;;;;-1:-1:-1;;;40336:82:0;;;;;;;;;;;;-1:-1:-1;;;40336:82:0;;;;;;;;;;;;;;;40431:20;40454:315;40506:8;:16;;;40561:8;:15;;;40615:9;:17;;;40671:9;:16;;;40726:8;;40454:13;:315::i;:::-;40431:338;;40807:8;40788:15;:27;;40780:59;;;;;-1:-1:-1;;;40780:59:0;;;;;;;;;;;;-1:-1:-1;;;40780:59:0;;;;;;;;;;;;;;;40869:312;40914:8;:16;;;40961:8;:15;;;41007:9;:17;;;41055:9;:16;;;41102:13;41146:8;;40869:14;:312::i;:::-;40852:329;;41218:12;41200:14;:30;;41192:56;;;;;-1:-1:-1;;;41192:56:0;;;;;;;;;;;;-1:-1:-1;;;41192:56:0;;;;;;;;;;;;;;;41280:37;41285:8;:16;;;41303:13;41280:4;:37::i;:::-;41261:8;:16;;:56;;;;41348:39;41353:9;:17;;;41372:14;41348:4;:39::i;:::-;41328:17;;;;:59;;;41465:16;;;41516:15;;;;;41618:16;;;;41669:8;;41417:291;;41328:59;41618:16;41417:13;:291::i;:::-;41400:308;;41745:15;41727:14;:33;;41719:61;;;;;-1:-1:-1;;;41719:61:0;;;;;;;;;;;;-1:-1:-1;;;41719:61:0;;;;;;;;;;;;;;;41817:8;41799:14;:26;;41791:54;;;;;-1:-1:-1;;;41791:54:0;;;;;;;;;;;;-1:-1:-1;;;41791:54:0;;;;;;;;;;;;;;;41883:35;41888:13;41903:14;41883:4;:35::i;:::-;41864:15;:54;;41856:82;;;;;-1:-1:-1;;;41856:82:0;;;;;;;;;;;;-1:-1:-1;;;41856:82:0;;;;;;;;;;;;;;;41956:70;;;;;;;;;;;;;;-1:-1:-1;;;;;41956:70:0;;;;;;;;41965:10;;41956:70;;;;;;;;;;;42039:51;42055:7;42064:10;42076:13;42039:15;:51::i;:::-;42101:53;42117:8;42127:10;42139:14;42101:15;:53::i;25694:1283::-;25941:17;26031:21;26055:33;26060:14;26076:11;26055:4;:33::i;:::-;26031:57;;26171:8;26182:28;1841:6;26193:16;26182:4;:28::i;:::-;26171:39;;26221:8;26232:18;26237:3;26242:7;26232:4;:18::i;:::-;26221:29;;26261:32;26296:37;26301:14;26317:15;1841:6;26328:3;26317:4;:15::i;26296:37::-;26261:72;;26346:23;26372:50;26377:15;26394:27;26372:4;:50::i;:::-;26346:76;;26433:18;26454:41;26459:18;26479:15;26454:4;:41::i;:::-;26433:62;;26575:14;26592:37;26597:13;26612:16;26592:4;:37::i;:::-;26575:54;;26640:18;26661:27;26666:9;26677:10;26661:4;:27::i;:::-;26640:48;;26699:29;26731:31;26736:10;26748:13;26731:4;:31::i;:::-;26699:63;;26887:52;26892:24;26918:20;1841:6;2114:1;26918:4;:20::i;26887:52::-;26872:67;-1:-1:-1;;;;;;;;;;25694:1283:0;;;;;;;;:::o;18831:1166::-;19075:18;19359:21;19383:32;19388:13;19403:11;19383:4;:32::i;:::-;19359:56;;19426:8;19437:43;19442:28;1841:6;19453:16;19442:4;:28::i;:::-;19472:7;19437:4;:43::i;:::-;19426:54;;19491:26;19520:36;19525:13;19540:15;1841:6;19551:3;19540:4;:15::i;:::-;19520:4;:36::i;:::-;19491:65;;19569:22;19594:43;19599:14;19615:21;19594:4;:43::i;:::-;19569:68;;19648:17;19668:39;19673:17;19692:14;19668:4;:39::i;:::-;19648:59;;19788:14;19805:36;19810:12;19824:16;19805:4;:36::i;:::-;19788:53;;19852:18;19873:27;19878:9;19889:10;19873:4;:27::i;:::-;19852:48;;19927:31;19932:13;19947:10;19927:4;:31::i;:::-;19911:47;18831:1166;-1:-1:-1;;;;;;;;;;;;;;18831:1166:0:o;2290:54::-;2338:6;1841;2331:13;;23319:1256;23564:19;23601:21;23625:33;23630:14;23646:11;23625:4;:33::i;:::-;23601:57;;23766:29;23798:40;23803:12;23817:20;1841:6;2114:1;23817:4;:20::i;23798:40::-;23766:72;;23849:18;23870:42;23875:10;23887:24;23870:4;:42::i;:::-;23849:63;;23923:14;23940:31;23945:13;23960:10;23940:4;:31::i;:::-;23923:48;;24039:18;24060:45;24065:9;24076:28;1841:6;24087:16;24076:4;:28::i;:::-;24060:4;:45::i;:::-;24039:66;;24116:23;24142:36;24147:13;24162:15;24142:4;:36::i;:::-;24116:62;;24191:32;24226:41;24231:15;24248:18;24226:4;:41::i;:::-;24191:76;;24403:8;24414:43;24419:28;1841:6;24430:16;24419:4;:28::i;24414:43::-;24403:54;;24485:50;24490:27;24519:15;1841:6;24530:3;24519:4;:15::i;36414:225::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;-1:-1:-1;;;;;36517:15:0;;-1:-1:-1;36517:15:0;;;:8;:15;;;;;:21;28734:13;36517:21;36509:47;;;;;-1:-1:-1;;;36509:47:0;;;;;;;;;;;;-1:-1:-1;;;36509:47:0;;;;;;;;;;;;;;;36593:38;;;-1:-1:-1;;;36593:38:0;;36625:4;36593:38;;;;;;-1:-1:-1;;;;;36593:23:0;;;-1:-1:-1;;36593:38:0;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;36593:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36593:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36593:38:0;-1:-1:-1;;;;;36567:15:0;;;;;;;;:8;36593:38;36567:15;;;;:23;;:64;28770:6;:14;;-1:-1:-1;;28770:14:0;;;36414:225::o;29729:111::-;29822:10;;;;29729:111;:::o;31999:202::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;32127:11;;-1:-1:-1;;;;;32127:11:0;32113:10;:25;32105:56;;;;;-1:-1:-1;;;32105:56:0;;;;;;;;;;;;-1:-1:-1;;;32105:56:0;;;;;;;;;;;;;;;32172:11;:21;;-1:-1:-1;;;;;;32172:21:0;-1:-1:-1;;;;;32172:21:0;;;;;;;;;;28770:6;:14;;-1:-1:-1;;28770:14:0;;;31999:202::o;30697:148::-;28842:6;;30796:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;30825:12:0;;30697:148;:::o;2353:51::-;2394:10;2353:51;:::o;30463:226::-;28842:6;;30570:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30602:15:0;;;;;;:8;:15;;;;;:21;;;30594:47;;;;;-1:-1:-1;;;30594:47:0;;;;;;;;;;;;-1:-1:-1;;;30594:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30659:15:0;;;;;:8;:15;;;;;:22;;;;30463:226::o;10225:87::-;10297:7;10290:14;;;;;;;;;;;;;-1:-1:-1;;10290:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;10264:13;;10290:14;;10297:7;;10290:14;;;10297:7;10290:14;;;;;;;;;;;;;;;;;;;;;;;;2651:59;2692:18;2651:59;:::o;920:121::-;-1:-1:-1;;;;920:121:0:o;13913:509::-;14125:14;14157:10;14170:35;14175:14;14191:13;14170:4;:35::i;:::-;14157:48;;14216:10;14229:37;14234:15;14251:14;14229:4;:37::i;:::-;14216:50;;14277:10;14290:18;14295:5;14302;14290:4;:18::i;:::-;14277:31;;14319:10;14332:31;1841:6;14343:19;1841:6;14354:7;14343:4;:19::i;14332:31::-;14319:44;;14395:18;14400:5;14407;14395:4;:18::i;:::-;14383:30;13913:509;-1:-1:-1;;;;;;;;;;13913:509:0:o;11601:133::-;11660:4;11677:27;11683:10;11695:3;11700;11677:5;:27::i;:::-;-1:-1:-1;11722:4:0;11601:133;;;;:::o;38601:1122::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;-1:-1:-1;;28734:13:0;;;;;38743:10;;28734:13;38743:10;38735:40;;;;;-1:-1:-1;;;38735:40:0;;;;;;;;;;;;-1:-1:-1;;;38735:40:0;;;;;;;;;;;;;;;38788:14;38805:13;:11;:13::i;:::-;38788:30;;38829:12;38844:28;38849:12;2114:1;38844:4;:28::i;:::-;38829:43;;38883:20;38906:27;38911:12;38925:7;38906:4;:27::i;:::-;38883:50;;38944:10;38957:32;38962:15;38979:9;38957:4;:32::i;:::-;38944:45;-1:-1:-1;39008:10:0;39000:38;;;;;-1:-1:-1;;;39000:38:0;;;;;;;;;;;;-1:-1:-1;;;39000:38:0;;;;;;;;;;;;;;;39051:40;39066:10;39078:12;39051:14;:40::i;:::-;39117:8;;39102:33;;39117:8;;;-1:-1:-1;;;;;39117:8:0;39127:7;39102:14;:33::i;:::-;39146:31;39161:15;39146:14;:31::i;:::-;39195:6;39190:524;39211:7;:14;39207:18;;39190:524;;;39247:9;39259:7;39267:1;39259:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39259:10:0;39295:11;;;:8;:11;;;;;;:19;;;39259:10;;-1:-1:-1;39295:19:0;39351:16;39356:5;39295:19;39351:4;:16::i;:::-;39329:38;-1:-1:-1;39390:19:0;39382:47;;;;;-1:-1:-1;;;39382:47:0;;;;;;;;;;;;-1:-1:-1;;;39382:47:0;;;;;;;;;;;;;;;39470:13;;39484:1;39470:16;;;;;;;;;;;;;39452:14;:34;;39444:60;;;;;-1:-1:-1;;;39444:60:0;;;;;;;;;;;;-1:-1:-1;;;39444:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39546:11:0;;;;;;:8;:11;;;;;:19;;;39541:41;;39567:14;39541:4;:41::i;:::-;-1:-1:-1;;;;;39519:11:0;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;39602:39;;;;;;;39519:11;;39611:10;;39602:39;;;;;;;;;;39656:46;39672:1;39675:10;39687:14;39656:15;:46::i;:::-;-1:-1:-1;;;39227:3:0;;39190:524;;;-1:-1:-1;;28770:6:0;:14;;-1:-1:-1;;28770:14:0;;;-1:-1:-1;;;;;;38601:1122:0:o;1905:42::-;1946:1;1905:42;:::o;1856:::-;1897:1;1856:42;:::o;2413:46::-;2454:5;2413:46;:::o;15440:683::-;15682:19;15719:16;15738:35;15743:13;15758:14;15738:4;:35::i;:::-;15719:54;;15784:15;15802:19;1841:6;15813:7;15802:4;:19::i;:::-;15784:37;;15845:31;15850:13;15865:10;15845:4;:31::i;:::-;15832:44;;15887:6;15896:54;15901:14;15917:32;15922:14;15938:10;15917:4;:32::i;15896:54::-;15887:63;;15961:8;15972:20;15977:1;15980:11;15972:4;:20::i;:::-;15961:31;;16003:8;16014:15;1841:6;16025:3;16014:4;:15::i;:::-;16003:26;;16057;16062:15;16079:3;16057:4;:26::i;:::-;16040:43;15440:683;-1:-1:-1;;;;;;;;;;;;15440:683:0:o;2016:50::-;2064:2;1841:6;2057:9;;2466:59;2507:18;2466:59;:::o;30254:201::-;28842:6;;30341:23;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;30390:10;;;;30382:40;;;;;-1:-1:-1;;;30382:40:0;;;;;;;;;;;;-1:-1:-1;;;30382:40:0;;;;;;;;;;;;;;;30440:7;30433:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30433:14:0;;;-1:-1:-1;30433:14:0;;;;;;;;;;;;;;;;;;30254:201;:::o;2073:42::-;2114:1;2073:42;:::o;30103:143::-;28842:6;;30183:23;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;29979:116;30073:7;:14;29979:116;:::o;35288:1041::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;28701:6;;;;;;;28700:7;28692:31;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;-1:-1:-1;;;28692:31:0;;;;;;;;;;;;;;;28734:6;:13;;;-1:-1:-1;;28734:13:0;;;;;;35409:11;;-1:-1:-1;;;;;35409:11:0;35395:10;:25;35387:56;;;;;-1:-1:-1;;;35387:56:0;;;;;;;;;;;;-1:-1:-1;;;35387:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35462:15:0;;;;;;:8;:15;;;;;:21;;;35454:47;;;;;-1:-1:-1;;;35454:47:0;;;;;;;;;;;;-1:-1:-1;;;35454:47:0;;;;;;;;;;;;;;;35521:10;;;;35520:11;35512:40;;;;;-1:-1:-1;;;35512:40:0;;;;;;;;;;;;-1:-1:-1;;;35512:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35585:15:0;;35565:17;35585:15;;;:8;:15;;;;;:23;;;;35639:28;35585:23;35565:17;35639:4;:28::i;:::-;35700:12;;-1:-1:-1;;;;;35714:15:0;;;;;;:8;:15;;;;;:22;;;35619:48;;-1:-1:-1;35695:42:0;;:4;:42::i;:::-;35680:12;:57;-1:-1:-1;;;;;35860:15:0;;35847:10;35860:15;;;:8;:15;;;;;-1:-1:-1;35860:21:0;;35904:7;:14;;-1:-1:-1;;35904:18:0;;;:7;:18;;35950:13;;;;;;;;;;;;;;;;35933:7;:14;;-1:-1:-1;;;;;35950:13:0;;;;35941:5;;35933:14;;;;;;;;;;;;;;:30;;-1:-1:-1;;;;;;35933:30:0;-1:-1:-1;;;;;35933:30:0;;;;;;;;;;;35983:7;:14;;36007:5;;35974:8;;35933:14;;36007:5;;35983:14;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35983:14:0;35974:24;;;;;;;;;;;;-1:-1:-1;35974:30:0;:38;36023:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;36023:13:0;;;;;;;-1:-1:-1;;;;;;36023:13:0;;;;;;;;;36065:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36047:15:0;;;;:8;:15;;;;;;;:136;;;;-1:-1:-1;;36047:136:0;;;;;;;;;-1:-1:-1;36047:136:0;;;;;;;;;;;;;;36196:68;36047:15;36219:10;36231:32;36236:12;36250;36231:4;:32::i;36196:68::-;36298:8;;36275:46;;36291:5;;36298:8;;;-1:-1:-1;;;;;36298:8:0;36308:12;36275:15;:46::i;31360:128::-;28842:6;;31443:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;31472:8:0;;31360:128;:::o;10936:252::-;11066:10;11003:4;11055:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11055:27:0;;;;;;;;;;11050:38;;11084:3;11050:4;:38::i;:::-;11031:10;11020:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11020:27:0;;;;;;;;;;;:68;;;11104:54;;;;;;;-1:-1:-1;;11020:27:0;;11104:54;;;;11020:22;-1:-1:-1;11020:22:0;-1:-1:-1;;;;;11104:54:0;;;;;;;;;;-1:-1:-1;11176:4:0;10936:252;;;;:::o;10410:120::-;-1:-1:-1;;;;;10502:15:0;;;10478:4;10502:15;;;-1:-1:-1;10502:15:0;;;;;;;;:20;;;;;;;;;;;;;10410:120::o;32909:732::-;28596:39;;;;;;;28626:8;28596:39;;;;;;28614:10;;-1:-1:-1;28605:7:0;;-1:-1:-1;;;;;;28605:7:0;;-1:-1:-1;;28626:8:0;28596:39;;;;-1:-1:-1;28626:8:0;;-1:-1:-1;28596:39:0;1:33:-1;99:1;81:16;;;74:27;28596:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;28596:39:0;;;;-1:-1:-1;28596:39:0;;-1:-1:-1;;;;28596:39:0;33117:11;;-1:-1:-1;;;;;33117:11:0;33103:10;:25;33095:56;;;;;-1:-1:-1;;;33095:56:0;;;;;;;;;;;;-1:-1:-1;;;33095:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33171:15:0;;;;;;:8;:15;;;;;:21;;;33170:22;33162:47;;;;;-1:-1:-1;;;33162:47:0;;;;;;;;;;;;-1:-1:-1;;;33162:47:0;;;;;;;;;;;;;;;33229:10;;;;33228:11;33220:40;;;;;-1:-1:-1;;;33220:40:0;;;;;;;;;;;;-1:-1:-1;;;33220:40:0;;;;;;;;;;;;;;;33281:7;:14;1946:1;-1:-1:-1;33273:60:0;;;;;-1:-1:-1;;;33273:60:0;;;;;;;;;;;;-1:-1:-1;;;33273:60:0;;;;;;;;;;;;;;;33364:198;;;;;;;;33393:4;33364:198;;;33419:7;:14;;33364:198;;;;;;;-1:-1:-1;33364:198:0;;;;;;;;;;;;-1:-1:-1;;;;;33346:15:0;;;;;:8;:15;;;;;;:216;;;;-1:-1:-1;;33346:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;33573:19:0;;;;;;;-1:-1:-1;;;;;;33573:19:0;;;;;;33603:30;33346:15;33617:7;33626:6;33603;:30::i;:::-;32909:732;;;:::o;2595:49::-;2643:1;1841:6;2636:8;;30853:275;28842:6;;30958:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30990:15:0;;;;;;:8;:15;;;;;:21;;;30982:47;;;;;-1:-1:-1;;;30982:47:0;;;;;;;;;;;;-1:-1:-1;;;30982:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31054:15:0;;31040:11;31054:15;;;:8;:15;;;;;:22;;;31107:12;;31094:26;;31054:22;;31094:4;:26::i;:::-;31087:33;30853:275;-1:-1:-1;;;30853:275:0:o;31136:216::-;28842:6;;31232:4;;28842:6;;;;;28841:7;28833:31;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;-1:-1:-1;;;28833:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31264:15:0;;;;;;:8;:15;;;;;:21;;;31256:47;;;;;-1:-1:-1;;;31256:47:0;;;;;;;;;;;;-1:-1:-1;;;31256:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31321:15:0;;;;;:8;:15;;;;;:23;;;;31136:216::o;17141:672::-;17384:18;17420:16;17439:35;17444:14;17460:13;17439:4;:35::i;:::-;17420:54;;17485:9;17497:37;17502:15;17519:14;17497:4;:37::i;:::-;17485:49;;17545:6;17554:27;17559:15;17576:4;17554;:27::i;:::-;17545:36;;17592:8;17603:20;17608:1;17611:11;17603:4;:20::i;:::-;17592:31;;17640:15;17645:3;1841:6;17640:4;:15::i;:::-;17634:21;;17682:19;1841:6;17693:7;17682:4;:19::i;:::-;17666:35;;17728:46;17733:25;17738:14;17754:3;17733:4;:25::i;:::-;17760:13;17728:4;:46::i;:::-;17712:62;17141:672;-1:-1:-1;;;;;;;;;;;17141:672:0:o;29608:113::-;29702:11;;-1:-1:-1;;;29702:11:0;;;;;29608:113::o;4336:311::-;4407:4;4439:5;;;4463:6;;;:21;;;4483:1;4478;4473:2;:6;;;;;;:11;4463:21;4455:50;;;;;-1:-1:-1;;;4455:50:0;;;;;;;;;;;;-1:-1:-1;;;4455:50:0;;;;;;;;;;;;;;;4532:8;4526:15;;4560:8;;;;4552:37;;;;;-1:-1:-1;;;4552:37:0;;;;;;;;;;;;-1:-1:-1;;;4552:37:0;;;;;;;;;;;;;;;4600:7;1841:6;4610:2;:9;;;4336:311;-1:-1:-1;;;;;;4336:311:0:o;3895:202::-;3966:4;3989:6;3997:9;4010:14;4019:1;4022;4010:8;:14::i;:::-;3988:36;;;;4044:4;4043:5;4035:35;;;;;-1:-1:-1;;;4035:35:0;;;;;;;;;;;;-1:-1:-1;;;4035:35:0;;;;;;;;;;;;;;;-1:-1:-1;4088:1:0;3895:202;-1:-1:-1;;;3895:202:0:o;50478:112::-;50563:19;50569:4;50575:6;50563:5;:19::i;:::-;50478:112;;:::o;50814:92::-;50885:13;50891:6;50885:5;:13::i;:::-;50814:92;:::o;50598:108::-;50681:17;50687:2;50691:6;50681:5;:17::i;50274:196::-;50385:34;;;-1:-1:-1;;;50385:34:0;;-1:-1:-1;;;;;50385:34:0;;;;;;;;;;;;;;;-1:-1:-1;;50385:22:0;;;-1:-1:-1;;50385:34:0;;;;;;;;;;;;;;-1:-1:-1;50385:22:0;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;50385:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50385:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50385:34:0;;-1:-1:-1;50385:34:0;50430:32;;;;;-1:-1:-1;;;50430:32:0;;;;;;;;;;;;-1:-1:-1;;;50430:32:0;;;;;;;;;;;;;;;50274:196;;;;:::o;9465:273::-;-1:-1:-1;;;;;9544:13:0;;:8;:13;;;;;;;;;;;-1:-1:-1;;9544:20:0;9536:53;;;;;-1:-1:-1;;;9536:53:0;;;;;;;;;;;;-1:-1:-1;;;9536:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9621:13:0;;:8;:13;;;;;;;;;;;9616:24;;9636:3;9616:4;:24::i;:::-;-1:-1:-1;;;;;9600:13:0;;;:8;:13;;;;;;;;;;;:40;;;;9672:13;;;;;;;9667:24;;9687:3;9667:4;:24::i;:::-;-1:-1:-1;;;;;9651:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;9707:23;;;;;;;9651:13;;9707:23;;;;;;;;;;;;;9465:273;;;:::o;3707:180::-;3778:4;3809:5;;;3833:6;;;;3825:35;;;;;-1:-1:-1;;;3825:35:0;;;;;;;;;;;;-1:-1:-1;;;3825:35:0;;;;;;;;;;;;;;50047:219;50160:55;;;-1:-1:-1;;;50160:55:0;;-1:-1:-1;;;;;50160:55:0;;;;;;;50201:4;50160:55;;;;;;;;;;;;-1:-1:-1;;50160:26:0;;;-1:-1:-1;;50160:55:0;;;;;;;;;;;;;;-1:-1:-1;50160:26:0;:55;;;5:2:-1;;;;30:1;27;20:12;50714:92:0;50785:13;50791:6;50785:5;:13::i;4655:387::-;4726:4;4756:6;4748:31;;;;;-1:-1:-1;;;4748:31:0;;;;;;;;;;;;-1:-1:-1;;;4748:31:0;;;;;;;;;;;;;;;1841:6;4800:8;;4827:6;;;:24;;;1841:6;4842:1;4837:2;:6;;;;;;:14;4827:24;4819:53;;;;;-1:-1:-1;;;4819:53:0;;;;;;;;;;;;-1:-1:-1;;;4819:53:0;;;;;;;;;;;;;;;4920:1;4916:5;;4910:12;;4941:8;;;;4933:37;;;;;-1:-1:-1;;;4933:37:0;;;;;;;;;;;;-1:-1:-1;;;4933:37:0;;;;;;;;;;;;;;;4998:7;5013:1;5008:2;:6;;;;5545:552;5621:4;2454:5;5651:4;:21;;5643:55;;;;;-1:-1:-1;;;5643:55:0;;;;;;;;;;;;-1:-1:-1;;;5643:55:0;;;;;;;;;;;;;;;2507:18;5717:21;;;5709:56;;;;;-1:-1:-1;;;5709:56:0;;;;;;;;;;;;-1:-1:-1;;;5709:56:0;;;;;;;;;;;;;;;5778:10;5792:11;5799:3;5792:6;:11::i;:::-;5778:25;;5814:11;5828:16;5833:3;5838:5;5828:4;:16::i;:::-;5814:30;;5857:13;5873:24;5879:4;5885:11;5890:5;5885:4;:11::i;:::-;5873:5;:24::i;:::-;5857:40;-1:-1:-1;5914:11:0;5910:59;;5949:8;-1:-1:-1;5942:15:0;;-1:-1:-1;;5942:15:0;5910:59;5981:18;6002:40;6013:4;6019:6;2573:13;6002:10;:40::i;:::-;5981:61;;6060:29;6065:8;6075:13;6060:4;:29::i;:::-;6053:36;5545:552;-1:-1:-1;;;;;;;5545:552:0:o;4105:223::-;4180:4;4186;4217:1;4212;:6;4208:113;;-1:-1:-1;;4243:5:0;;;4250;4235:21;;4208:113;-1:-1:-1;;4297:5:0;;;4304:4;4208:113;4105:223;;;;;:::o;9848:98::-;9907:31;9913:4;9927;9934:3;9907:5;:31::i;9165:292::-;9235:4;9218:8;:23;;;;;;;;;;;:30;-1:-1:-1;9218:30:0;9210:63;;;;;-1:-1:-1;;;9210:63:0;;;;;;;;;;;;-1:-1:-1;;;9210:63:0;;;;;;;;;;;;;;;9332:4;9315:8;:23;;;;;;;;;;;9310:34;;9340:3;9310:4;:34::i;:::-;9301:4;9284:8;:23;;;;;;;;;;:60;9375:12;;9370:23;;9389:3;9370:4;:23::i;:::-;9355:12;:38;9409:40;;;;;;;;9441:1;;9426:4;;9409:40;;;;;;;;;9165:292;:::o;9746:94::-;9803:29;9817:4;9824:2;9828:3;9803:5;:29::i;8939:218::-;9032:4;9015:8;:23;;;;;;;;;;;9010:34;;9040:3;9010:4;:34::i;:::-;9001:4;8984:8;:23;;;;;;;;;;:60;9075:12;;9070:23;;9089:3;9070:4;:23::i;:::-;9055:12;:38;9109:40;;;;;;;;9138:4;;9126:1;;9109:40;;;;;;;;;8939:218;:::o;3583:116::-;3648:4;1841:6;3677:7;3682:1;3677:4;:7::i;:::-;:14;;3583:116;-1:-1:-1;;3583:116:0:o;3467:108::-;1841:6;3559:8;;;3467:108::o;5070:314::-;5142:4;;5177:1;5173;:5;:21;;1841:6;5173:21;;;5186:1;5173:21;5164:30;-1:-1:-1;5217:1:0;5212:6;;;;5207:151;5220:6;;5207:151;;5255:10;5260:1;5263;5255:4;:10::i;:::-;5251:14;-1:-1:-1;5290:1:0;5286;:5;:10;5282:65;;5321:10;5326:1;5329;5321:4;:10::i;:::-;5317:14;;5282:65;5233:1;5228:6;;;;5207:151;;6105:1079;6203:4;6258:3;6203:4;;6295:20;6304:4;1841:6;6295:8;:20::i;:::-;6272:43;;-1:-1:-1;6272:43:0;-1:-1:-1;1841:6:0;;6326:9;6659:1;6645:509;6670:9;6662:4;:17;6645:509;;6701:9;1841:6;6713:1;:8;6701:20;;6737:6;6745:9;6758:29;6767:1;6770:16;6775:4;1841:6;6770:4;:16::i;:::-;6758:8;:29::i;:::-;6736:51;;;;6809:22;6814:4;6820:10;6825:1;6828;6820:4;:10::i;6809:22::-;6802:29;;6853:16;6858:4;6864;6853;:16::i;:::-;6846:23;-1:-1:-1;6888:9:0;6884:20;;6899:5;;;;;6884:20;6925:4;6921:30;;;6942:9;;;6921:30;6970:4;6966:30;;;6987:9;;;6966:30;7015:8;7011:132;;;7050:15;7055:3;7060:4;7050;:15::i;:::-;7044:21;;7011:132;;;7112:15;7117:3;7122:4;7112;:15::i;:::-;7106:21;;7011:132;-1:-1:-1;;;6681:3:0;;6645:509;;;-1:-1:-1;7173:3:0;;6105:1079;-1:-1:-1;;;;;;;;;6105:1079:0:o

Swarm Source

bzzr://febbe73d4127aeb7ee537d2f2af0a6025927436167402edd6b6943b9fc9857bc
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.