Contract 0xb43410A271C71f2FDA2D1ED9C1165e924Be159D9

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xaba8c011d04edfa0af538f4a0b0b45d04dce305dd0d8354df7ea340552ecb2edSet Governance54123912021-03-05 10:50:49270 days 7 hrs ago0x9696969e67b37403196a3519edc176276714a724 IN  0xb43410a271c71f2fda2d1ed9c1165e924be159d90 BNB0.00028467
0x8731a7cdeafbb3cdb515a81f7cb18c698f4e2e68e2a2ad433fcbb59e89b76e35Set Strategist54123892021-03-05 10:50:43270 days 7 hrs ago0x9696969e67b37403196a3519edc176276714a724 IN  0xb43410a271c71f2fda2d1ed9c1165e924be159d90 BNB0.000284
0x7d63e6043bccabe2448a660c912c581a3a203f4fb66501431d464238f4fc2d4bSet V Swap Pairs54091562021-03-05 8:09:04270 days 10 hrs ago0x9696969e67b37403196a3519edc176276714a724 IN  0xb43410a271c71f2fda2d1ed9c1165e924be159d90 BNB0.00066082
0x3ced4e70ba33370625de92b45e57806a76e660711174e46fdb2bf361b93b8a08Initialize54090972021-03-05 8:06:07270 days 10 hrs ago0x9696969e67b37403196a3519edc176276714a724 IN  0xb43410a271c71f2fda2d1ed9c1165e924be159d90 BNB0.00437091
0x85f936adadead3bc5683fde3eac81605d007a6365131e6484d53910c92f73dd30x6080604054090522021-03-05 8:03:52270 days 10 hrs ago0x9696969e67b37403196a3519edc176276714a724 IN  Contract Creation0 BNB0.04942668
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x37861b97d9eeec175e4e7a1ca809a57bb035355c100ceefc2594b68b6be39b7f72248522021-05-07 21:46:29206 days 20 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token73.684502082699687435 BNB
0x37861b97d9eeec175e4e7a1ca809a57bb035355c100ceefc2594b68b6be39b7f72248522021-05-07 21:46:29206 days 20 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d973.684502082699687435 BNB
0xdd3a61467e56c203081ebf4c260dab1a8e83136365ec4ad84b278c3d4059a15572247382021-05-07 21:40:47206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token14.137281960058863353 BNB
0xdd3a61467e56c203081ebf4c260dab1a8e83136365ec4ad84b278c3d4059a15572247382021-05-07 21:40:47206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d914.137281960058863353 BNB
0x7b3d714610a1b8f759308b584d4c99c1102a4d21ce857957cc92d0aeb2bb8c1872246792021-05-07 21:37:50206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token1.978742344542877844 BNB
0x7b3d714610a1b8f759308b584d4c99c1102a4d21ce857957cc92d0aeb2bb8c1872246792021-05-07 21:37:50206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d91.978742344542877844 BNB
0x963b5a870a65f553d47369275884211270e148bdb7eacea519cc664a4677f69772246652021-05-07 21:37:08206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token2.064323236782448611 BNB
0x963b5a870a65f553d47369275884211270e148bdb7eacea519cc664a4677f69772246652021-05-07 21:37:08206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d92.064323236782448611 BNB
0x51418b94196a3a4d3c493c8fa1228672af93a2b049e5b810d8234144fb0398c772245972021-05-07 21:33:44206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token6.034733719379374928 BNB
0x51418b94196a3a4d3c493c8fa1228672af93a2b049e5b810d8234144fb0398c772245972021-05-07 21:33:44206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d96.034733719379374928 BNB
0xe6e0c69db0d1350e6da0cafabd7893decbc81955f929bdacf3c14469f172461272245892021-05-07 21:33:20206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token19.776088792991969194 BNB
0xe6e0c69db0d1350e6da0cafabd7893decbc81955f929bdacf3c14469f172461272245892021-05-07 21:33:20206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d919.776088792991969194 BNB
0xbe472c0630cff32efb09090600c6d897975dda61209e397b95922fb57563034972245562021-05-07 21:31:41206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token0.957162002851951192 BNB
0xbe472c0630cff32efb09090600c6d897975dda61209e397b95922fb57563034972245562021-05-07 21:31:41206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d90.957162002851951192 BNB
0x142d57bc85066cfcd2288dc69feae723825a59175a3668f141211aee0e1f457a72245482021-05-07 21:31:17206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token7.078216842309238277 BNB
0x142d57bc85066cfcd2288dc69feae723825a59175a3668f141211aee0e1f457a72245482021-05-07 21:31:17206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d97.078216842309238277 BNB
0xf37fbe4ef556109c98a2d3d3f0aa448c0d84d344bb1e299390ed003f5c764a1972245482021-05-07 21:31:17206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token0.611482394988032549 BNB
0xf37fbe4ef556109c98a2d3d3f0aa448c0d84d344bb1e299390ed003f5c764a1972245482021-05-07 21:31:17206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d90.611482394988032549 BNB
0xf743df7082075042a1ed988ff1ccb1cdacc38ec720af85ff8357a8324889f2e872245452021-05-07 21:31:08206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token1.383595294044638562 BNB
0xf743df7082075042a1ed988ff1ccb1cdacc38ec720af85ff8357a8324889f2e872245452021-05-07 21:31:08206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d91.383595294044638562 BNB
0xc487735845a4414c5451023fefc4751abff317b952f8f59a4bdadf2bc60d458772236422021-05-07 20:43:58206 days 21 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token35,424.734474010289185338 BNB
0xc487735845a4414c5451023fefc4751abff317b952f8f59a4bdadf2bc60d458772236422021-05-07 20:43:58206 days 21 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d935,424.734474010289185338 BNB
0xd4d69048474927870c954e8530c2cedc1b982242c6cfd070ecfa717eee6b30b672235782021-05-07 20:40:38206 days 22 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token89.680357287751418892 BNB
0xd4d69048474927870c954e8530c2cedc1b982242c6cfd070ecfa717eee6b30b672235782021-05-07 20:40:38206 days 22 hrs ago 0xd7d069493685a581d27824fc46eda46b7efc0063 0xb43410a271c71f2fda2d1ed9c1165e924be159d989.680357287751418892 BNB
0xc2f8272dd50deb7899c7e60be88666a2fe6bc999731b9e5757dc324f1efe168072235662021-05-07 20:39:59206 days 22 hrs ago 0xb43410a271c71f2fda2d1ed9c1165e924be159d9 Binance: WBNB Token44.481720657962476758 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyAlpacaWBNB

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-05
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IUniswapV2Router {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

interface Balancer {
    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn) external;

    function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut) external;

    function swapExactAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        address tokenOut,
        uint256 minAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter);

    function swapExactAmountOut(
        address tokenIn,
        uint256 maxAmountIn,
        address tokenOut,
        uint256 tokenAmountOut,
        uint256 maxPrice
    ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter);

    function joinswapExternAmountIn(
        address tokenIn,
        uint256 tokenAmountIn,
        uint256 minPoolAmountOut
    ) external returns (uint256 poolAmountOut);

    function exitswapPoolAmountIn(
        address tokenOut,
        uint256 poolAmountIn,
        uint256 minAmountOut
    ) external returns (uint256 tokenAmountOut);

    function getBalance(address token) external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function getTotalDenormalizedWeight() external view returns (uint256);

    function getNormalizedWeight(address token) external view returns (uint256);

    function getDenormalizedWeight(address token) external view returns (uint256);
}

interface IVSafeVault {
    function cap() external view returns (uint256);

    function getVaultMaster() external view returns (address);

    function balance() external view returns (uint256);

    function token() external view returns (address);

    function available() external view returns (uint256);

    function accept(address _input) external view returns (bool);

    function earn() external;

    function harvest(address reserve, uint256 amount) external;

    function addNewCompound(uint256, uint256) external;

    function withdraw_fee(uint256 _shares) external view returns (uint256);

    function calc_token_amount_deposit(uint256 _amount) external view returns (uint256);

    function calc_token_amount_withdraw(uint256 _shares) external view returns (uint256);

    function getPricePerFullShare() external view returns (uint256);

    function deposit(uint256 _amount, uint256 _min_mint_amount) external returns (uint256);

    function depositFor(
        address _account,
        address _to,
        uint256 _amount,
        uint256 _min_mint_amount
    ) external returns (uint256 _mint_amount);

    function withdraw(uint256 _shares, uint256 _min_output_amount) external returns (uint256);

    function withdrawFor(
        address _account,
        uint256 _shares,
        uint256 _min_output_amount
    ) external returns (uint256 _output_amount);

    function harvestStrategy(address _strategy) external;

    function harvestAllStrategies() external;
}

interface IController {
    function vault() external view returns (IVSafeVault);

    function getStrategyCount() external view returns (uint256);

    function strategies(uint256 _stratId)
        external
        view
        returns (
            address _strategy,
            uint256 _quota,
            uint256 _percent
        );

    function getBestStrategy() external view returns (address _strategy);

    function want() external view returns (address);

    function balanceOf() external view returns (uint256);

    function withdraw_fee(uint256 _amount) external view returns (uint256); // eg. 3CRV => pJar: 0.5% (50/10000)

    function investDisabled() external view returns (bool);

    function withdraw(uint256) external returns (uint256 _withdrawFee);

    function earn(address _token, uint256 _amount) external;

    function harvestStrategy(address _strategy) external;

    function harvestAllStrategies() external;

    function beforeDeposit() external;

    function withdrawFee(uint256) external view returns (uint256); // pJar: 0.5% (50/10000)
}

interface IVaultMaster {
    event UpdateBank(address bank, address vault);
    event UpdateVault(address vault, bool isAdd);
    event UpdateController(address controller, bool isAdd);
    event UpdateStrategy(address strategy, bool isAdd);

    function bank(address) external view returns (address);

    function isVault(address) external view returns (bool);

    function isController(address) external view returns (bool);

    function isStrategy(address) external view returns (bool);

    function slippage(address) external view returns (uint256);

    function convertSlippage(address _input, address _output) external view returns (uint256);

    function reserveFund() external view returns (address);

    function performanceReward() external view returns (address);

    function performanceFee() external view returns (uint256);

    function gasFee() external view returns (uint256);

    function withdrawalProtectionFee() external view returns (uint256);
}

interface IValueLiquidRouter {
    function factory() external view returns (address);

    function controller() external view returns (address);

    function formula() external view returns (address);

    function WETH() external view returns (address);

    function addLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address pair,
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function swapExactTokensForTokens(
        address tokenIn,
        address tokenOut,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        address tokenIn,
        address tokenOut,
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        address tokenOut,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        address tokenIn,
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        address tokenIn,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        address tokenOut,
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address tokenIn,
        address tokenOut,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        address tokenOut,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        address tokenIn,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function createPair(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint32 tokenWeightA,
        uint32 swapFee,
        address to
    ) external returns (uint256 liquidity);

    function createPairETH(
        address token,
        uint256 amountToken,
        uint32 tokenWeight,
        uint32 swapFee,
        address to
    ) external payable returns (uint256 liquidity);

    function removeLiquidity(
        address pair,
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address pair,
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address pair,
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address pair,
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address pair,
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);
}

interface IStrategy {
    event Deposit(address token, uint256 amount);
    event Withdraw(address token, uint256 amount, address to);
    event Harvest(uint256 priceShareBefore, uint256 priceShareAfter, address compoundToken, uint256 compoundBalance, uint256 reserveFundAmount);

    function baseToken() external view returns (address);

    function deposit() external;

    function withdraw(address _asset) external returns (uint256);

    function withdraw(uint256 _amount) external returns (uint256);

    function withdrawToController(uint256 _amount) external;

    function skim() external;

    function harvest(address _mergedStrategy) external;

    function withdrawAll() external returns (uint256);

    function balanceOf() external view returns (uint256);

    function beforeDeposit() external;
}

/*

 A strategy must implement the following calls;

 - deposit()
 - withdraw(address) must exclude any tokens used in the yield - Controller role - withdraw should return to Controller
 - withdraw(uint) - Controller | Vault role - withdraw should always return to vault
 - withdrawAll() - Controller | Vault role - withdraw should always return to vault
 - balanceOf()

 Where possible, strategies must remain as immutable as possible, instead of updating variables, we update the contract by linking it in the controller

*/
abstract contract StrategyBase is IStrategy {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;

    IUniswapV2Router public unirouter = IUniswapV2Router(0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F);
    IValueLiquidRouter public vSwaprouter = IValueLiquidRouter(0xb7e19a1188776f32E8C2B790D9ca578F2896Da7C);

    address public override baseToken;
    address public farmingToken;
    address public targetCompoundToken;

    address public governance;
    address public timelock = address(0x36fcf1c1525854b2d195F5d03d483f01549e06f2);

    address public controller;
    address public strategist;

    IVSafeVault public vault;
    IVaultMaster public vaultMaster;

    mapping(address => mapping(address => address[])) public uniswapPaths; // [input -> output] => uniswap_path
    mapping(address => mapping(address => address[])) public vSwapPairs; // [input -> output] => vswap pair

    uint256 public performanceFee = 0; //1400 <-> 14.0%
    uint256 public lastHarvestTimeStamp;
    bool internal _initialized = false;

    function initialize(
        address _baseToken,
        address _farmingToken,
        address _controller,
        address _targetCompoundToken
    ) internal {
        baseToken = _baseToken;
        farmingToken = _farmingToken;
        targetCompoundToken = _targetCompoundToken;
        controller = _controller;
        vault = IController(_controller).vault();
        require(address(vault) != address(0), "!vault");
        vaultMaster = IVaultMaster(vault.getVaultMaster());
        governance = msg.sender;
        strategist = msg.sender;

        if (farmingToken != address(0)) {
            IERC20(farmingToken).safeApprove(address(unirouter), type(uint256).max);
            IERC20(farmingToken).safeApprove(address(vSwaprouter), type(uint256).max);
        }
        if (targetCompoundToken != farmingToken) {
            IERC20(targetCompoundToken).safeApprove(address(unirouter), type(uint256).max);
            IERC20(targetCompoundToken).safeApprove(address(vSwaprouter), type(uint256).max);
        }
    }

    modifier onlyGovernance() {
        require(msg.sender == governance, "!governance");
        _;
    }

    modifier onlyStrategist() {
        require(msg.sender == strategist || msg.sender == governance, "!strategist");
        _;
    }

    modifier onlyAuthorized() {
        require(msg.sender == address(controller) || msg.sender == strategist || msg.sender == governance, "!authorized");
        _;
    }

    function getName() public pure virtual returns (string memory);

    function approveForSpender(
        IERC20 _token,
        address _spender,
        uint256 _amount
    ) external onlyGovernance {
        _token.safeApprove(_spender, _amount);
    }

    function setUnirouter(IUniswapV2Router _unirouter) external onlyGovernance {
        unirouter = _unirouter;
        if (farmingToken != address(0)) {
            IERC20(farmingToken).safeApprove(address(unirouter), type(uint256).max);
        }
        if (targetCompoundToken != farmingToken) IERC20(targetCompoundToken).safeApprove(address(unirouter), type(uint256).max);
    }

    function setVSwaprouter(IValueLiquidRouter _vSwaprouter) external onlyGovernance {
        vSwaprouter = _vSwaprouter;
        if (farmingToken != address(0)) {
            IERC20(farmingToken).safeApprove(address(vSwaprouter), type(uint256).max);
        }
        if (targetCompoundToken != farmingToken) IERC20(targetCompoundToken).safeApprove(address(vSwaprouter), type(uint256).max);
    }

    function setUnirouterPath(
        address _input,
        address _output,
        address[] memory _path
    ) public onlyStrategist {
        uniswapPaths[_input][_output] = _path;
    }

    function setVSwapPairs(
        address _input,
        address _output,
        address[] memory _pair
    ) public onlyStrategist {
        vSwapPairs[_input][_output] = _pair;
    }

    function beforeDeposit() external virtual override onlyAuthorized {}

    function deposit() public virtual override;

    function skim() external override {
        IERC20(baseToken).safeTransfer(controller, IERC20(baseToken).balanceOf(address(this)));
    }

    function withdraw(address _asset) external override onlyAuthorized returns (uint256 balance) {
        require(baseToken != _asset, "lpPair");

        balance = IERC20(_asset).balanceOf(address(this));
        IERC20(_asset).safeTransfer(controller, balance);
        emit Withdraw(_asset, balance, controller);
    }

    function withdrawToController(uint256 _amount) external override onlyAuthorized {
        require(controller != address(0), "!controller"); // additional protection so we don't burn the funds

        uint256 _balance = IERC20(baseToken).balanceOf(address(this));
        if (_balance < _amount) {
            _amount = _withdrawSome(_amount.sub(_balance));
            _amount = _amount.add(_balance);
        }

        IERC20(baseToken).safeTransfer(controller, _amount);
        emit Withdraw(baseToken, _amount, controller);
    }

    function _withdrawSome(uint256 _amount) internal virtual returns (uint256);

    // Withdraw partial funds, normally used with a vault withdrawal
    function withdraw(uint256 _amount) external override onlyAuthorized returns (uint256) {
        uint256 _balance = IERC20(baseToken).balanceOf(address(this));
        if (_balance < _amount) {
            _amount = _withdrawSome(_amount.sub(_balance));
            _amount = _amount.add(_balance);
        }

        IERC20(baseToken).safeTransfer(address(vault), _amount);
        emit Withdraw(baseToken, _amount, address(vault));
        return _amount;
    }

    // Withdraw all funds, normally used when migrating strategies
    function withdrawAll() external override onlyAuthorized returns (uint256 balance) {
        _withdrawAll();
        balance = IERC20(baseToken).balanceOf(address(this));
        IERC20(baseToken).safeTransfer(address(vault), balance);
        emit Withdraw(baseToken, balance, address(vault));
    }

    function _withdrawAll() internal virtual;

    function claimReward() public virtual;

    function _swapTokens(
        address _input,
        address _output,
        uint256 _amount
    ) internal {
        if (_input == _output) return;
        address[] memory path = vSwapPairs[_input][_output];
        if (path.length > 0) {
            // use vSwap
            vSwaprouter.swapExactTokensForTokens(_input, _output, _amount, 1, path, address(this), now.add(1800));
        } else {
            // use Uniswap
            path = uniswapPaths[_input][_output];
            if (path.length == 0) {
                // path: _input -> _output
                path = new address[](2);
                path[0] = _input;
                path[1] = _output;
            }
            unirouter.swapExactTokensForTokens(_amount, 1, path, address(this), now.add(1800));
        }
    }

    function _buyWantAndReinvest() internal virtual;

    function harvest(address _mergedStrategy) external virtual override {
        require(msg.sender == controller || msg.sender == strategist || msg.sender == governance, "!authorized");

        uint256 pricePerFullShareBefore = vault.getPricePerFullShare();
        claimReward();
        address _targetCompoundToken = targetCompoundToken;
        {
            address _farmingToken = farmingToken;
            if (_farmingToken != address(0)) {
                uint256 _farmingTokenBal = IERC20(_farmingToken).balanceOf(address(this));
                if (_farmingTokenBal > 0) {
                    _swapTokens(_farmingToken, _targetCompoundToken, _farmingTokenBal);
                }
            }
        }

        uint256 _targetCompoundBal = IERC20(_targetCompoundToken).balanceOf(address(this));

        if (_targetCompoundBal > 0) {
            if (_mergedStrategy != address(0)) {
                require(vaultMaster.isStrategy(_mergedStrategy), "!strategy"); // additional protection so we don't burn the funds
                IERC20(_targetCompoundToken).safeTransfer(_mergedStrategy, _targetCompoundBal); // forward WETH to one strategy and do the profit split all-in-one there (gas saving)
            } else {
                address _reserveFund = vaultMaster.reserveFund();
                address _performanceReward = vaultMaster.performanceReward();
                uint256 _performanceFee = getPerformanceFee();
                uint256 _gasFee = vaultMaster.gasFee();

                uint256 _reserveFundAmount;
                if (_performanceFee > 0 && _reserveFund != address(0)) {
                    _reserveFundAmount = _targetCompoundBal.mul(_performanceFee).div(10000);
                    IERC20(_targetCompoundToken).safeTransfer(_reserveFund, _reserveFundAmount);
                }

                if (_gasFee > 0 && _performanceReward != address(0)) {
                    uint256 _amount = _targetCompoundBal.mul(_gasFee).div(10000);
                    IERC20(_targetCompoundToken).safeTransfer(_performanceReward, _amount);
                }

                _buyWantAndReinvest();

                uint256 pricePerFullShareAfter = vault.getPricePerFullShare();
                emit Harvest(pricePerFullShareBefore, pricePerFullShareAfter, _targetCompoundToken, _targetCompoundBal, _reserveFundAmount);
            }
        }

        lastHarvestTimeStamp = block.timestamp;
    }

    // Only allows to earn some extra yield from non-core tokens
    function earnExtra(address _token) public {
        require(msg.sender == address(this) || msg.sender == controller || msg.sender == strategist || msg.sender == governance, "!authorized");
        require(address(_token) != address(baseToken), "token");
        uint256 _amount = IERC20(_token).balanceOf(address(this));
        _swapTokens(_token, targetCompoundToken, _amount);
    }

    function balanceOfPool() public view virtual returns (uint256);

    function balanceOf() public view override returns (uint256) {
        return IERC20(baseToken).balanceOf(address(this)).add(balanceOfPool());
    }

    function claimable_tokens() external view virtual returns (address[] memory, uint256[] memory);

    function claimable_token() external view virtual returns (address, uint256);

    function getTargetFarm() external view virtual returns (address);

    function getTargetPoolId() external view virtual returns (uint256);

    function getPerformanceFee() public view returns (uint256) {
        if (performanceFee > 0) {
            return performanceFee;
        } else {
            return vaultMaster.performanceFee();
        }
    }

    function setGovernance(address _governance) external onlyGovernance {
        governance = _governance;
    }

    function setTimelock(address _timelock) external {
        require(msg.sender == timelock, "!timelock");
        timelock = _timelock;
    }

    function setStrategist(address _strategist) external onlyGovernance {
        strategist = _strategist;
    }

    function setController(address _controller) external {
        require(msg.sender == governance, "!governance");
        controller = _controller;
        vault = IVSafeVault(IController(_controller).vault());
        require(address(vault) != address(0), "!vault");
        vaultMaster = IVaultMaster(vault.getVaultMaster());
    }

    function setPerformanceFee(uint256 _performanceFee) public onlyGovernance {
        performanceFee = _performanceFee;
    }

    function setFarmingToken(address _farmingToken) public onlyStrategist {
        farmingToken = _farmingToken;
    }

    function setTargetCompoundToken(address _targetCompoundToken) public onlyStrategist {
        targetCompoundToken = _targetCompoundToken;
    }

    function setApproveRouterForToken(address _token, uint256 _amount) public onlyStrategist {
        IERC20(_token).safeApprove(address(unirouter), _amount);
        IERC20(_token).safeApprove(address(vSwaprouter), _amount);
    }

    event ExecuteTransaction(address indexed target, uint256 value, string signature, bytes data);

    /**
     * @dev This is from Timelock contract.
     */
    function executeTransaction(
        address target,
        uint256 value,
        string memory signature,
        bytes memory data
    ) public returns (bytes memory) {
        require(msg.sender == timelock, "!timelock");

        bytes memory callData;

        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        // solium-disable-next-line security/no-call-value
        (bool success, bytes memory returnData) = target.call{value: value}(callData);
        require(success, string(abi.encodePacked(getName(), "::executeTransaction: Transaction execution reverted.")));

        emit ExecuteTransaction(target, value, signature, data);

        return returnData;
    }
}

interface IAlpacaFairLaunch {
    function deposit(
        address _for,
        uint256 _pid,
        uint256 _amount
    ) external;

    function withdraw(
        address _for,
        uint256 _pid,
        uint256 _amount
    ) external;

    function withdrawAll(address _for, uint256 _pid) external;

    function emergencyWithdraw(uint256 _pid) external;

    // Harvest ALPACAs earn from the pool.
    function harvest(uint256 _pid) external;

    function pendingAlpaca(uint256 _pid, address _user) external view returns (uint256);

    function userInfo(uint256 _pid, address _user)
        external
        view
        returns (
            uint256 amount,
            uint256 rewardDebt,
            uint256 bonusDebt,
            uint256 fundedBy
        );
}

interface IAlpacaToken {
    function canUnlockAmount(address _account) external view returns (uint256);

    function unlock() external;

    // @dev move ALPACAs with its locked funds to another account
    function transferAll(address _to) external;
}

interface IAlpacaVault {
    // @dev Add more token to the lending pool. Hope to get some good returns.
    function deposit(uint256 amountToken) external payable;

    // @dev Withdraw token from the lending and burning ibToken.
    function withdraw(uint256 share) external;

    function totalToken() external view returns (uint256);

    function totalSupply() external view returns (uint256);
}

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

/*

 A strategy must implement the following calls;

 - deposit()
 - withdraw(address) must exclude any tokens used in the yield - Controller role - withdraw should return to Controller
 - withdraw(uint) - Controller | Vault role - withdraw should always return to vault
 - withdrawAll() - Controller | Vault role - withdraw should always return to vault
 - balanceOf()

 Where possible, strategies must remain as immutable as possible, instead of updating variables, we update the contract by linking it in the controller

*/
contract StrategyAlpacaWBNB is StrategyBase {
    uint256 public blocksToReleaseCompound = 0; // disable

    address public alpacaVault = 0x532d5775cE71Cb967B78acbc290f80DF80A9bAa5;
    address public alpacaFarm = 0xeaE1425d8ed46554BF56968960e2E567B49D0BED;
    uint256 public poolFarmId;

    // baseToken       = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (USDC)
    // farmingToken = 0x0391d2021f89dc339f60fff84546ea23e337750f (ASC)
    // targetCompound = 0x0391d2021f89dc339f60fff84546ea23e337750f (USDC)
    function initialize(
        address _baseToken,
        address _farmingToken,
        address _alpacaVault,
        address _alpacaFarm,
        uint256 _pooFarmlId,
        address _targetCompound,
        address _controller
    ) public {
        require(_initialized == false, "Strategy: Initialize must be false.");
        initialize(_baseToken, _farmingToken, _controller, _targetCompound);
        alpacaVault = _alpacaVault;
        alpacaFarm = _alpacaFarm;
        poolFarmId = _pooFarmlId;

        IERC20(baseToken).safeApprove(alpacaVault, type(uint256).max);
        IERC20(alpacaVault).safeApprove(alpacaFarm, type(uint256).max);

        _initialized = true;
    }

    function getName() public pure override returns (string memory) {
        return "StrategyAlpacaWBNB";
    }

    function deposit() public override {
        address _alpacaVault = alpacaVault;
        uint256 _baseBal = IERC20(baseToken).balanceOf(address(this));
        if (_baseBal > 0) {
            IAlpacaVault(_alpacaVault).deposit(_baseBal);
            emit Deposit(baseToken, _baseBal);
        }
        _baseBal = IERC20(_alpacaVault).balanceOf(address(this));
        if (_baseBal > 0) {
            IAlpacaFairLaunch(alpacaFarm).deposit(address(this), poolFarmId, _baseBal);
            emit Deposit(_alpacaVault, _baseBal);
        }
    }

    function _withdrawSome(uint256 _amount) internal override returns (uint256) {
        uint256 pricePerFullShare = getAlpacaVaultPricePerFullShare();
        uint256 shareNeed = _amount.mul(1e18).div(pricePerFullShare);

        (uint256 stakedVaultBalance, , , ) = IAlpacaFairLaunch(alpacaFarm).userInfo(poolFarmId, address(this));
        uint256 currentVaultBalance = IERC20(alpacaVault).balanceOf(address(this));
        uint256 totalVaultBalance = stakedVaultBalance.add(currentVaultBalance);
        if (shareNeed > totalVaultBalance) {
            shareNeed = totalVaultBalance;
        }

        uint256 _before = IERC20(baseToken).balanceOf(address(this));
        if (shareNeed > currentVaultBalance) {
            IAlpacaFairLaunch(alpacaFarm).withdraw(address(this), poolFarmId, shareNeed.sub(currentVaultBalance));
        }
        uint256 _ethBefore = address(this).balance;
        IAlpacaVault(alpacaVault).withdraw(shareNeed);
        uint256 _ethAfter = address(this).balance;
        IWETH(baseToken).deposit{value: _ethAfter.sub(_ethBefore)}();

        uint256 _after = IERC20(baseToken).balanceOf(address(this));
        _amount = _after.sub(_before);

        return _amount;
    }

    function _withdrawAll() internal override {
        (uint256 stakedVaultBalance, , , ) = IAlpacaFairLaunch(alpacaFarm).userInfo(poolFarmId, address(this));
        if (stakedVaultBalance > 0) {
            IAlpacaFairLaunch(alpacaFarm).withdraw(address(this), poolFarmId, stakedVaultBalance);
        }
        uint256 currentVaultBalance = IERC20(alpacaVault).balanceOf(address(this));
        IAlpacaVault(alpacaVault).withdraw(currentVaultBalance);
        IWETH(baseToken).deposit{value: address(this).balance}();
    }

    function claimReward() public override {
        IAlpacaFairLaunch(alpacaFarm).harvest(poolFarmId);

        if (IAlpacaToken(farmingToken).canUnlockAmount(address(this)) > 0) {
            IAlpacaToken(farmingToken).unlock();
        }
    }

    function _buyWantAndReinvest() internal override {
        address _baseToken = baseToken;
        uint256 _targetCompoundBal = IERC20(targetCompoundToken).balanceOf(address(this));
        _swapTokens(targetCompoundToken, _baseToken, _targetCompoundBal);

        uint256 _after = IERC20(_baseToken).balanceOf(address(this));
        if (_after > 0) {
            vault.addNewCompound(_after, blocksToReleaseCompound);

            deposit();
        }
    }

    /// @dev Fallback function to accept ETH. Workers will send ETH back the pool.
    receive() external payable {}

    function balanceOfPool() public view override returns (uint256) {
        uint256 pricePerFullShare = getAlpacaVaultPricePerFullShare();
        (uint256 vaultBalance, , , ) = IAlpacaFairLaunch(alpacaFarm).userInfo(poolFarmId, address(this));
        vaultBalance = vaultBalance.add(IERC20(alpacaVault).balanceOf(address(this)));
        return vaultBalance.mul(pricePerFullShare).div(1e18);
    }

    function claimable_tokens() external view override returns (address[] memory farmToken, uint256[] memory totalDistributedValue) {
        farmToken = new address[](1);
        totalDistributedValue = new uint256[](1);
        farmToken[0] = farmingToken;
        totalDistributedValue[0] = IAlpacaFairLaunch(alpacaFarm).pendingAlpaca(poolFarmId, address(this));
    }

    function claimable_token() external view override returns (address farmToken, uint256 totalDistributedValue) {
        farmToken = farmingToken;
        totalDistributedValue = IAlpacaFairLaunch(alpacaFarm).pendingAlpaca(poolFarmId, address(this));
    }

    function getAlpacaVaultPricePerFullShare() public view returns (uint256) {
        IAlpacaVault _alpacaVault = IAlpacaVault(alpacaVault);
        return _alpacaVault.totalToken().mul(1e18).div(_alpacaVault.totalSupply());
    }

    function getTargetFarm() external view override returns (address) {
        return alpacaFarm;
    }

    function getTargetPoolId() external view override returns (uint256) {
        return poolFarmId;
    }

    /**
     * @dev Function that has to be called as part of strat migration. It sends all the available funds back to the
     * vault, ready to be migrated to the new strat.
     */
    function retireStrat() external onlyStrategist {
        IAlpacaFairLaunch(alpacaFarm).emergencyWithdraw(poolFarmId);
        uint256 stakedVaultBalance = IERC20(alpacaVault).balanceOf(address(this));
        IAlpacaVault(alpacaVault).withdraw(stakedVaultBalance);

        uint256 baseBal = IERC20(baseToken).balanceOf(address(this));
        IERC20(baseToken).transfer(address(vault), baseBal);
    }

    function wraptMissEther() external onlyGovernance {
        if (address(this).balance > 0) {
            IWETH(baseToken).deposit{value: address(this).balance}();
        }
    }

    function setBlocksToReleaseCompound(uint256 _blocks) external onlyStrategist {
        blocksToReleaseCompound = _blocks;
    }

    function setAlpacaFarmContract(address _alpacaFarm) external onlyStrategist {
        alpacaFarm = _alpacaFarm;

        IERC20(alpacaVault).safeApprove(alpacaFarm, type(uint256).max);
    }

    function setAlpacaVaultContract(address _alpacaVault) external onlyStrategist {
        alpacaVault = _alpacaVault;

        IERC20(baseToken).safeApprove(alpacaVault, type(uint256).max);
        IERC20(alpacaVault).safeApprove(alpacaFarm, type(uint256).max);
    }

    function setPoolFarmId(uint256 _poolId) external onlyStrategist {
        poolFarmId = _poolId;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priceShareBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceShareAfter","type":"uint256"},{"indexed":false,"internalType":"address","name":"compoundToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"compoundBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveFundAmount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"alpacaFarm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alpacaVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveForSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksToReleaseCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimable_token","outputs":[{"internalType":"address","name":"farmToken","type":"address"},{"internalType":"uint256","name":"totalDistributedValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimable_tokens","outputs":[{"internalType":"address[]","name":"farmToken","type":"address[]"},{"internalType":"uint256[]","name":"totalDistributedValue","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"earnExtra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAlpacaVaultPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPerformanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTargetFarm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTargetPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mergedStrategy","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_farmingToken","type":"address"},{"internalType":"address","name":"_alpacaVault","type":"address"},{"internalType":"address","name":"_alpacaFarm","type":"address"},{"internalType":"uint256","name":"_pooFarmlId","type":"uint256"},{"internalType":"address","name":"_targetCompound","type":"address"},{"internalType":"address","name":"_controller","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastHarvestTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFarmId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_alpacaFarm","type":"address"}],"name":"setAlpacaFarmContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_alpacaVault","type":"address"}],"name":"setAlpacaVaultContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setApproveRouterForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blocks","type":"uint256"}],"name":"setBlocksToReleaseCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_farmingToken","type":"address"}],"name":"setFarmingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"setPoolFarmId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_targetCompoundToken","type":"address"}],"name":"setTargetCompoundToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Router","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setUnirouterPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"address[]","name":"_pair","type":"address[]"}],"name":"setVSwapPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IValueLiquidRouter","name":"_vSwaprouter","type":"address"}],"name":"setVSwaprouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetCompoundToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniswapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vSwapPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vSwaprouter","outputs":[{"internalType":"contract IValueLiquidRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVSafeVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultMaster","outputs":[{"internalType":"contract IVaultMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wraptMissEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600080546001600160a01b03199081167305ff2b0db69458a0750badebc4f9e13add608c7f17825560018054821673b7e19a1188776f32e8c2b790d9ca578f2896da7c1790556006805482167336fcf1c1525854b2d195f5d03d483f01549e06f2179055600d829055600f805460ff1916905560109190915560118054821673532d5775ce71cb967b78acbc290f80df80a9baa51790556012805490911673eae1425d8ed46554bf56968960e2e567b49d0bed1790553480156100c657600080fd5b506156c780620000d76000396000f3fe6080604052600436106103905760003560e01c80635f8256b6116101dc578063c50ba73211610102578063d92f3d73116100a0578063f3668e111161006f578063f3668e1114610f0d578063f77c479114610f22578063fb61778714610f37578063fbfa77cf14610f4c57610397565b8063d92f3d7314610e34578063eda7e97d14610e67578063ee7f40a014610e91578063ef9e237914610eca57610397565b8063c7b9d530116100dc578063c7b9d53014610dad578063d0e30db014610de0578063d33219b414610df5578063d91b0cf514610e0a57610397565b8063c50ba73214610c97578063c55dae6314610d60578063c7610f7314610d7557610397565b8063974c52261161017a578063ad24dce711610149578063ad24dce714610c25578063b88a802f14610c3a578063bdacb30314610c4f578063c220359214610c8257610397565b8063974c522614610b9557806399be90dc14610baa578063a794577e14610bdd578063ab033ea914610bf257610397565b8063853828b6116101b6578063853828b614610b055780638778878214610b1a578063896333e014610b2f57806392eefe9b14610b6257610397565b80635f8256b614610a9357806370897b2314610ac6578063722713f714610af057610397565b8063235c3603116102c15780634853b4f51161025f57806351cff8d91161022e57806351cff8d914610a21578063573fef0a14610a545780635a87e94314610a695780635aa6e67514610a7e57610397565b80634853b4f5146109915780634d41f0c7146109c45780634e1e505b146109d95780634e53231b14610a0c57610397565b80632e1a7d4d1161029b5780632e1a7d4d146108fa57806335e94268146109245780633cb99bbf14610967578063465ffbea1461097c57610397565b8063235c36031461088d578063257ae0de146108a257806329bf0a25146108b757610397565b806317d7de7c1161032e5780631e018954116103085780631e018954146106355780631fe4a686146106e35780632224fa251461071457806322593b651461086357610397565b806317d7de7c14610581578063185fc2a41461060b5780631dd19cb41461062057610397565b80630faad6f01161036a5780630faad6f014610467578063115880861461048e578063115cce2b146104a35780631449c1cf1461056c57610397565b80630a30c2171461039c5780630e5c011e146103d15780630eaf43f21461040457610397565b3661039757005b600080fd5b3480156103a857600080fd5b506103cf600480360360208110156103bf57600080fd5b50356001600160a01b0316610f61565b005b3480156103dd57600080fd5b506103cf600480360360208110156103f457600080fd5b50356001600160a01b031661101a565b34801561041057600080fd5b506103cf600480360360e081101561042757600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a081013582169160c090910135166116a3565b34801561047357600080fd5b5061047c61179a565b60408051918252519081900360200190f35b34801561049a57600080fd5b5061047c6118ca565b3480156104af57600080fd5b506103cf600480360360608110156104c657600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156104fa57600080fd5b82018360208201111561050c57600080fd5b8035906020019184602083028401116401000000008311171561052e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a19945050505050565b34801561057857600080fd5b506103cf611ac8565b34801561058d57600080fd5b50610596611b99565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105d05781810151838201526020016105b8565b50505050905090810190601f1680156105fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061757600080fd5b5061047c611bd0565b34801561062c57600080fd5b506103cf611bd6565b34801561064157600080fd5b5061064a611c68565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561068e578181015183820152602001610676565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106cd5781810151838201526020016106b5565b5050505090500194505050505060405180910390f35b3480156106ef57600080fd5b506106f8611d8d565b604080516001600160a01b039092168252519081900360200190f35b34801561072057600080fd5b506105966004803603608081101561073757600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561076757600080fd5b82018360208201111561077957600080fd5b8035906020019184600183028401116401000000008311171561079b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156107ee57600080fd5b82018360208201111561080057600080fd5b8035906020019184600183028401116401000000008311171561082257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d9c945050505050565b34801561086f57600080fd5b506103cf6004803603602081101561088657600080fd5b5035612177565b34801561089957600080fd5b5061047c6121f0565b3480156108ae57600080fd5b506106f8612285565b3480156108c357600080fd5b506106f8600480360360608110156108da57600080fd5b506001600160a01b03813581169160208101359091169060400135612294565b34801561090657600080fd5b5061047c6004803603602081101561091d57600080fd5b50356122d6565b34801561093057600080fd5b506106f86004803603606081101561094757600080fd5b506001600160a01b0381358116916020810135909116906040013561247a565b34801561097357600080fd5b506106f861249f565b34801561098857600080fd5b506106f86124ae565b34801561099d57600080fd5b506103cf600480360360208110156109b457600080fd5b50356001600160a01b03166124bd565b3480156109d057600080fd5b506106f86125a8565b3480156109e557600080fd5b506103cf600480360360208110156109fc57600080fd5b50356001600160a01b03166125b7565b348015610a1857600080fd5b506106f861265a565b348015610a2d57600080fd5b5061047c60048036036020811015610a4457600080fd5b50356001600160a01b0316612669565b348015610a6057600080fd5b506103cf612839565b348015610a7557600080fd5b5061047c6128c2565b348015610a8a57600080fd5b506106f86128c8565b348015610a9f57600080fd5b506103cf60048036036020811015610ab657600080fd5b50356001600160a01b03166128d7565b348015610ad257600080fd5b506103cf60048036036020811015610ae957600080fd5b503561297a565b348015610afc57600080fd5b5061047c6129de565b348015610b1157600080fd5b5061047c612a6d565b348015610b2657600080fd5b5061047c612bed565b348015610b3b57600080fd5b506103cf60048036036020811015610b5257600080fd5b50356001600160a01b0316612bf3565b348015610b6e57600080fd5b506103cf60048036036020811015610b8557600080fd5b50356001600160a01b0316612cc8565b348015610ba157600080fd5b506106f8612ef3565b348015610bb657600080fd5b506103cf60048036036020811015610bcd57600080fd5b50356001600160a01b0316612f02565b348015610be957600080fd5b5061047c613092565b348015610bfe57600080fd5b506103cf60048036036020811015610c1557600080fd5b50356001600160a01b0316613098565b348015610c3157600080fd5b506106f8613126565b348015610c4657600080fd5b506103cf613135565b348015610c5b57600080fd5b506103cf60048036036020811015610c7257600080fd5b50356001600160a01b03166132b2565b348015610c8e57600080fd5b5061047c613340565b348015610ca357600080fd5b506103cf60048036036060811015610cba57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135640100000000811115610cee57600080fd5b820183602082011115610d0057600080fd5b80359060200191846020830284011164010000000083111715610d2257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613346945050505050565b348015610d6c57600080fd5b506106f86133ef565b348015610d8157600080fd5b50610d8a6133fe565b604080516001600160a01b03909316835260208301919091528051918290030190f35b348015610db957600080fd5b506103cf60048036036020811015610dd057600080fd5b50356001600160a01b03166134a5565b348015610dec57600080fd5b506103cf613533565b348015610e0157600080fd5b506106f86137ae565b348015610e1657600080fd5b506103cf60048036036020811015610e2d57600080fd5b50356137bd565b348015610e4057600080fd5b506103cf60048036036020811015610e5757600080fd5b50356001600160a01b0316613836565b348015610e7357600080fd5b506103cf60048036036020811015610e8a57600080fd5b5035613921565b348015610e9d57600080fd5b506103cf60048036036040811015610eb457600080fd5b506001600160a01b038135169060200135613b17565b348015610ed657600080fd5b506103cf60048036036060811015610eed57600080fd5b506001600160a01b03813581169160208101359091169060400135613bbf565b348015610f1957600080fd5b506106f8613c37565b348015610f2e57600080fd5b506106f8613c46565b348015610f4357600080fd5b506103cf613c55565b348015610f5857600080fd5b506106f8613f5b565b6008546001600160a01b0316331480610f8457506005546001600160a01b031633145b610fd5576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038381169190911791829055601154611017929082169116600019613f6a565b50565b6007546001600160a01b031633148061103d57506008546001600160a01b031633145b8061105257506005546001600160a01b031633145b6110a3576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b600954604080517f77c7b8fc00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916377c7b8fc916004808301926020929190829003018186803b15801561110157600080fd5b505afa158015611115573d6000803e3d6000fd5b505050506040513d602081101561112b57600080fd5b50519050611137613135565b6004546003546001600160a01b03918216911680156111e0576000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561119f57600080fd5b505afa1580156111b3573d6000803e3d6000fd5b505050506040513d60208110156111c957600080fd5b5051905080156111de576111de8284836140c4565b505b506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123057600080fd5b505afa158015611244573d6000803e3d6000fd5b505050506040513d602081101561125a57600080fd5b505190508015611699576001600160a01b0384161561136f57600a54604080517f2e8ebaae0000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291519190921691632e8ebaae916024808301926020929190829003018186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d602081101561130357600080fd5b5051611356576040805162461bcd60e51b815260206004820152600960248201527f2173747261746567790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61136a6001600160a01b03831685836145a7565b611699565b600a54604080517fb7f92b7100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163b7f92b71916004808301926020929190829003018186803b1580156113cd57600080fd5b505afa1580156113e1573d6000803e3d6000fd5b505050506040513d60208110156113f757600080fd5b5051600a54604080517fa0ee76b600000000000000000000000000000000000000000000000000000000815290519293506000926001600160a01b039092169163a0ee76b691600480820192602092909190829003018186803b15801561145d57600080fd5b505afa158015611471573d6000803e3d6000fd5b505050506040513d602081101561148757600080fd5b5051905060006114956121f0565b90506000600a60009054906101000a90046001600160a01b03166001600160a01b031663658612e96040518163ffffffff1660e01b815260040160206040518083038186803b1580156114e757600080fd5b505afa1580156114fb573d6000803e3d6000fd5b505050506040513d602081101561151157600080fd5b505190506000821580159061152e57506001600160a01b03851615155b1561155f576115496127106115438886614627565b90614689565b905061155f6001600160a01b03881686836145a7565b60008211801561157757506001600160a01b03841615155b156115a657600061158e6127106115438986614627565b90506115a46001600160a01b03891686836145a7565b505b6115ae6146cb565b600954604080517f77c7b8fc00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916377c7b8fc916004808301926020929190829003018186803b15801561160c57600080fd5b505afa158015611620573d6000803e3d6000fd5b505050506040513d602081101561163657600080fd5b5051604080518b8152602081018390526001600160a01b038b1681830152606081018a90526080810185905290519192507fb167b2e1723e57d1e0a6659b5b0e44052fd2b57a5953f0af3ed53b2e4cbf5ece919081900360a00190a15050505050505b505042600e555050565b600f5460ff16156116e55760405162461bcd60e51b815260040180806020018281038252602381526020018061560f6023913960400191505060405180910390fd5b6116f187878385614879565b601180546001600160a01b0380881673ffffffffffffffffffffffffffffffffffffffff199283161792839055601280548883169316929092179091556013859055600254611747929082169116600019613f6a565b601254601154611766916001600160a01b039182169116600019613f6a565b5050600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050565b601154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916118c39183916318160ddd916004808301926020929190829003018186803b1580156117fe57600080fd5b505afa158015611812573d6000803e3d6000fd5b505050506040513d602081101561182857600080fd5b5051604080517f626be567000000000000000000000000000000000000000000000000000000008152905161154391670de0b6b3a7640000916001600160a01b0387169163626be567916004808301926020929190829003018186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b505190614627565b9150505b90565b6000806118d561179a565b601254601354604080517f93f1a40b0000000000000000000000000000000000000000000000000000000081526004810192909252306024830152519293506000926001600160a01b03909216916393f1a40b91604480820192608092909190829003018186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d608081101561197357600080fd5b5051601154604080516370a0823160e01b815230600482015290519293506119fa926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156119c757600080fd5b505afa1580156119db573d6000803e3d6000fd5b505050506040513d60208110156119f157600080fd5b50518290614b1e565b9050611a12670de0b6b3a76400006115438385614627565b9250505090565b6008546001600160a01b0316331480611a3c57506005546001600160a01b031633145b611a8d576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600b6020908152604080832093861683529281529190208251611ac29284019061551a565b50505050565b6005546001600160a01b03163314611b27576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b4715611b9757600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b7d57600080fd5b505af1158015611b91573d6000803e3d6000fd5b50505050505b565b60408051808201909152601281527f5374726174656779416c7061636157424e420000000000000000000000000000602082015290565b60105481565b600754600254604080516370a0823160e01b81523060048201529051611b97936001600160a01b039081169316916370a08231916024808301926020929190829003018186803b158015611c2957600080fd5b505afa158015611c3d573d6000803e3d6000fd5b505050506040513d6020811015611c5357600080fd5b50516002546001600160a01b031691906145a7565b604080516001808252818301909252606091829190602080830190803683375050604080516001808252818301909252929450905060208083019080368337505060035484519293506001600160a01b031691849150600090611cc757fe5b6001600160a01b03928316602091820292909201810191909152601254601354604080517f94443b7300000000000000000000000000000000000000000000000000000000815260048101929092523060248301525191909316926394443b73926044808301939192829003018186803b158015611d4457600080fd5b505afa158015611d58573d6000803e3d6000fd5b505050506040513d6020811015611d6e57600080fd5b505181518290600090611d7d57fe5b6020026020010181815250509091565b6008546001600160a01b031681565b6006546060906001600160a01b03163314611dfe576040805162461bcd60e51b815260206004820152600960248201527f2174696d656c6f636b0000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6060835160001415611e11575081611ea9565b83805190602001208360405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b60208310611e715780518252601f199092019160209182019101611e52565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b60006060876001600160a01b031687846040518082805190602001908083835b60208310611ee85780518252601f199092019160209182019101611ec9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611f4a576040519150601f19603f3d011682016040523d82523d6000602084013e611f4f565b606091505b509150915081611f5d611b99565b6040516020018082805190602001908083835b60208310611f8f5780518252601f199092019160209182019101611f70565b6001836020036101000a038019825116818451168082178552505050505050905001806155b960359139603501915050604051602081830303815290604052906120575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561201c578181015183820152602001612004565b50505050905090810190601f1680156120495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156120cd5781810151838201526020016120b5565b50505050905090810190601f1680156120fa5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561212d578181015183820152602001612115565b50505050905090810190601f16801561215a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a2925050505b949350505050565b6008546001600160a01b031633148061219a57506005546001600160a01b031633145b6121eb576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b601055565b600d54600090156122045750600d546118c7565b600a60009054906101000a90046001600160a01b03166001600160a01b031663877887826040518163ffffffff1660e01b815260040160206040518083038186803b15801561225257600080fd5b505afa158015612266573d6000803e3d6000fd5b505050506040513d602081101561227c57600080fd5b505190506118c7565b6000546001600160a01b031681565b600c60205282600052604060002060205281600052604060002081815481106122b957fe5b6000918252602090912001546001600160a01b0316925083915050565b6007546000906001600160a01b03163314806122fc57506008546001600160a01b031633145b8061231157506005546001600160a01b031633145b612362576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123ad57600080fd5b505afa1580156123c1573d6000803e3d6000fd5b505050506040513d60208110156123d757600080fd5b5051905082811015612404576123f56123f08483614b78565b614bba565b92506124018382614b1e565b92505b600954600254612421916001600160a01b039182169116856145a7565b600254600954604080516001600160a01b03938416815260208101879052919092168183015290517f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b29181900360600190a15090919050565b600b60205282600052604060002060205281600052604060002081815481106122b957fe5b6011546001600160a01b031681565b6001546001600160a01b031681565b6005546001600160a01b0316331461251c576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691909117909155600354161561257157600154600354612571916001600160a01b039182169116600019613f6a565b6003546004546001600160a01b0390811691161461101757600154600454611017916001600160a01b039182169116600019613f6a565b6004546001600160a01b031681565b6008546001600160a01b03163314806125da57506005546001600160a01b031633145b61262b576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6012546001600160a01b031690565b6007546000906001600160a01b031633148061268f57506008546001600160a01b031633145b806126a457506005546001600160a01b031633145b6126f5576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546001600160a01b0383811691161415612758576040805162461bcd60e51b815260206004820152600660248201527f6c70506169720000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561279e57600080fd5b505afa1580156127b2573d6000803e3d6000fd5b505050506040513d60208110156127c857600080fd5b50516007549091506127e7906001600160a01b038481169116836145a7565b600754604080516001600160a01b0380861682526020820185905290921682820152517f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b29181900360600190a1919050565b6007546001600160a01b031633148061285c57506008546001600160a01b031633145b8061287157506005546001600160a01b031633145b611b97576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b60135481565b6005546001600160a01b031681565b6008546001600160a01b03163314806128fa57506005546001600160a01b031633145b61294b576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6005546001600160a01b031633146129d9576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d55565b6000612a686129eb6118ca565b600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a3657600080fd5b505afa158015612a4a573d6000803e3d6000fd5b505050506040513d6020811015612a6057600080fd5b505190614b1e565b905090565b6007546000906001600160a01b0316331480612a9357506008546001600160a01b031633145b80612aa857506005546001600160a01b031633145b612af9576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b612b01614f97565b600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612b4c57600080fd5b505afa158015612b60573d6000803e3d6000fd5b505050506040513d6020811015612b7657600080fd5b5051600954600254919250612b98916001600160a01b039081169116836145a7565b600254600954604080516001600160a01b03938416815260208101859052919092168183015290517f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b29181900360600190a190565b600d5481565b6008546001600160a01b0316331480612c1657506005546001600160a01b031633145b612c67576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038381169190911791829055600254612ca9929082169116600019613f6a565b601254601154611017916001600160a01b039182169116600019613f6a565b6005546001600160a01b03163314612d27576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155604080517ffbfa77cf000000000000000000000000000000000000000000000000000000008152905163fbfa77cf91600480820192602092909190829003018186803b158015612da157600080fd5b505afa158015612db5573d6000803e3d6000fd5b505050506040513d6020811015612dcb57600080fd5b50516009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03928316179081905516612e4a576040805162461bcd60e51b815260206004820152600660248201527f217661756c740000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600960009054906101000a90046001600160a01b03166001600160a01b03166392934f526040518163ffffffff1660e01b815260040160206040518083038186803b158015612e9857600080fd5b505afa158015612eac573d6000803e3d6000fd5b505050506040513d6020811015612ec257600080fd5b5051600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905550565b600a546001600160a01b031681565b33301480612f1a57506007546001600160a01b031633145b80612f2f57506008546001600160a01b031633145b80612f4457506005546001600160a01b031633145b612f95576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546001600160a01b0382811691161415612ff8576040805162461bcd60e51b815260206004820152600560248201527f746f6b656e000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561304757600080fd5b505afa15801561305b573d6000803e3d6000fd5b505050506040513d602081101561307157600080fd5b505160045490915061308e9083906001600160a01b0316836140c4565b5050565b600e5481565b6005546001600160a01b031633146130f7576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b601254601354604080517fddc632620000000000000000000000000000000000000000000000000000000081526004810192909252516001600160a01b039092169163ddc632629160248082019260009290919082900301818387803b15801561319e57600080fd5b505af11580156131b2573d6000803e3d6000fd5b5050600354604080517f202b17600000000000000000000000000000000000000000000000000000000081523060048201529051600094506001600160a01b03909216925063202b1760916024808301926020929190829003018186803b15801561321c57600080fd5b505afa158015613230573d6000803e3d6000fd5b505050506040513d602081101561324657600080fd5b50511115611b9757600360009054906101000a90046001600160a01b03166001600160a01b031663a69df4b56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561329e57600080fd5b505af1158015611ac2573d6000803e3d6000fd5b6006546001600160a01b03163314613311576040805162461bcd60e51b815260206004820152600960248201527f2174696d656c6f636b0000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60135490565b6008546001600160a01b031633148061336957506005546001600160a01b031633145b6133ba576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600c6020908152604080832093861683529281529190208251611ac29284019061551a565b6002546001600160a01b031681565b600354601254601354604080517f94443b730000000000000000000000000000000000000000000000000000000081526004810192909252306024830152516001600160a01b039384169360009316916394443b73916044808301926020929190829003018186803b15801561347357600080fd5b505afa158015613487573d6000803e3d6000fd5b505050506040513d602081101561349d57600080fd5b505191929050565b6005546001600160a01b03163314613504576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b6008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b601154600254604080516370a0823160e01b815230600482015290516001600160a01b039384169360009316916370a08231916024808301926020929190829003018186803b15801561358557600080fd5b505afa158015613599573d6000803e3d6000fd5b505050506040513d60208110156135af57600080fd5b50519050801561365e57816001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156135ff57600080fd5b505af1158015613613573d6000803e3d6000fd5b5050600254604080516001600160a01b0390921682526020820185905280517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c945091829003019150a15b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156136a457600080fd5b505afa1580156136b8573d6000803e3d6000fd5b505050506040513d60208110156136ce57600080fd5b50519050801561308e57601254601354604080517f0efe6a8b000000000000000000000000000000000000000000000000000000008152306004820152602481019290925260448201849052516001600160a01b0390921691630efe6a8b9160648082019260009290919082900301818387803b15801561374e57600080fd5b505af1158015613762573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9450908190039091019150a15050565b6006546001600160a01b031681565b6008546001600160a01b03163314806137e057506005546001600160a01b031633145b613831576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b601355565b6005546001600160a01b03163314613895576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038381169190911790915560035416156138ea576000546003546138ea916001600160a01b039182169116600019613f6a565b6003546004546001600160a01b0390811691161461101757600054600454611017916001600160a01b039182169116600019613f6a565b6007546001600160a01b031633148061394457506008546001600160a01b031633145b8061395957506005546001600160a01b031633145b6139aa576040805162461bcd60e51b815260206004820152600b60248201527f21617574686f72697a6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b6007546001600160a01b0316613a07576040805162461bcd60e51b815260206004820152600b60248201527f21636f6e74726f6c6c6572000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015613a5257600080fd5b505afa158015613a66573d6000803e3d6000fd5b505050506040513d6020811015613a7c57600080fd5b5051905081811015613aa457613a956123f08383614b78565b9150613aa18282614b1e565b91505b600754600254613ac1916001600160a01b039182169116846145a7565b600254600754604080516001600160a01b03938416815260208101869052919092168183015290517f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b29181900360600190a15050565b6008546001600160a01b0316331480613b3a57506005546001600160a01b031633145b613b8b576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b600054613ba5906001600160a01b03848116911683613f6a565b60015461308e906001600160a01b03848116911683613f6a565b6005546001600160a01b03163314613c1e576040805162461bcd60e51b815260206004820152600b60248201527f21676f7665726e616e6365000000000000000000000000000000000000000000604482015290519081900360640190fd5b613c326001600160a01b0384168383613f6a565b505050565b6012546001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b0316331480613c7857506005546001600160a01b031633145b613cc9576040805162461bcd60e51b815260206004820152600b60248201527f2173747261746567697374000000000000000000000000000000000000000000604482015290519081900360640190fd5b601254601354604080517f5312ea8e0000000000000000000000000000000000000000000000000000000081526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b158015613d3257600080fd5b505af1158015613d46573d6000803e3d6000fd5b5050601154604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015613d9757600080fd5b505afa158015613dab573d6000803e3d6000fd5b505050506040513d6020811015613dc157600080fd5b5051601154604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b158015613e2c57600080fd5b505af1158015613e40573d6000803e3d6000fd5b5050600254604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015613e9157600080fd5b505afa158015613ea5573d6000803e3d6000fd5b505050506040513d6020811015613ebb57600080fd5b5051600254600954604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015613f3157600080fd5b505af1158015613f45573d6000803e3d6000fd5b505050506040513d6020811015611ac257600080fd5b6009546001600160a01b031681565b8015806140095750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613fdb57600080fd5b505afa158015613fef573d6000803e3d6000fd5b505050506040513d602081101561400557600080fd5b5051155b6140445760405162461bcd60e51b815260040180806020018281038252603681526020018061565c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052613c3290849061522d565b816001600160a01b0316836001600160a01b031614156140e357613c32565b6001600160a01b038084166000908152600c6020908152604080832093861683529281529082902080548351818402810184019094528084526060939283018282801561415957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161413b575b5050505050905060008151111561431a57600180546001600160a01b03169063bff51d7190869086908690863061419242610708614b1e565b6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001876001600160a01b0316815260200186815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015614220578181015183820152602001614208565b5050505090500198505050505050505050600060405180830381600087803b15801561424b57600080fd5b505af115801561425f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561428857600080fd5b81019080805160405193929190846401000000008211156142a857600080fd5b9083019060208201858111156142bd57600080fd5b82518660208202830111640100000000821117156142da57600080fd5b82525081516020918201928201910280838360005b838110156143075781810151838201526020016142ef565b5050505090500160405250505050611ac2565b6001600160a01b038085166000908152600b602090815260408083209387168352928152908290208054835181840281018401909452808452909183018282801561438e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614370575b5050505050905080516000141561441c57604080516002808252606082018352909160208301908036833701905050905083816000815181106143cd57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816001815181106143fb57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6000546001600160a01b03166338ed1739836001843061443e42610708614b1e565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156144ae578181015183820152602001614496565b505050509050019650505050505050600060405180830381600087803b1580156144d757600080fd5b505af11580156144eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561451457600080fd5b810190808051604051939291908464010000000082111561453457600080fd5b90830190602082018581111561454957600080fd5b825186602082028301116401000000008211171561456657600080fd5b82525081516020918201928201910280838360005b8381101561459357818101518382015260200161457b565b505050509050016040525050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613c3290849061522d565b60008261463657506000614683565b8282028284828161464357fe5b04146146805760405162461bcd60e51b81526004018080602001828103825260218152602001806155ee6021913960400191505060405180910390fd5b90505b92915050565b600061468083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506152de565b60025460048054604080516370a0823160e01b81523093810193909352516001600160a01b03938416936000939216916370a08231916024808301926020929190829003018186803b15801561472057600080fd5b505afa158015614734573d6000803e3d6000fd5b505050506040513d602081101561474a57600080fd5b5051600454909150614766906001600160a01b031683836140c4565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156147b557600080fd5b505afa1580156147c9573d6000803e3d6000fd5b505050506040513d60208110156147df57600080fd5b505190508015613c3257600954601054604080517ff383dc55000000000000000000000000000000000000000000000000000000008152600481018590526024810192909252516001600160a01b039092169163f383dc559160448082019260009290919082900301818387803b15801561485957600080fd5b505af115801561486d573d6000803e3d6000fd5b50505050613c32613533565b600280546001600160a01b0380871673ffffffffffffffffffffffffffffffffffffffff1992831617909255600380548684169083161790556004805484841690831617815560078054938616939092168317909155604080517ffbfa77cf000000000000000000000000000000000000000000000000000000008152905163fbfa77cf92828101926020929190829003018186803b15801561491b57600080fd5b505afa15801561492f573d6000803e3d6000fd5b505050506040513d602081101561494557600080fd5b50516009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039283161790819055166149c4576040805162461bcd60e51b815260206004820152600660248201527f217661756c740000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600960009054906101000a90046001600160a01b03166001600160a01b03166392934f526040518163ffffffff1660e01b815260040160206040518083038186803b158015614a1257600080fd5b505afa158015614a26573d6000803e3d6000fd5b505050506040513d6020811015614a3c57600080fd5b5051600a80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560058054821633908117909155600880549092161790556003541615614ac857600054600354614aa9916001600160a01b039182169116600019613f6a565b600154600354614ac8916001600160a01b039182169116600019613f6a565b6003546004546001600160a01b03908116911614611ac257600054600454614aff916001600160a01b039182169116600019613f6a565b600154600454611ac2916001600160a01b039182169116600019613f6a565b600082820183811015614680576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061468083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615343565b600080614bc561179a565b90506000614bdf8261154386670de0b6b3a7640000614627565b601254601354604080517f93f1a40b0000000000000000000000000000000000000000000000000000000081526004810192909252306024830152519293506000926001600160a01b03909216916393f1a40b91604480820192608092909190829003018186803b158015614c5357600080fd5b505afa158015614c67573d6000803e3d6000fd5b505050506040513d6080811015614c7d57600080fd5b5051601154604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614cd057600080fd5b505afa158015614ce4573d6000803e3d6000fd5b505050506040513d6020811015614cfa57600080fd5b505190506000614d0a8383614b1e565b905080841115614d18578093505b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015614d6357600080fd5b505afa158015614d77573d6000803e3d6000fd5b505050506040513d6020811015614d8d57600080fd5b5051905082851115614e23576012546013546001600160a01b039091169063b5c5f672903090614dbd8988614b78565b6040518463ffffffff1660e01b815260040180846001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b158015614e0a57600080fd5b505af1158015614e1e573d6000803e3d6000fd5b505050505b601154604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101889052905147926001600160a01b031691632e1a7d4d91602480830192600092919082900301818387803b158015614e8857600080fd5b505af1158015614e9c573d6000803e3d6000fd5b50506002544792506001600160a01b0316905063d0e30db0614ebe8385614b78565b6040518263ffffffff1660e01b81526004016000604051808303818588803b158015614ee957600080fd5b505af1158015614efd573d6000803e3d6000fd5b5050600254604080516370a0823160e01b81523060048201529051600095506001600160a01b0390921693506370a082319250602480820192602092909190829003018186803b158015614f5057600080fd5b505afa158015614f64573d6000803e3d6000fd5b505050506040513d6020811015614f7a57600080fd5b50519050614f888185614b78565b9b9a5050505050505050505050565b601254601354604080517f93f1a40b0000000000000000000000000000000000000000000000000000000081526004810192909252306024830152516000926001600160a01b0316916393f1a40b916044808301926080929190829003018186803b15801561500557600080fd5b505afa158015615019573d6000803e3d6000fd5b505050506040513d608081101561502f57600080fd5b5051905080156150c857601254601354604080517fb5c5f672000000000000000000000000000000000000000000000000000000008152306004820152602481019290925260448201849052516001600160a01b039092169163b5c5f6729160648082019260009290919082900301818387803b1580156150af57600080fd5b505af11580156150c3573d6000803e3d6000fd5b505050505b601154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561511357600080fd5b505afa158015615127573d6000803e3d6000fd5b505050506040513d602081101561513d57600080fd5b5051601154604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156151a857600080fd5b505af11580156151bc573d6000803e3d6000fd5b50505050600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561521057600080fd5b505af1158015615224573d6000803e3d6000fd5b50505050505050565b6060615282826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661539d9092919063ffffffff16565b805190915015613c32578080602001905160208110156152a157600080fd5b5051613c325760405162461bcd60e51b815260040180806020018281038252602a815260200180615632602a913960400191505060405180910390fd5b6000818361532d5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561201c578181015183820152602001612004565b50600083858161533957fe5b0495945050505050565b600081848411156153955760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561201c578181015183820152602001612004565b505050900390565b606061216f848460008560606153b285615514565b615403576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106154425780518252601f199092019160209182019101615423565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146154a4576040519150601f19603f3d011682016040523d82523d6000602084013e6154a9565b606091505b509150915081156154bd57915061216f9050565b8051156154cd5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561201c578181015183820152602001612004565b3b151590565b82805482825590600052602060002090810192821561557c579160200282015b8281111561557c578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390911617825560209092019160019091019061553a565b5061558892915061558c565b5090565b5b8082111561558857805473ffffffffffffffffffffffffffffffffffffffff1916815560010161558d56fe3a3a657865637574655472616e73616374696f6e3a205472616e73616374696f6e20657865637574696f6e2072657665727465642e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753747261746567793a20496e697469616c697a65206d7573742062652066616c73652e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220f7232c5c0e5fdfed8f31ef27c3b094bbd7a58ea5eea329e2918f4caed755407c64736f6c634300060c0033

Deployed ByteCode Sourcemap

51828:7580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58822:194;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58822:194:0;-1:-1:-1;;;;;58822:194:0;;:::i;:::-;;43497:2466;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43497:2466:0;-1:-1:-1;;;;;43497:2466:0;;:::i;52353:702::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52353:702:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57429:230::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;56374:402;;;;;;;;;;;;;:::i;39952:195::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39952:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39952:195:0;;-1:-1:-1;39952:195:0;;-1:-1:-1;;;;;39952:195:0:i;58495:182::-;;;;;;;;;;;;;:::i;53063:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51879:42;;;;;;;;;;;;;:::i;40480:139::-;;;;;;;;;;;;;:::i;56784:372::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36916:25;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;36916:25:0;;;;;;;;;;;;;;48773:833;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48773:833:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48773:833:0;;;;;;;;-1:-1:-1;48773:833:0;;-1:-1:-1;;48773:833:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48773:833:0;;-1:-1:-1;48773:833:0;;-1:-1:-1;;;;;48773:833:0:i;58685:129::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58685:129:0;;:::i;46998:217::-;;;;;;;;;;;;;:::i;36435:96::-;;;;;;;;;;;;;:::i;37134:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37134:67:0;;;;;;;;;;;;;;;;;:::i;41666:472::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41666:472:0;;:::i;37021:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37021:69:0;;;;;;;;;;;;;;;;;:::i;51941:71::-;;;;;;;;;;;;;:::i;36538:102::-;;;;;;;;;;;;;:::i;39544:400::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39544:400:0;-1:-1:-1;;;;;39544:400:0;;:::i;36723:34::-;;;;;;;;;;;;;:::i;48091:117::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48091:117:0;-1:-1:-1;;;;;48091:117:0;;:::i;57667:102::-;;;;;;;;;;;;;:::i;40627:324::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40627:324:0;-1:-1:-1;;;;;40627:324:0;;:::i;40353:68::-;;;;;;;;;;;;;:::i;52096:25::-;;;;;;;;;;;;;:::i;36766:::-;;;;;;;;;;;;;:::i;48216:145::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48216:145:0;-1:-1:-1;;;;;48216:145:0;;:::i;47958:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47958:125:0;;:::i;46506:149::-;;;;;;;;;;;;;:::i;42214:304::-;;;;;;;;;;;;;:::i;37245:33::-;;;;;;;;;;;;;:::i;59024:270::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59024:270:0;-1:-1:-1;;;;;59024:270:0;;:::i;47612:338::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47612:338:0;-1:-1:-1;;;;;47612:338:0;;:::i;36981:31::-;;;;;;;;;;;;;:::i;46037:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46037:390:0;-1:-1:-1;;;;;46037:390:0;;:::i;37302:35::-;;;;;;;;;;;;;:::i;47223:111::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47223:111:0;-1:-1:-1;;;;;47223:111:0;;:::i;36689:27::-;;;;;;;;;;;;;:::i;55519:248::-;;;;;;;;;;;;;:::i;47342:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47342:143:0;-1:-1:-1;;;;;47342:143:0;;:::i;57777:104::-;;;;;;;;;;;;;:::i;40155:190::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40155:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40155:190:0;;-1:-1:-1;40155:190:0;;-1:-1:-1;;;;;40155:190:0:i;36649:33::-;;;;;;;;;;;;;:::i;57164:257::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;57164:257:0;;;;;;;;;;;;;;;;;;;;;47493:111;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47493:111:0;-1:-1:-1;;;;;47493:111:0;;:::i;53181:554::-;;;;;;;;;;;;;:::i;36798:77::-;;;;;;;;;;;;;:::i;59302:103::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59302:103:0;;:::i;39150:386::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39150:386:0;-1:-1:-1;;;;;39150:386:0;;:::i;40959:546::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40959:546:0;;:::i;48369:231::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48369:231:0;;;;;;;;:::i;38951:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38951:191:0;;;;;;;;;;;;;;;;;:::i;52019:70::-;;;;;;;;;;;;;:::i;36884:25::-;;;;;;;;;;;;;:::i;58078:409::-;;;;;;;;;;;;;:::i;36950:24::-;;;;;;;;;;;;;:::i;58822:194::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58909:10:::1;:24:::0;;-1:-1:-1;;58909:24:0::1;-1:-1:-1::0;;;;;58909:24:0;;::::1;::::0;;;::::1;::::0;;;;58953:11:::1;::::0;58946:62:::1;::::0;58953:11;;::::1;::::0;58978:10:::1;-1:-1:-1::0;;58946:31:0::1;:62::i;:::-;58822:194:::0;:::o;43497:2466::-;43598:10;;-1:-1:-1;;;;;43598:10:0;43584;:24;;:52;;-1:-1:-1;43626:10:0;;-1:-1:-1;;;;;43626:10:0;43612;:24;43584:52;:80;;;-1:-1:-1;43654:10:0;;-1:-1:-1;;;;;43654:10:0;43640;:24;43584:80;43576:104;;;;;-1:-1:-1;;;43576:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43727:5;;:28;;;;;;;;43693:31;;-1:-1:-1;;;;;43727:5:0;;:26;;:28;;;;;;;;;;;;;;:5;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43727:28:0;;-1:-1:-1;43766:13:0;:11;:13::i;:::-;43821:19;;43890:12;;-1:-1:-1;;;;;43821:19:0;;;;43890:12;43921:27;;43917:294;;43969:24;44003:13;-1:-1:-1;;;;;43996:31:0;;44036:4;43996:46;;;;;;;;;;;;;-1:-1:-1;;;;;43996:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43996:46:0;;-1:-1:-1;44065:20:0;;44061:135;;44110:66;44122:13;44137:20;44159:16;44110:11;:66::i;:::-;43917:294;;43497:2466;44234:26;44270:20;-1:-1:-1;;;;;44263:38:0;;44310:4;44263:53;;;;;;;;;;;;;-1:-1:-1;;;;;44263:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44263:53:0;;-1:-1:-1;44333:22:0;;44329:1576;;-1:-1:-1;;;;;44376:29:0;;;44372:1522;;44434:11;;:39;;;;;;-1:-1:-1;;;;;44434:39:0;;;;;;;;;:11;;;;;:22;;:39;;;;;;;;;;;;;;:11;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44434:39:0;44426:61;;;;;-1:-1:-1;;;44426:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44558:78;-1:-1:-1;;;;;44558:41:0;;44600:15;44617:18;44558:41;:78::i;:::-;44372:1522;;;44786:11;;:25;;;;;;;;44763:20;;-1:-1:-1;;;;;44786:11:0;;:23;;:25;;;;;;;;;;;;;;:11;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44786:25:0;44859:11;;:31;;;;;;;;44786:25;;-1:-1:-1;44830:26:0;;-1:-1:-1;;;;;44859:11:0;;;;:29;;:31;;;;;44786:25;;44859:31;;;;;;;;:11;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44859:31:0;;-1:-1:-1;44909:23:0;44935:19;:17;:19::i;:::-;44909:45;;44973:15;44991:11;;;;;;;;;-1:-1:-1;;;;;44991:11:0;-1:-1:-1;;;;;44991:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44991:20:0;;-1:-1:-1;45032:26:0;45081:19;;;;;:49;;-1:-1:-1;;;;;;45104:26:0;;;;45081:49;45077:267;;;45176:50;45220:5;45176:39;:18;45199:15;45176:22;:39::i;:::-;:43;;:50::i;:::-;45155:71;-1:-1:-1;45249:75:0;-1:-1:-1;;;;;45249:41:0;;45291:12;45155:71;45249:41;:75::i;:::-;45378:1;45368:7;:11;:47;;;;-1:-1:-1;;;;;;45383:32:0;;;;45368:47;45364:249;;;45440:15;45458:42;45494:5;45458:31;:18;45481:7;45458:22;:31::i;:42::-;45440:60;-1:-1:-1;45523:70:0;-1:-1:-1;;;;;45523:41:0;;45565:18;45440:60;45523:41;:70::i;:::-;45364:249;;45633:21;:19;:21::i;:::-;45708:5;;:28;;;;;;;;45675:30;;-1:-1:-1;;;;;45708:5:0;;:26;;:28;;;;;;;;;;;;;;:5;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45708:28:0;45760:118;;;;;;45708:28;45760:118;;;;;-1:-1:-1;;;;;45760:118:0;;;;;;;;;;;;;;;;;;;;45708:28;;-1:-1:-1;45760:118:0;;;;;;;;;;44372:1522;;;;;;;-1:-1:-1;;45940:15:0;45917:20;:38;-1:-1:-1;;43497:2466:0:o;52353:702::-;52622:12;;;;:21;52614:69;;;;-1:-1:-1;;;52614:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52694:67;52705:10;52717:13;52732:11;52745:15;52694:10;:67::i;:::-;52772:11;:26;;-1:-1:-1;;;;;52772:26:0;;;-1:-1:-1;;52772:26:0;;;;;;;;52809:10;:24;;;;;;;;;;;;;;52844:10;:24;;;52888:9;;52881:61;;52888:9;;;;52911:11;-1:-1:-1;;52881:29:0;:61::i;:::-;52985:10;;52960:11;;52953:62;;-1:-1:-1;;;;;52960:11:0;;;;52985:10;-1:-1:-1;;52953:31:0;:62::i;:::-;-1:-1:-1;;53028:12:0;:19;;;;53043:4;53028:19;;;-1:-1:-1;;;;;52353:702:0:o;57429:230::-;57554:11;;57624:26;;;;;;;;57493:7;;-1:-1:-1;;;;;57554:11:0;;57584:67;;57554:11;;57624:24;;:26;;;;;;;;;;;;;;57554:11;57624:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57624:26:0;57584:25;;;;;;;;:35;;57614:4;;-1:-1:-1;;;;;57584:23:0;;;;;:25;;;;;57624:26;;57584:25;;;;;;;:23;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57584:25:0;;:29;:35::i;:67::-;57577:74;;;57429:230;;:::o;56374:402::-;56429:7;56449:25;56477:33;:31;:33::i;:::-;56570:10;;56591;;56552:65;;;;;;;;;;;;;56611:4;56552:65;;;;;56449:61;;-1:-1:-1;56522:20:0;;-1:-1:-1;;;;;56570:10:0;;;;56552:38;;:65;;;;;;;;;;;;;;;56570:10;56552:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56552:65:0;56667:11;;56552:65;56660:44;;-1:-1:-1;;;56660:44:0;;56698:4;56660:44;;;;;;56552:65;;-1:-1:-1;56643:62:0;;-1:-1:-1;;;;;56667:11:0;;;;56660:29;;:44;;;;;56552:65;;56660:44;;;;;;;;56667:11;56660:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56660:44:0;56643:12;;:16;:62::i;:::-;56628:77;-1:-1:-1;56723:45:0;56763:4;56723:35;56628:77;56740:17;56723:16;:35::i;:45::-;56716:52;;;;56374:402;:::o;39952:195::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40102:20:0;;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;:37;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;39952:195:::0;;;:::o;58495:182::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58560:21:::1;:25:::0;58556:114:::1;;58608:9;;;;;;;;;-1:-1:-1::0;;;;;58608:9:0::1;-1:-1:-1::0;;;;;58602:24:0::1;;58634:21;58602:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;58556:114;58495:182::o:0;53063:110::-;53138:27;;;;;;;;;;;;;;;;;53063:110;:::o;51879:42::-;;;;:::o;40480:139::-;40556:10;;40575:9;;40568:42;;;-1:-1:-1;;;40568:42:0;;40604:4;40568:42;;;;;;40525:86;;-1:-1:-1;;;;;40556:10:0;;;;40575:9;;40568:27;;:42;;;;;;;;;;;;;;40575:9;40568:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40568:42:0;40532:9;;-1:-1:-1;;;;;40532:9:0;;40525:86;:30;:86::i;56784:372::-;56935:16;;;56949:1;56935:16;;;;;;;;;56844:26;;;;56935:16;;;;;;;;;;-1:-1:-1;;56986:16:0;;;57000:1;56986:16;;;;;;;;;56923:28;;-1:-1:-1;57000:1:0;-1:-1:-1;56986:16:0;;;;;;;;;-1:-1:-1;;57028:12:0;;57013;;56962:40;;-1:-1:-1;;;;;;57028:12:0;;57013;;-1:-1:-1;57028:12:0;;57013;;;;-1:-1:-1;;;;;57013:27:0;;;:12;;;;;;;;;;:27;;;;57096:10;;57122;;57078:70;;;;;;;;;;;;;57142:4;57078:70;;;;;57096:10;;;;;57078:43;;:70;;;;;57013:12;;57078:70;;;;;57096:10;57078:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57078:70:0;57051:24;;:21;;57073:1;;57051:24;;;;;;;;;:97;;;;;56784:372;;:::o;36916:25::-;;;-1:-1:-1;;;;;36916:25:0;;:::o;48773:833::-;48982:8;;48935:12;;-1:-1:-1;;;;;48982:8:0;48968:10;:22;48960:44;;;;;-1:-1:-1;;;48960:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49017:21;49061:9;49055:23;49082:1;49055:28;49051:179;;;-1:-1:-1;49111:4:0;49051:179;;;49199:9;49183:27;;;;;;49213:4;49159:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49159:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49148:70;;49051:179;49303:12;49317:23;49344:6;-1:-1:-1;;;;;49344:11:0;49363:5;49370:8;49344:35;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49344:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49302:77;;;;49398:7;49431:9;:7;:9::i;:::-;49414:84;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49414:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49390:110;;;;;-1:-1:-1;;;49390:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49537:6;-1:-1:-1;;;;;49518:50:0;;49545:5;49552:9;49563:4;49518:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49518:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49588:10;-1:-1:-1;;;48773:833:0;;;;;;;:::o;58685:129::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58773:23:::1;:33:::0;58685:129::o;46998:217::-;47072:14;;47048:7;;47072:18;47068:140;;-1:-1:-1;47114:14:0;;47107:21;;47068:140;47168:11;;;;;;;;;-1:-1:-1;;;;;47168:11:0;-1:-1:-1;;;;;47168:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47168:28:0;;-1:-1:-1;47161:35:0;;36435:96;;;-1:-1:-1;;;;;36435:96:0;;:::o;37134:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37134:67:0;;-1:-1:-1;37134:67:0;;-1:-1:-1;;37134:67:0:o;41666:472::-;38769:10;;41743:7;;-1:-1:-1;;;;;38769:10:0;38747;:33;;:61;;-1:-1:-1;38798:10:0;;-1:-1:-1;;;;;38798:10:0;38784;:24;38747:61;:89;;;-1:-1:-1;38826:10:0;;-1:-1:-1;;;;;38826:10:0;38812;:24;38747:89;38739:113;;;;;-1:-1:-1;;;38739:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41789:9:::1;::::0;41782:42:::1;::::0;;-1:-1:-1;;;41782:42:0;;41818:4:::1;41782:42;::::0;::::1;::::0;;;41763:16:::1;::::0;-1:-1:-1;;;;;41789:9:0::1;::::0;41782:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;41789:9;41782:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41782:42:0;;-1:-1:-1;41839:18:0;;::::1;41835:143;;;41884:36;41898:21;:7:::0;41910:8;41898:11:::1;:21::i;:::-;41884:13;:36::i;:::-;41874:46:::0;-1:-1:-1;41945:21:0::1;41874:46:::0;41957:8;41945:11:::1;:21::i;:::-;41935:31;;41835:143;42029:5;::::0;41997:9:::1;::::0;41990:55:::1;::::0;-1:-1:-1;;;;;41997:9:0;;::::1;::::0;42029:5:::1;42037:7:::0;41990:30:::1;:55::i;:::-;42070:9;::::0;42098:5:::1;::::0;42061:44:::1;::::0;;-1:-1:-1;;;;;42070:9:0;;::::1;42061:44:::0;;::::1;::::0;::::1;::::0;;;42098:5;;;::::1;42061:44:::0;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;42123:7:0;;41666:472;-1:-1:-1;41666:472:0:o;37021:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;51941:71;;;-1:-1:-1;;;;;51941:71:0;;:::o;36538:102::-;;;-1:-1:-1;;;;;36538:102:0;;:::o;39544:400::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39636:11:::1;:26:::0;;-1:-1:-1;;39636:26:0::1;-1:-1:-1::0;;;;;39636:26:0;;::::1;::::0;;;::::1;::::0;;;39677:12:::1;::::0;::::1;:26:::0;39673:132:::1;;39761:11;::::0;39727:12:::1;::::0;39720:73:::1;::::0;-1:-1:-1;;;;;39727:12:0;;::::1;::::0;39761:11:::1;-1:-1:-1::0;;39720:32:0::1;:73::i;:::-;39842:12;::::0;39819:19:::1;::::0;-1:-1:-1;;;;;39819:19:0;;::::1;39842:12:::0;::::1;39819:35;39815:121;;39904:11;::::0;39863:19:::1;::::0;39856:80:::1;::::0;-1:-1:-1;;;;;39863:19:0;;::::1;::::0;39904:11:::1;-1:-1:-1::0;;39856:39:0::1;:80::i;36723:34::-:0;;;-1:-1:-1;;;;;36723:34:0;;:::o;48091:117::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48172:12:::1;:28:::0;;-1:-1:-1;;48172:28:0::1;-1:-1:-1::0;;;;;48172:28:0;;;::::1;::::0;;;::::1;::::0;;48091:117::o;57667:102::-;57751:10;;-1:-1:-1;;;;;57751:10:0;57667:102;:::o;40627:324::-;38769:10;;40703:15;;-1:-1:-1;;;;;38769:10:0;38747;:33;;:61;;-1:-1:-1;38798:10:0;;-1:-1:-1;;;;;38798:10:0;38784;:24;38747:61;:89;;;-1:-1:-1;38826:10:0;;-1:-1:-1;;;;;38826:10:0;38812;:24;38747:89;38739:113;;;;;-1:-1:-1;;;38739:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40739:9:::1;::::0;-1:-1:-1;;;;;40739:19:0;;::::1;:9:::0;::::1;:19;;40731:38;;;::::0;;-1:-1:-1;;;40731:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40792:39;::::0;;-1:-1:-1;;;40792:39:0;;40825:4:::1;40792:39;::::0;::::1;::::0;;;-1:-1:-1;;;;;40792:24:0;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40792:39:0;40870:10:::1;::::0;40792:39;;-1:-1:-1;40842:48:0::1;::::0;-1:-1:-1;;;;;40842:27:0;;::::1;::::0;40870:10:::1;40792:39:::0;40842:27:::1;:48::i;:::-;40932:10;::::0;40906:37:::1;::::0;;-1:-1:-1;;;;;40906:37:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;40932:10;;::::1;40906:37:::0;;;;;::::1;::::0;;;;;;;::::1;40627:324:::0;;;:::o;40353:68::-;38769:10;;-1:-1:-1;;;;;38769:10:0;38747;:33;;:61;;-1:-1:-1;38798:10:0;;-1:-1:-1;;;;;38798:10:0;38784;:24;38747:61;:89;;;-1:-1:-1;38826:10:0;;-1:-1:-1;;;;;38826:10:0;38812;:24;38747:89;38739:113;;;;;-1:-1:-1;;;38739:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;52096:25;;;;:::o;36766:::-;;;-1:-1:-1;;;;;36766:25:0;;:::o;48216:145::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48311:19:::1;:42:::0;;-1:-1:-1;;48311:42:0::1;-1:-1:-1::0;;;;;48311:42:0;;;::::1;::::0;;;::::1;::::0;;48216:145::o;47958:125::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48043:14:::1;:32:::0;47958:125::o;46506:149::-;46557:7;46584:63;46631:15;:13;:15::i;:::-;46591:9;;46584:42;;;-1:-1:-1;;;46584:42:0;;46620:4;46584:42;;;;;;-1:-1:-1;;;;;46591:9:0;;;;46584:27;;:42;;;;;;;;;;;;;;;46591:9;46584:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46584:42:0;;:46;:63::i;:::-;46577:70;;46506:149;:::o;42214:304::-;38769:10;;42279:15;;-1:-1:-1;;;;;38769:10:0;38747;:33;;:61;;-1:-1:-1;38798:10:0;;-1:-1:-1;;;;;38798:10:0;38784;:24;38747:61;:89;;;-1:-1:-1;38826:10:0;;-1:-1:-1;;;;;38826:10:0;38812;:24;38747:89;38739:113;;;;;-1:-1:-1;;;38739:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42307:14:::1;:12;:14::i;:::-;42349:9;::::0;42342:42:::1;::::0;;-1:-1:-1;;;42342:42:0;;42378:4:::1;42342:42;::::0;::::1;::::0;;;-1:-1:-1;;;;;42349:9:0;;::::1;::::0;42342:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;42349:9;42342:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42342:42:0;42434:5:::1;::::0;42402:9:::1;::::0;42342:42;;-1:-1:-1;42395:55:0::1;::::0;-1:-1:-1;;;;;42402:9:0;;::::1;::::0;42434:5:::1;42342:42:::0;42395:30:::1;:55::i;:::-;42475:9;::::0;42503:5:::1;::::0;42466:44:::1;::::0;;-1:-1:-1;;;;;42475:9:0;;::::1;42466:44:::0;;::::1;::::0;::::1;::::0;;;42503:5;;;::::1;42466:44:::0;;;;;;::::1;::::0;;;;;;;::::1;42214:304:::0;:::o;37245:33::-;;;;:::o;59024:270::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59113:11:::1;:26:::0;;-1:-1:-1;;59113:26:0::1;-1:-1:-1::0;;;;;59113:26:0;;::::1;::::0;;;::::1;::::0;;;;59159:9:::1;::::0;59152:61:::1;::::0;59159:9;;::::1;::::0;59182:11:::1;-1:-1:-1::0;;59152:29:0::1;:61::i;:::-;59256:10;::::0;59231:11:::1;::::0;59224:62:::1;::::0;-1:-1:-1;;;;;59231:11:0;;::::1;::::0;59256:10:::1;-1:-1:-1::0;;59224:31:0::1;:62::i;47612:338::-:0;47698:10;;-1:-1:-1;;;;;47698:10:0;47684;:24;47676:48;;;;;-1:-1:-1;;;47676:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47735:10;:24;;-1:-1:-1;;47735:24:0;-1:-1:-1;;;;;47735:24:0;;;;;;;;47790:32;;;;;;;;:30;;:32;;;;;;;;;;;;;;;47735:24;47790:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47790:32:0;47770:5;:53;;-1:-1:-1;;47770:53:0;-1:-1:-1;;;;;47770:53:0;;;;;;;;47850:5;47834:47;;;;;-1:-1:-1;;;47834:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47919:5;;;;;;;;;-1:-1:-1;;;;;47919:5:0;-1:-1:-1;;;;;47919:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47919:22:0;47892:11;:50;;-1:-1:-1;;47892:50:0;-1:-1:-1;;;;;47892:50:0;;;;;;;;;-1:-1:-1;47612:338:0:o;36981:31::-;;;-1:-1:-1;;;;;36981:31:0;;:::o;46037:390::-;46098:10;46120:4;46098:27;;:55;;-1:-1:-1;46143:10:0;;-1:-1:-1;;;;;46143:10:0;46129;:24;46098:55;:83;;;-1:-1:-1;46171:10:0;;-1:-1:-1;;;;;46171:10:0;46157;:24;46098:83;:111;;;-1:-1:-1;46199:10:0;;-1:-1:-1;;;;;46199:10:0;46185;:24;46098:111;46090:135;;;;;-1:-1:-1;;;46090:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46271:9;;-1:-1:-1;;;;;46244:37:0;;;46271:9;;46244:37;;46236:55;;;;;-1:-1:-1;;;46236:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46302:15;46327:6;-1:-1:-1;;;;;46320:24:0;;46353:4;46320:39;;;;;;;;;;;;;-1:-1:-1;;;;;46320:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46320:39:0;46390:19;;46320:39;;-1:-1:-1;46370:49:0;;46382:6;;-1:-1:-1;;;;;46390:19:0;46320:39;46370:11;:49::i;:::-;46037:390;;:::o;37302:35::-;;;;:::o;47223:111::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47302:10:::1;:24:::0;;-1:-1:-1;;47302:24:0::1;-1:-1:-1::0;;;;;47302:24:0;;;::::1;::::0;;;::::1;::::0;;47223:111::o;36689:27::-;;;-1:-1:-1;;;;;36689:27:0;;:::o;55519:248::-;55587:10;;55607;;55569:49;;;;;;;;;;;;;;-1:-1:-1;;;;;55587:10:0;;;;55569:37;;:49;;;;;55587:10;;55569:49;;;;;;;;55587:10;;55569:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55648:12:0;;55635:57;;;;;;55686:4;55635:57;;;;;;55695:1;;-1:-1:-1;;;;;;55648:12:0;;;;-1:-1:-1;55635:42:0;;:57;;;;;;;;;;;;;;55648:12;55635:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55635:57:0;:61;55631:129;;;55726:12;;;;;;;;;-1:-1:-1;;;;;55726:12:0;-1:-1:-1;;;;;55713:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47342:143;47424:8;;-1:-1:-1;;;;;47424:8:0;47410:10;:22;47402:44;;;;;-1:-1:-1;;;47402:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47457:8;:20;;-1:-1:-1;;47457:20:0;-1:-1:-1;;;;;47457:20:0;;;;;;;;;;47342:143::o;57777:104::-;57863:10;;57777:104;:::o;40155:190::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40302:18:0;;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;:27;;::::1;::::0;;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;36649:33::-:0;;;-1:-1:-1;;;;;36649:33:0;;:::o;57164:257::-;57296:12;;57361:10;;57387;;57343:70;;;;;;;;;;;;;57407:4;57343:70;;;;;-1:-1:-1;;;;;57296:12:0;;;;57223:17;;57361:10;;57343:43;;:70;;;;;;;;;;;;;;57361:10;57343:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57343:70:0;57164:257;;;-1:-1:-1;57164:257:0:o;47493:111::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47572:10:::1;:24:::0;;-1:-1:-1;;47572:24:0::1;-1:-1:-1::0;;;;;47572:24:0;;;::::1;::::0;;;::::1;::::0;;47493:111::o;53181:554::-;53250:11;;53298:9;;53291:42;;;-1:-1:-1;;;53291:42:0;;53327:4;53291:42;;;;;;-1:-1:-1;;;;;53250:11:0;;;;53227:20;;53298:9;;53291:27;;:42;;;;;;;;;;;;;;53298:9;53291:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53291:42:0;;-1:-1:-1;53348:12:0;;53344:137;;53390:12;-1:-1:-1;;;;;53377:34:0;;53412:8;53377:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53449:9:0;;53441:28;;;-1:-1:-1;;;;;53449:9:0;;;53441:28;;;;;;;;;;;;-1:-1:-1;53441:28:0;;;;;;-1:-1:-1;53441:28:0;53344:137;53502:45;;;-1:-1:-1;;;53502:45:0;;53541:4;53502:45;;;;;;-1:-1:-1;;;;;53502:30:0;;;;;:45;;;;;;;;;;;;;;:30;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53502:45:0;;-1:-1:-1;53562:12:0;;53558:170;;53609:10;;53644;;53591:74;;;;;;53637:4;53591:74;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53609:10:0;;;;53591:37;;:74;;;;;53609:10;;53591:74;;;;;;;;53609:10;;53591:74;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53685:31:0;;;-1:-1:-1;;;;;53685:31:0;;;;;;;;;;;;;;-1:-1:-1;53685:31:0;;;;;;;;-1:-1:-1;53685:31:0;53181:554;;:::o;36798:77::-;;;-1:-1:-1;;;;;36798:77:0;;:::o;59302:103::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59377:10:::1;:20:::0;59302:103::o;39150:386::-;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39236:9:::1;:22:::0;;-1:-1:-1;;39236:22:0::1;-1:-1:-1::0;;;;;39236:22:0;;::::1;::::0;;;::::1;::::0;;;39273:12:::1;::::0;::::1;:26:::0;39269:130:::1;;39357:9;::::0;39323:12:::1;::::0;39316:71:::1;::::0;-1:-1:-1;;;;;39323:12:0;;::::1;::::0;39357:9:::1;-1:-1:-1::0;;39316:32:0::1;:71::i;:::-;39436:12;::::0;39413:19:::1;::::0;-1:-1:-1;;;;;39413:19:0;;::::1;39436:12:::0;::::1;39413:35;39409:119;;39498:9;::::0;39457:19:::1;::::0;39450:78:::1;::::0;-1:-1:-1;;;;;39457:19:0;;::::1;::::0;39498:9:::1;-1:-1:-1::0;;39450:39:0::1;:78::i;40959:546::-:0;38769:10;;-1:-1:-1;;;;;38769:10:0;38747;:33;;:61;;-1:-1:-1;38798:10:0;;-1:-1:-1;;;;;38798:10:0;38784;:24;38747:61;:89;;;-1:-1:-1;38826:10:0;;-1:-1:-1;;;;;38826:10:0;38812;:24;38747:89;38739:113;;;;;-1:-1:-1;;;38739:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41058:10:::1;::::0;-1:-1:-1;;;;;41058:10:0::1;41050:48;;;::::0;;-1:-1:-1;;;41050:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41189:9;::::0;41182:42:::1;::::0;;-1:-1:-1;;;41182:42:0;;41218:4:::1;41182:42;::::0;::::1;::::0;;;41163:16:::1;::::0;-1:-1:-1;;;;;41189:9:0::1;::::0;41182:27:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;41189:9;41182:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41182:42:0;;-1:-1:-1;41239:18:0;;::::1;41235:143;;;41284:36;41298:21;:7:::0;41310:8;41298:11:::1;:21::i;41284:36::-;41274:46:::0;-1:-1:-1;41345:21:0::1;41274:46:::0;41357:8;41345:11:::1;:21::i;:::-;41335:31;;41235:143;41421:10;::::0;41397:9:::1;::::0;41390:51:::1;::::0;-1:-1:-1;;;;;41397:9:0;;::::1;::::0;41421:10:::1;41433:7:::0;41390:30:::1;:51::i;:::-;41466:9;::::0;41486:10:::1;::::0;41457:40:::1;::::0;;-1:-1:-1;;;;;41466:9:0;;::::1;41457:40:::0;;::::1;::::0;::::1;::::0;;;41486:10;;;::::1;41457:40:::0;;;;;;::::1;::::0;;;;;;;::::1;38863:1;40959:546:::0;:::o;48369:231::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48504:9:::1;::::0;48469:55:::1;::::0;-1:-1:-1;;;;;48469:26:0;;::::1;::::0;48504:9:::1;48516:7:::0;48469:26:::1;:55::i;:::-;48570:11;::::0;48535:57:::1;::::0;-1:-1:-1;;;;;48535:26:0;;::::1;::::0;48570:11:::1;48584:7:::0;48535:26:::1;:57::i;38951:191::-:0;38507:10;;-1:-1:-1;;;;;38507:10:0;38493;:24;38485:48;;;;;-1:-1:-1;;;38485:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39097:37:::1;-1:-1:-1::0;;;;;39097:18:0;::::1;39116:8:::0;39126:7;39097:18:::1;:37::i;:::-;38951:191:::0;;;:::o;52019:70::-;;;-1:-1:-1;;;;;52019:70:0;;:::o;36884:25::-;;;-1:-1:-1;;;;;36884:25:0;;:::o;58078:409::-;38620:10;;-1:-1:-1;;;;;38620:10:0;38606;:24;;:52;;-1:-1:-1;38648:10:0;;-1:-1:-1;;;;;38648:10:0;38634;:24;38606:52;38598:76;;;;;-1:-1:-1;;;38598:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58154:10:::1;::::0;58184::::1;::::0;58136:59:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;58154:10:0;;::::1;::::0;58136:47:::1;::::0;:59;;;;;58154:10:::1;::::0;58136:59;;;;;;;;58154:10;;58136:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;58242:11:0::1;::::0;58235:44:::1;::::0;;-1:-1:-1;;;58235:44:0;;58273:4:::1;58235:44;::::0;::::1;::::0;;;58206:26:::1;::::0;-1:-1:-1;;;;;;58242:11:0;;::::1;::::0;-1:-1:-1;58235:29:0::1;::::0;:44;;;;;::::1;::::0;;;;;;;;58242:11;58235:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;58235:44:0;58303:11:::1;::::0;58290:54:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;58235:44;;-1:-1:-1;;;;;;58303:11:0;;::::1;::::0;58290:34:::1;::::0;:54;;;;;58303:11:::1;::::0;58290:54;;;;;;;;58303:11;;58290:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;58382:9:0::1;::::0;58375:42:::1;::::0;;-1:-1:-1;;;58375:42:0;;58411:4:::1;58375:42;::::0;::::1;::::0;;;58357:15:::1;::::0;-1:-1:-1;;;;;;58382:9:0;;::::1;::::0;-1:-1:-1;58375:27:0::1;::::0;:42;;;;;::::1;::::0;;;;;;;;58382:9;58375:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;58375:42:0;58435:9:::1;::::0;58463:5:::1;::::0;58428:51:::1;::::0;;;;;-1:-1:-1;;;;;58463:5:0;;::::1;58428:51;::::0;::::1;::::0;;;;;;;;;58375:42;;-1:-1:-1;58435:9:0;::::1;::::0;58428:26:::1;::::0;:51;;;;;58375:42:::1;::::0;58428:51;;;;;;;;58435:9:::1;::::0;58428:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;36950:24:::0;;;-1:-1:-1;;;;;36950:24:0;;:::o;15642:633::-;16046:10;;;16045:62;;-1:-1:-1;16062:39:0;;;;;;16086:4;16062:39;;;;-1:-1:-1;;;;;16062:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16062:39:0;:44;16045:62;16037:129;;;;-1:-1:-1;;;16037:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16204:62;;;-1:-1:-1;;;;;16204:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16227:22;16204:62;;;16177:90;;16197:5;;16177:19;:90::i;42621:812::-;42760:7;-1:-1:-1;;;;;42750:17:0;:6;-1:-1:-1;;;;;42750:17:0;;42746:30;;;42769:7;;42746:30;-1:-1:-1;;;;;42810:18:0;;;;;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;42786:51;;;;;;;;;;;;;;;;;:21;;:51;;;42810:27;42786:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42786:51:0;;;;;;;;;;;;;;;;;;;;;;;42866:1;42852:4;:11;:15;42848:578;;;42910:11;;;-1:-1:-1;;;;;42910:11:0;;:36;;42947:6;;42955:7;;42964;;42976:4;42990;42997:13;:3;43005:4;42997:7;:13::i;:::-;42910:101;;;;;;;;;;;;;-1:-1:-1;;;;;42910:101:0;;;;;;-1:-1:-1;;;;;42910:101:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42910:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42910:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42910:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42848:578;;;-1:-1:-1;;;;;43079:20:0;;;;;;;:12;:20;;;;;;;;:29;;;;;;;;;;;;43072:36;;;;;;;;;;;;;;;;;43079:29;;43072:36;;43079:29;43072:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43072:36:0;;;;;;;;;;;;;;;;;;;;;;;43127:4;:11;43142:1;43127:16;43123:195;;;43215:16;;;43229:1;43215:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43215:16:0;43208:23;;43260:6;43250:4;43255:1;43250:7;;;;;;;;;;;;;:16;-1:-1:-1;;;;;43250:16:0;;;-1:-1:-1;;;;;43250:16:0;;;;;43295:7;43285:4;43290:1;43285:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;43285:17:0;;;-1:-1:-1;;;;;43285:17:0;;;;;43123:195;43332:9;;-1:-1:-1;;;;;43332:9:0;:34;43367:7;43332:9;43379:4;43393;43400:13;:3;43408:4;43400:7;:13::i;:::-;43332:82;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43332:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43332:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43332:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42621:812;;;;:::o;14906:211::-;15050:58;;;-1:-1:-1;;;;;15050:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15073:23;15050:58;;;15023:86;;15043:5;;15023:19;:86::i;5037:471::-;5095:7;5340:6;5336:47;;-1:-1:-1;5370:1:0;5363:8;;5336:47;5407:5;;;5411:1;5407;:5;:1;5431:5;;;;;:10;5423:56;;;;-1:-1:-1;;;5423:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5499:1;-1:-1:-1;5037:471:0;;;;;:::o;5984:132::-;6042:7;6069:39;6073:1;6076;6069:39;;;;;;;;;;;;;;;;;:3;:39::i;55775:470::-;55856:9;;55912:19;;;55905:52;;;-1:-1:-1;;;55905:52:0;;55951:4;55905:52;;;;;;;;-1:-1:-1;;;;;55856:9:0;;;;55835:18;;55912:19;;;55905:37;;:52;;;;;;;;;;;;;;55912:19;55905:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55905:52:0;55980:19;;55905:52;;-1:-1:-1;55968:64:0;;-1:-1:-1;;;;;55980:19:0;56001:10;55905:52;55968:11;:64::i;:::-;56045:14;56069:10;-1:-1:-1;;;;;56062:28:0;;56099:4;56062:43;;;;;;;;;;;;;-1:-1:-1;;;;;56062:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56062:43:0;;-1:-1:-1;56120:10:0;;56116:122;;56147:5;;56176:23;;56147:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56147:5:0;;;;:20;;:53;;;;;:5;;:53;;;;;;;;:5;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56217:9;:7;:9::i;37387:1053::-;37564:9;:22;;-1:-1:-1;;;;;37564:22:0;;;-1:-1:-1;;37564:22:0;;;;;;;37597:12;:28;;;;;;;;;;;37636:19;:42;;;;;;;;;;;37689:10;:24;;;;;;;;;;;;;;37732:32;;;;;;;;:30;;:32;;;;;;;;;;;;;37689:24;37732:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37732:32:0;37724:5;:40;;-1:-1:-1;;37724:40:0;-1:-1:-1;;;;;37724:40:0;;;;;;;;37791:5;37775:47;;;;;-1:-1:-1;;;37775:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37860:5;;;;;;;;;-1:-1:-1;;;;;37860:5:0;-1:-1:-1;;;;;37860:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37860:22:0;37833:11;:50;;-1:-1:-1;;;;;37833:50:0;;;-1:-1:-1;;37833:50:0;;;;;;;37894:10;:23;;;;37907:10;37894:23;;;;;;37928:10;:23;;;;;;;;37968:12;;;:26;37964:218;;38052:9;;38018:12;;38011:71;;-1:-1:-1;;;;;38018:12:0;;;;38052:9;-1:-1:-1;;38011:32:0;:71::i;:::-;38138:11;;38104:12;;38097:73;;-1:-1:-1;;;;;38104:12:0;;;;38138:11;-1:-1:-1;;38097:32:0;:73::i;:::-;38219:12;;38196:19;;-1:-1:-1;;;;;38196:19:0;;;38219:12;;38196:35;38192:241;;38296:9;;38255:19;;38248:78;;-1:-1:-1;;;;;38255:19:0;;;;38296:9;-1:-1:-1;;38248:39:0;:78::i;:::-;38389:11;;38348:19;;38341:80;;-1:-1:-1;;;;;38348:19:0;;;;38389:11;-1:-1:-1;;38341:39:0;:80::i;3649:181::-;3707:7;3739:5;;;3763:6;;;;3755:46;;;;;-1:-1:-1;;;3755:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4113:136;4171:7;4198:43;4202:1;4205;4198:43;;;;;;;;;;;;;;;;;:3;:43::i;53743:1229::-;53810:7;53830:25;53858:33;:31;:33::i;:::-;53830:61;-1:-1:-1;53902:17:0;53922:40;53830:61;53922:17;:7;53934:4;53922:11;:17::i;:40::-;54030:10;;54051;;54012:65;;;;;;;;;;;;;54071:4;54012:65;;;;;53902:60;;-1:-1:-1;53976:26:0;;-1:-1:-1;;;;;54030:10:0;;;;54012:38;;:65;;;;;;;;;;;;;;;54030:10;54012:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54012:65:0;54125:11;;54012:65;54118:44;;-1:-1:-1;;;54118:44:0;;54156:4;54118:44;;;;;;54012:65;;-1:-1:-1;54088:27:0;;-1:-1:-1;;;;;54125:11:0;;;;54118:29;;:44;;;;;54012:65;;54118:44;;;;;;;;54125:11;54118:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54118:44:0;;-1:-1:-1;54173:25:0;54201:43;:18;54118:44;54201:22;:43::i;:::-;54173:71;;54271:17;54259:9;:29;54255:91;;;54317:17;54305:29;;54255:91;54383:9;;54376:42;;;-1:-1:-1;;;54376:42:0;;54412:4;54376:42;;;;;;54358:15;;-1:-1:-1;;;;;54383:9:0;;54376:27;;:42;;;;;;;;;;;;;;54383:9;54376:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54376:42:0;;-1:-1:-1;54433:31:0;;;54429:165;;;54499:10;;54535;;-1:-1:-1;;;;;54499:10:0;;;;54481:38;;54528:4;;54547:34;:9;54561:19;54547:13;:34::i;:::-;54481:101;;;;;;;;;;;;;-1:-1:-1;;;;;54481:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54429:165;54670:11;;54657:45;;;;;;;;;;;;;;54625:21;;-1:-1:-1;;;;;54670:11:0;;54657:34;;:45;;;;;54604:18;;54657:45;;;;;;;54604:18;54670:11;54657:45;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54771:9:0;;54733:21;;-1:-1:-1;;;;;;54771:9:0;;-1:-1:-1;54765:24:0;54797:25;54733:21;54811:10;54797:13;:25::i;:::-;54765:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54862:9:0;;54855:42;;;-1:-1:-1;;;54855:42:0;;54891:4;54855:42;;;;;;54838:14;;-1:-1:-1;;;;;;54862:9:0;;;;-1:-1:-1;54855:27:0;;-1:-1:-1;54855:42:0;;;;;;;;;;;;;;;54862:9;54855:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54855:42:0;;-1:-1:-1;54918:19:0;54855:42;54929:7;54918:10;:19::i;:::-;54908:29;53743:1229;-1:-1:-1;;;;;;;;;;;53743:1229:0:o;54980:531::-;55088:10;;55109;;55070:65;;;;;;;;;;;;;55129:4;55070:65;;;;;55034:26;;-1:-1:-1;;;;;55088:10:0;;55070:38;;:65;;;;;;;;;;;;;;55088:10;55070:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55070:65:0;;-1:-1:-1;55150:22:0;;55146:140;;55207:10;;55243;;55189:85;;;;;;55236:4;55189:85;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55207:10:0;;;;55189:38;;:85;;;;;55207:10;;55189:85;;;;;;;;55207:10;;55189:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55146:140;55333:11;;55326:44;;;-1:-1:-1;;;55326:44:0;;55364:4;55326:44;;;;;;55296:27;;-1:-1:-1;;;;;55333:11:0;;55326:29;;:44;;;;;;;;;;;;;;55333:11;55326:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55326:44:0;55394:11;;55381:55;;;;;;;;;;;;;;55326:44;;-1:-1:-1;;;;;;55394:11:0;;;;55381:34;;:55;;;;;55394:11;;55381:55;;;;;;;;55394:11;;55381:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55453:9;;;;;;;;;-1:-1:-1;;;;;55453:9:0;-1:-1:-1;;;;;55447:24:0;;55479:21;55447:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54980:531;;:::o;17367:774::-;17791:23;17817:69;17845:4;17817:69;;;;;;;;;;;;;;;;;17825:5;-1:-1:-1;;;;;17817:27:0;;;:69;;;;;:::i;:::-;17901:17;;17791:95;;-1:-1:-1;17901:21:0;17897:237;;18056:10;18045:30;;;;;;;;;;;;;;;-1:-1:-1;18045:30:0;18037:85;;;;-1:-1:-1;;;18037:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6612:312;6732:7;6767:12;6760:5;6752:28;;;;-1:-1:-1;;;6752:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6791:9;6807:1;6803;:5;;;;;;;6612:312;-1:-1:-1;;;;;6612:312:0:o;4552:226::-;4672:7;4708:12;4700:6;;;;4692:29;;;;-1:-1:-1;;;4692:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4744:5:0;;;4552:226::o;11832:230::-;11969:12;12001:53;12024:6;12032:4;12038:1;12041:12;13493;13526:18;13537:6;13526:10;:18::i;:::-;13518:60;;;;;-1:-1:-1;;;13518:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13652:12;13666:23;13693:6;-1:-1:-1;;;;;13693:11:0;13712:8;13722:4;13693:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13693:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13651:76;;;;13742:7;13738:595;;;13773:10;-1:-1:-1;13766:17:0;;-1:-1:-1;13766:17:0;13738:595;13887:17;;:21;13883:439;;14150:10;14144:17;14211:15;14198:10;14194:2;14190:19;14183:44;14098:148;14286:20;;-1:-1:-1;;;14286:20:0;;;;;;;;;;;;;;;;;14293:12;;14286:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8892:444;9272:20;9320:8;;;8892:444::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://f7232c5c0e5fdfed8f31ef27c3b094bbd7a58ea5eea329e2918f4caed755407c
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.