Contract 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a3

Contract Overview

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5904df4ac74fc202cd00acf3e102f622a0834a91f3b14b795b1d3c2ffeab480bCall Ex Proxy79693572021-09-05 0:31:0984 days 4 hrs ago0x234d871cb302b94a72a5273ca337dc7972c33888 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0003999152.25
0xe4d587f6fce931b23bb87167fcef89003bd49261df1e406cb5da18550ab5fb14Call Ex Proxy79438962021-09-04 3:18:0685 days 2 hrs ago0x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.00081061652.25
0x8ebd760fca13e03bcca9b089fee64eac234ca3937405db2a18e2a623f7f835caSwap Exact Token...79438842021-09-04 3:17:3085 days 2 hrs ago0x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a31 HT0.000402072752.25
0xde145ea960b55040fe17bcf47af6dd51a5f39180b6afed635848af6f06b6f00eCall Ex Proxy79434062021-09-04 2:53:3685 days 2 hrs ago0x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0004313342.25
0x9162932959dd2797f72a9972c711895d6309ebb98e092992d64af0292a356578Call Ex Proxy79433702021-09-04 2:51:4885 days 2 hrs ago0x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a31 HT0.000894300752.25
0x96e59d385aa88cbdfa9a6f2b569a837c3e4d0c3fb21fa61df0e6761a1d263b41Call Ex Proxy78915642021-09-02 7:41:2686 days 21 hrs ago0xaac4e83967fa464a8aedaacc97b338a32c28cad9 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.00008034752.25
0x547b0648bae65832ea7cb64a1fbffd20a3e419801d1cdf338e72c7f2b216dcedCall Ex Proxy78915622021-09-02 7:41:2086 days 21 hrs ago0xaac4e83967fa464a8aedaacc97b338a32c28cad9 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0009733952.25
0x35bbaf0b26d12df4b28b259dba75b465625be684981eec421c26ae00c7fb5439Swap Exact Token...78882622021-09-02 4:56:2087 days 28 mins ago0x3303286055890fdbfdbd4cd933c5b90b177ad391 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.000407225252.25
0x8ef7e2c853de36601270d906ef01b828ecb351026832d4ea6986297a632e0484Swap Exact Token...78682672021-09-01 12:16:3487 days 17 hrs ago0xaac4e83967fa464a8aedaacc97b338a32c28cad9 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0005884022.25
0x7af35350089c752f190848d2f3deedaf4486cb58ba3c7d2aac663146fff3a66aCall Ex Proxy78581452021-09-01 3:50:2888 days 1 hr ago0xf18463bd447597a3b7c4035ea1e7bcdc5d99f330 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0004313882.25
0x27a72e98f7de79595479819d1cc888ba2dcc951d976e111144afde08895c15abCall Ex Proxy76660112021-08-25 11:43:3594 days 17 hrs ago0xc4313fcdcc95e1352c8e9892eacc43f3c0302241 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.001184681252.25
0x051b9e5b2db699bc21e62b13bb6108f1f20f9a473eedff26f1bc8cd22b0b1909Call Ex Proxy75532392021-08-21 13:44:5898 days 15 hrs ago0xeaebf9f94d6b60338a1d0391ca22b772716389c8 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a31.95 HT0.00040400552.25
0x4c61749e2da89685172accce6a66c4c195928832b945723a3cafe3f698113a3dSwap Exact Token...75531732021-08-21 13:41:4098 days 15 hrs ago0xeaebf9f94d6b60338a1d0391ca22b772716389c8 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30.0902 HT0.000402099752.25
0x95060ec0421a63e0d7366965d878f3e2c49442b66fe417f3f694d69f146ecb25Call Ex Proxy74574112021-08-18 5:53:32101 days 23 hrs ago0xc4313fcdcc95e1352c8e9892eacc43f3c0302241 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0010195922.25
0xdec728845b547bd8db5ab3669732ce300142cb917b6047999c21083122c4a1dbCall Ex Proxy73541252021-08-14 15:49:09105 days 13 hrs ago0x1b9db4ba7e3ea7e7a211f5d0e43293f4793aaf41 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.000981488252.25
0x9d4d183fc3ac51d6ab5c8c22bc9fe22331b4a67ea9da0ebff8a63b3c49bd8f7cCall Ex Proxy72118912021-08-09 17:17:20110 days 12 hrs ago0x4617c2ccf4f2e6bd011281ccd36cfe26389f6511 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.00008185952.25
0xcdb1312ec02d27568a1dfe2015538732ab9ab48622291d4db573e2d94fd0c624Call Ex Proxy71816312021-08-08 16:04:20111 days 13 hrs ago0x6e50a7a14b92d64a28befdddfc9c8bc86cedea49 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a32 HT0.001007970752.25
0xc04a87c5261d60a489bc52d3c412d0971b94584a5cb5b18040fede395f81c0e0Call Ex Proxy71259932021-08-06 17:42:25113 days 11 hrs ago0xe392eac260fa1e5a6fb986f014306e33c567d77c IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0008531642.25
0xadcb8ab7e36751eb95ce040c4baac65032f5542072f7a66be1d7389e4185ac18Call Ex Proxy70990202021-08-05 19:13:46114 days 10 hrs ago0x1b9db4ba7e3ea7e7a211f5d0e43293f4793aaf41 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0003648782.25
0x6f31c9e1d3d80260955e6ed8a5aecda3c4c18082303f8c5693fa0b039dee8647Call Ex Proxy69982102021-08-02 7:13:16117 days 22 hrs ago0x54336f54fa84fe72c70683c6501fac8d7b725e4f IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.0002989172.25
0xa0e66f0ebbeb4e7211ad22ef39fc05988ada7b88531cc548665dab84e56e40abCall Ex Proxy69981992021-08-02 7:12:43117 days 22 hrs ago0x54336f54fa84fe72c70683c6501fac8d7b725e4f IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.00107843852.25
0x478cfb86ed6322dab7d2d7c66101785fff3430fb18b28e5d477a418fbe26be7fCall Ex Proxy68854862021-07-29 9:17:03121 days 20 hrs ago0xefcbec968df1286d57e16c2cf31edbde3aa11f39 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.00084447452.25
0x0eb95592d13796a712cddc760d1e37af77afde615b99f3d917d85b91fdc88478Call Ex Proxy68852772021-07-29 9:06:36121 days 20 hrs ago0xefcbec968df1286d57e16c2cf31edbde3aa11f39 IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a356.5285 HT0.00043775552.25
0x866751692b10eff124707552f256b64158603753570d09e13659ea6e9b9cc247Call Ex Proxy68585832021-07-28 10:51:54122 days 18 hrs ago0xeb71565ceba9268d0f7730bb836d2a71197dd57f IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.001264430252.25
0x8b9a6f78b95d191a144c573f3ea24f6e6f964557527f25d2ac08782246e082dcCall Ex Proxy68379262021-07-27 17:39:03123 days 11 hrs ago0xee41347075930904c075e0308ae6b4d55ba2092f IN  0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30 HT0.001256667752.25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5904df4ac74fc202cd00acf3e102f622a0834a91f3b14b795b1d3c2ffeab480b79693572021-09-05 0:31:0984 days 4 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.001520006723247398 HT
0x5904df4ac74fc202cd00acf3e102f622a0834a91f3b14b795b1d3c2ffeab480b79693572021-09-05 0:31:0984 days 4 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x234d871cb302b94a72a5273ca337dc7972c338881.51848671652415061 HT
0x5904df4ac74fc202cd00acf3e102f622a0834a91f3b14b795b1d3c2ffeab480b79693572021-09-05 0:31:0984 days 4 hrs ago 0x00efb96dbfe641246e961b472c0c3fc472f6a694 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a31.520006723247398008 HT
0xe4d587f6fce931b23bb87167fcef89003bd49261df1e406cb5da18550ab5fb1479438962021-09-04 3:18:0685 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.000994071744274129 HT
0xe4d587f6fce931b23bb87167fcef89003bd49261df1e406cb5da18550ab5fb1479438962021-09-04 3:18:0685 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c0.993077672529855686 HT
0xe4d587f6fce931b23bb87167fcef89003bd49261df1e406cb5da18550ab5fb1479438962021-09-04 3:18:0685 days 2 hrs ago Mdex: Router 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30.994071744274129815 HT
0x8ebd760fca13e03bcca9b089fee64eac234ca3937405db2a18e2a623f7f835ca79438842021-09-04 3:17:3085 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a3 Huobi: Wrapped Huobi Token1 HT
0xde145ea960b55040fe17bcf47af6dd51a5f39180b6afed635848af6f06b6f00e79434062021-09-04 2:53:3685 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.000997732743028741 HT
0xde145ea960b55040fe17bcf47af6dd51a5f39180b6afed635848af6f06b6f00e79434062021-09-04 2:53:3685 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c0.996735010285713249 HT
0xde145ea960b55040fe17bcf47af6dd51a5f39180b6afed635848af6f06b6f00e79434062021-09-04 2:53:3685 days 2 hrs ago 0x00efb96dbfe641246e961b472c0c3fc472f6a694 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30.997732743028741991 HT
0x9162932959dd2797f72a9972c711895d6309ebb98e092992d64af0292a35657879433702021-09-04 2:51:4885 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x04dd59e3a1e58f5ccc51ecec0db2a0817506e79c1 wei
0x9162932959dd2797f72a9972c711895d6309ebb98e092992d64af0292a35657879433702021-09-04 2:51:4885 days 2 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a3 Mdex: Router1 HT
0x35bbaf0b26d12df4b28b259dba75b465625be684981eec421c26ae00c7fb543978882622021-09-02 4:56:2087 days 28 mins ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.000162313508664635 HT
0x35bbaf0b26d12df4b28b259dba75b465625be684981eec421c26ae00c7fb543978882622021-09-02 4:56:2087 days 28 mins ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x3303286055890fdbfdbd4cd933c5b90b177ad3910.162151195155971007 HT
0x35bbaf0b26d12df4b28b259dba75b465625be684981eec421c26ae00c7fb543978882622021-09-02 4:56:2087 days 28 mins ago Huobi: Wrapped Huobi Token 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30.162313508664635642 HT
0x7af35350089c752f190848d2f3deedaf4486cb58ba3c7d2aac663146fff3a66a78581452021-09-01 3:50:2888 days 1 hr ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.001848587365554122 HT
0x7af35350089c752f190848d2f3deedaf4486cb58ba3c7d2aac663146fff3a66a78581452021-09-01 3:50:2888 days 1 hr ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3301.846738778188568247 HT
0x7af35350089c752f190848d2f3deedaf4486cb58ba3c7d2aac663146fff3a66a78581452021-09-01 3:50:2888 days 1 hr ago 0x00efb96dbfe641246e961b472c0c3fc472f6a694 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a31.84858736555412237 HT
0x051b9e5b2db699bc21e62b13bb6108f1f20f9a473eedff26f1bc8cd22b0b190975532392021-08-21 13:44:5898 days 15 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xeaebf9f94d6b60338a1d0391ca22b772716389c80.039001454652726748 HT
0x051b9e5b2db699bc21e62b13bb6108f1f20f9a473eedff26f1bc8cd22b0b190975532392021-08-21 13:44:5898 days 15 hrs ago 0x00efb96dbfe641246e961b472c0c3fc472f6a694 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30.039001454652726747 HT
0x051b9e5b2db699bc21e62b13bb6108f1f20f9a473eedff26f1bc8cd22b0b190975532392021-08-21 13:44:5898 days 15 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a3 0x00efb96dbfe641246e961b472c0c3fc472f6a6941.95 HT
0x4c61749e2da89685172accce6a66c4c195928832b945723a3cafe3f698113a3d75531732021-08-21 13:41:4098 days 15 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a3 Huobi: Wrapped Huobi Token0.0902 HT
0xdec728845b547bd8db5ab3669732ce300142cb917b6047999c21083122c4a1db73541252021-08-14 15:49:09105 days 13 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30xf18463bd447597a3b7c4035ea1e7bcdc5d99f3300.004020685207222574 HT
0xdec728845b547bd8db5ab3669732ce300142cb917b6047999c21083122c4a1db73541252021-08-14 15:49:09105 days 13 hrs ago 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a30x1b9db4ba7e3ea7e7a211f5d0e43293f4793aaf414.016664522015351842 HT
0xdec728845b547bd8db5ab3669732ce300142cb917b6047999c21083122c4a1db73541252021-08-14 15:49:09105 days 13 hrs ago Mdex: Router 0xe3ffa0ca53f8729daf54b866bd34a6c132e657a34.020685207222574417 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
swapV1

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-04-08
*/

pragma solidity ^0.5.10;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {

    /**
     * @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.
     *
     * > 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 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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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-solidity/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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    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.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != 0x0 && codehash != accountHash);
    }

}

/**
 * @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 ERC20;` 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));
    }

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


    /**
     * @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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "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");
        }
    }
}

contract IWETH is IERC20 {

    function balanceOf(address account) external view returns (uint256);

    function deposit() external payable;

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

    function withdraw(uint) external;
}

library UniswapV2Library {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB, bytes memory initCode) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                initCode // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB, bytes memory initCode) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB, initCode)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint fee) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(fee);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint fee) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(fee);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path, bytes memory initCode, uint fee) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1], initCode);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, fee);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path, bytes memory initCode, uint fee) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i], initCode);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut, fee);
        }
    }
}

interface IUniswapV2Pair {
    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

interface IMdexSwapMining {
    function takerWithdraw() external;
}

contract swapV1 {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    event EVTCallExProxy (address indexed _in, address indexed _out, address indexed _trader, address _ex, uint256 _outAmount);
    event EVTSwapExactTokensForTokens(address indexed _in, address indexed _out, address indexed _trader, address _ex, uint256 _outAmount);
    event EVTSwapTokensForExactTokens(address indexed _in, address indexed _out, address indexed _trader, address _ex, uint256 _outAmount);
    event SwapToolCreated(address indexed router);


    function safeTransfer(address token, address to, uint256 value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }


    //TODO
    uint256  feeFlag;
    address  payable private feeAddr = 0xF18463BD447597a3b7c4035EA1E7BcDc5d99F330;
    address public constant  WETH = 0x5545153CCFcA01fbd7Dd11C0b23ba694D9509A6F;
    uint256 feeRate = 1;
    uint256 feePercent1000 = 1000;
    uint256 userFundsRate = feePercent1000 - feeRate;
    //TODO
    address private _owner;
    address emptyAddr = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    mapping(address => bool) routerMap;
    mapping(address => bytes) factoryMap;
    mapping(address => uint256) factoryFeeMap;
    IWETH wethToken;

    address public mdexTokenAddr = 0x25D2e80cB6B86881Fd7e07dd263Fb79f4AbE033c;
    address public mdexSwapmingAddr = 0x7373c42502874C88954bDd6D50b53061F018422e;
    address public mdexRouter = 0xED7d5F38C79115ca12fe6C0041abb22F0A06C300;

    constructor() public {
        wethToken = IWETH(WETH);
        _owner = msg.sender;
        feeFlag = 1;
        emit SwapToolCreated(address(this));

        factoryMap[0xb0b670fc1F7724119963018DB0BfA86aDb22d941] = hex'2ad889f82040abccb2649ea6a874796c1601fb67f91a747a80e08860c73ddf24';
        factoryMap[0x1EA26C17d061E8a7Cc33B20d8d8Dad131d7fb392] = hex'7ebbf425b07b211d8da43bdc833a9b8f2c7eaad2c0d696a4ff7a6c6b6a369c1f';
        factoryMap[0xfaD5cfeA51efECaa69749Cb8D89C2812d4D1ee97] = hex'eb23ddc3c69b89cf449a5964057abd885c43bebd5d6e422b5548f5274e3584f9';
        factoryMap[0x2c809515dbeFE359BE587DBE0894339e2947D0FD] = hex'65132eb6f61e6ef0e8e05980bc92152c53d4176e7ec3a54f867be8adf9d8173a';
        factoryMap[0xB49f19289857f4499781AaB9afd4A428C4BE9CA8] = hex'e7418267b22a1affb433ac6e8a6eae3a15890c6e6155eb347f72cd973625dcb6';
        factoryMap[0x32CE36F6eA8d97f9fC19Aab83b9c6D2F52D74470] = hex'7b9686f044376bf1a04de2e9f1dbb6c9a4fe516f7cbd89b68be801982b62f913';

        //
        factoryFeeMap[0xb0b670fc1F7724119963018DB0BfA86aDb22d941] = 9970;
        factoryFeeMap[0x1EA26C17d061E8a7Cc33B20d8d8Dad131d7fb392] = 9970;
        factoryFeeMap[0xfaD5cfeA51efECaa69749Cb8D89C2812d4D1ee97] = 9970;
        factoryFeeMap[0x2c809515dbeFE359BE587DBE0894339e2947D0FD] = 9970;
        factoryFeeMap[0xB49f19289857f4499781AaB9afd4A428C4BE9CA8] = 9965;
        factoryFeeMap[0x32CE36F6eA8d97f9fC19Aab83b9c6D2F52D74470] = 9970;

    }


    function pairFor(address factory, address tokenA, address tokenB, bytes memory initCode) public pure returns (address pair) {
        return UniswapV2Library.pairFor(factory, tokenA, tokenB, initCode);
    }

    modifier onlyOwner() {
        require(tx.origin == _owner, "Ownable: caller is not the owner");
        _;
    }

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
        _;
    }

    function addRouter(address router) public onlyOwner {
        routerMap[router] = true;

    }

    function isRouter(address router) public view returns (bool){
        return routerMap[router];
    }

    function addFactory(address _factory, uint256 fee, bytes memory initCode) public onlyOwner {
        factoryMap[_factory] = initCode;
        factoryFeeMap[_factory] = fee;
    }

    function setFeeFlag(uint256 f) public onlyOwner {
        feeFlag = f;
    }

    function setFeeRate(uint256 fee) public onlyOwner {
        require(fee > 0 && fee <= 10, "1-10");
        feeRate = fee;
    }

    function _needFee() internal view returns (bool){
        return feeFlag == 1;
    }


    function callExProxy(address router, IERC20 inToken, IERC20 outToken, uint256 amountIn, uint256 amountOutMin, bytes memory data) public payable {
        require(router != address(this), "Illegal");
        require(amountOutMin > 0, 'Limit Amount must be set');
        require(isRouter(router), "Illegal router address");

        if (address(inToken) != emptyAddr) {
            require(msg.value == 0, "eth 0");
            transferFromUser(inToken, msg.sender, amountIn);
        }

        approve(inToken, router);
        //swap
        (bool success,) = router.call.value(msg.value)(data);
        require(success, "call ex fail");

        uint256 tradeReturn = viewBalance(outToken, address(this));
        require(tradeReturn >= amountOutMin, 'Trade returned less than the minimum amount');

        // return any unspent funds
        uint256 leftover = viewBalance(inToken, address(this));
        if (leftover > 0) {
            sendFunds(inToken, msg.sender, leftover);
        }

        if (_needFee()) {
            sendFunds(outToken, msg.sender, tradeReturn.mul(userFundsRate).div(feePercent1000));
            sendFunds(outToken, feeAddr, tradeReturn.mul(feeRate).div(feePercent1000));
        } else {
            sendFunds(outToken, msg.sender, tradeReturn);
        }
        emit EVTCallExProxy(address(inToken), address(outToken), msg.sender, router, tradeReturn);

        if (router == mdexRouter) {
            _getMiningReward(msg.sender);
        }
    }

    function swapExactTokensForTokens(address factory, IERC20 inToken, IERC20 outToken, uint256 amountIn, uint256 amountOutMin, uint deadline, address[] memory path) public payable ensure(deadline) {
        require(factory != address(this), "Illegal");
        require(amountOutMin > 0, 'Limit Amount must be set');
        require(factoryMap[factory].length > 0, "add factory before");
        bytes memory initCode = factoryMap[factory];
        uint[] memory amounts = new uint[](path.length);
        {
            uint fee = factoryFeeMap[factory];
            amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path, initCode, fee);
        }
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');

        address firstPair = UniswapV2Library.pairFor(factory, path[0], path[1], initCode);
        if (address(inToken) != emptyAddr) {
            require(msg.value == 0, "eth 0");
            safeTransferFrom(address(inToken), msg.sender, firstPair, amountIn);
        } else {
            inToken = IERC20(WETH);
            wethToken.deposit.value(msg.value)();
            inToken.safeTransfer(firstPair, msg.value);
        }
        if (_needFee()) {
            {
                _swap(factory, amounts, path, address(this), initCode);
            }

            if (address(outToken) == emptyAddr) {
                wethToken.withdraw(wethToken.balanceOf(address(this)));
            }

            uint256 tradeReturn = viewBalance(outToken, address(this));
            require(tradeReturn >= amountOutMin, 'Trade returned less than the minimum amount');

            uint256 leftover = viewBalance(inToken, address(this));
            if (leftover > 0) {
                sendFunds(inToken, msg.sender, leftover);
            }
            sendFunds(outToken, msg.sender, tradeReturn.mul(userFundsRate).div(feePercent1000));
            sendFunds(outToken, feeAddr, tradeReturn.mul(feeRate).div(feePercent1000));
        } else {

            if (address(outToken) == emptyAddr) {
                _swap(factory, amounts, path, address(this), initCode);
                uint256 tradeReturn = wethToken.balanceOf(address(this));
                wethToken.withdraw(tradeReturn);
                sendFunds(outToken, msg.sender, tradeReturn);
            } else {
                _swap(factory, amounts, path, msg.sender, initCode);
            }

        }
        emit EVTSwapExactTokensForTokens(address(inToken), address(outToken), msg.sender, factory, amounts[amounts.length - 1]);
    }


    function swapTokensForExactTokens(address factory, IERC20 inToken, IERC20 outToken, uint256 amountInMax, uint256 amountOut, uint deadline, address[] memory path) public payable ensure(deadline) {
        require(factory != address(this), "Illegal");
        require(factoryMap[factory].length > 0, "add factory before");
        bytes memory initCode = factoryMap[factory];
        uint[] memory amounts = new uint[](path.length);
        {
            uint fee = factoryFeeMap[factory];
            amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path, initCode, fee);
        }
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');

        address firstPair = UniswapV2Library.pairFor(factory, path[0], path[1], initCode);
        if (address(inToken) != emptyAddr) {
            require(msg.value == 0, "eth 0");
            safeTransferFrom(address(inToken), msg.sender, firstPair, amounts[0]);
        } else {
            require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
            inToken = IERC20(WETH);
            wethToken.deposit.value(amounts[0])();
            inToken.safeTransfer(firstPair, amounts[0]);
        }
        if (_needFee()) {
            {
                _swap(factory, amounts, path, address(this), initCode);
            }

            if (address(outToken) == emptyAddr) {
                wethToken.withdraw(wethToken.balanceOf(address(this)));
            }

            sendFunds(outToken, msg.sender, amountOut.mul(userFundsRate).div(feePercent1000));
            sendFunds(outToken, feeAddr, amountOut.mul(feeRate).div(feePercent1000));
        } else {

            if (address(outToken) == emptyAddr) {
                _swap(factory, amounts, path, address(this), initCode);
                uint256 tradeReturn = wethToken.balanceOf(address(this));
                wethToken.withdraw(tradeReturn);
                sendFunds(outToken, msg.sender, tradeReturn);
            } else {
                _swap(factory, amounts, path, msg.sender, initCode);
            }

        }
        if (msg.value > amounts[0]) {
            //eth
            msg.sender.transfer(msg.value.sub(amounts[0]));
        }

        emit EVTSwapTokensForExactTokens(address(inToken), address(outToken), msg.sender, factory, amountOut);
    }


    function transferFromUser(IERC20 erc, address _from, uint256 _inAmount) internal {
        if (
            address(erc) != emptyAddr &&
        erc.allowance(_from, address(this)) >= _inAmount
        ) {
            safeTransferFrom(address(erc), _from, address(this), _inAmount);
        }
    }

    function approve(IERC20 erc, address approvee) internal {
        if (
            address(erc) != emptyAddr &&
            erc.allowance(address(this), approvee) == 0
        ) {
            erc.safeApprove(approvee, uint256(- 1));
        }
    }

    function viewBalance(IERC20 erc, address owner) internal view returns (uint256) {
        if (address(erc) == emptyAddr) {
            return owner.balance;
        } else {
            return erc.balanceOf(owner);
        }
    }

    function sendFunds(IERC20 erc, address payable receiver, uint256 funds) internal {
        if (address(erc) == emptyAddr) {
            receiver.transfer(funds);
        } else {
            safeTransfer(address(erc), receiver, funds);
        }
    }


    function _swap(address factory, uint[] memory amounts, address[] memory path, address _to, bytes memory initCode) internal {
        //
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2], initCode) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output, initCode)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function withdrawEth() external onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

    function withdrawAnyToken(IERC20 erc) external onlyOwner {
        safeTransfer(address(erc), msg.sender, erc.balanceOf(address(this)));
    }

    function() external payable {
        require(msg.sender != tx.origin, "233333");
    }

    function _getMiningReward(address addr) internal {
        IMdexSwapMining swap = IMdexSwapMining(mdexSwapmingAddr);
        swap.takerWithdraw();
        uint256 ba = IERC20(mdexTokenAddr).balanceOf(address(this));
        if (ba > 0) {
            safeTransfer(mdexTokenAddr, addr, ba);
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"contract IERC20","name":"inToken","type":"address"},{"internalType":"contract IERC20","name":"outToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"swapExactTokensForTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"f","type":"uint256"}],"name":"setFeeFlag","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"addRouter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mdexTokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFeeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"contract IERC20","name":"inToken","type":"address"},{"internalType":"contract IERC20","name":"outToken","type":"address"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"swapTokensForExactTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"mdexSwapmingAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"addFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"erc","type":"address"}],"name":"withdrawAnyToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"contract IERC20","name":"inToken","type":"address"},{"internalType":"contract IERC20","name":"outToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"callExProxy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mdexRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"isRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_in","type":"address"},{"indexed":true,"internalType":"address","name":"_out","type":"address"},{"indexed":true,"internalType":"address","name":"_trader","type":"address"},{"indexed":false,"internalType":"address","name":"_ex","type":"address"},{"indexed":false,"internalType":"uint256","name":"_outAmount","type":"uint256"}],"name":"EVTCallExProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_in","type":"address"},{"indexed":true,"internalType":"address","name":"_out","type":"address"},{"indexed":true,"internalType":"address","name":"_trader","type":"address"},{"indexed":false,"internalType":"address","name":"_ex","type":"address"},{"indexed":false,"internalType":"uint256","name":"_outAmount","type":"uint256"}],"name":"EVTSwapExactTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_in","type":"address"},{"indexed":true,"internalType":"address","name":"_out","type":"address"},{"indexed":true,"internalType":"address","name":"_trader","type":"address"},{"indexed":false,"internalType":"address","name":"_ex","type":"address"},{"indexed":false,"internalType":"uint256","name":"_outAmount","type":"uint256"}],"name":"EVTSwapTokensForExactTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"SwapToolCreated","type":"event"}]

6080604052600180546001600160a01b031990811673f18463bd447597a3b7c4035ea1e7bcdc5d99f3301782556002919091556103e86003556103e760045560068054821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee179055600b805482167325d2e80cb6b86881fd7e07dd263fb79f4abe033c179055600c80548216737373c42502874c88954bdd6d50b53061f018422e179055600d805490911673ed7d5f38c79115ca12fe6c0041abb22f0a06c300179055348015620000c457600080fd5b50600a80546001600160a01b0319908116735545153ccfca01fbd7dd11c0b23ba694d9509a6f1790915560058054909116331790556001600090815560405130917f5b32edf5e0b2257b08a068877c107da81b417325ac04b89a1a5db97723830a7391a26040805180820190915260208082527f2ad889f82040abccb2649ea6a874796c1601fb67f91a747a80e08860c73ddf2481830190815273b0b670fc1f7724119963018db0bfa86adb22d94160005260089091529051620001aa917f3477635bd63a20e61339bce8956844e08d2e84242eff1051c5d7e702488fcb5c9162000537565b506040805180820190915260208082527f7ebbf425b07b211d8da43bdc833a9b8f2c7eaad2c0d696a4ff7a6c6b6a369c1f818301908152731ea26c17d061e8a7cc33b20d8d8dad131d7fb392600052600890915290516200022d917fa5abcf3760d65dd385e79d2d989ea850fe90dd770e2dcc52b7c9e04421c27b979162000537565b506040805180820190915260208082527feb23ddc3c69b89cf449a5964057abd885c43bebd5d6e422b5548f5274e3584f981830190815273fad5cfea51efecaa69749cb8d89c2812d4d1ee9760005260089091529051620002b0917fc3d6e66dd7ea9865c0711f472fbf6989c2de23b3b3636d79e01996e8c4de04459162000537565b506040805180820190915260208082527f65132eb6f61e6ef0e8e05980bc92152c53d4176e7ec3a54f867be8adf9d8173a818301908152732c809515dbefe359be587dbe0894339e2947d0fd6000526008909152905162000333917f4be0bbaa4693fe8400cfa316a3140f97120e5eea8c8aeafd75b0940b51e8c15e9162000537565b506040805180820190915260208082527fe7418267b22a1affb433ac6e8a6eae3a15890c6e6155eb347f72cd973625dcb681830190815273b49f19289857f4499781aab9afd4a428c4be9ca860005260089091529051620003b6917fa73f20709f4b22babee4b227a26590ba91e8fd5b7e638af4ec47d66396bb78729162000537565b506040805180820190915260208082527f7b9686f044376bf1a04de2e9f1dbb6c9a4fe516f7cbd89b68be801982b62f9138183019081527332ce36f6ea8d97f9fc19aab83b9c6d2f52d744706000526008909152905162000439917f0946f39084d640faa39ef10410437a6b85d95f075b21f66c71f0a355372947159162000537565b5060096020526126f27fc34793358e5d30cb85bbb7c31093f31ed517d9ddfcec5720ff65482f1e10bc088190557f2d0d1b21c4674c4af234565172b8008c27d9d249a8ebff4959a3df0eb5263c468190557f6b542c1f09e5c93c54685219624bcd1392853323aa9dec9cbb42e01fec73898a8190557f6f404e3d8fbf499d768fee6e5fdb8203628d7ce16993577a1b17df53c225d3b18190556126ed7f3dd322d4326346cc676f461a5cc2618bdb8c031312f781d632bf2f77c265766d557332ce36f6ea8d97f9fc19aab83b9c6d2f52d744706000527fd901673e1af1e1a652699762fdbf0aa5a59b41da790bbbd0b7e9ec0229babda555620005dc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057a57805160ff1916838001178555620005aa565b82800160010185558215620005aa579182015b82811115620005aa5782518255916020019190600101906200058d565b50620005b8929150620005bc565b5090565b620005d991905b80821115620005b85760008155600101620005c3565b90565b61339680620005ec6000396000f3fe6080604052600436106100e85760003560e01c80635b512ca31161008a578063a9e6d4ed11610059578063a9e6d4ed1461057f578063ad5c464814610650578063f17feaf714610665578063f3d7d2821461067a576100e8565b80635b512ca31461045c5780636b5ba049146104715780637892766c14610537578063a0ef91df1461056a576100e8565b806324ca984e116100c657806324ca984e146103155780632b22a98e1461034857806345596e2e1461035d5780634b08db6814610387576100e8565b806304ede7b6146101285780631c1b0e19146102165780632200aad9146102eb575b33321415610126576040805162461bcd60e51b815260206004820152600660248201526532333333333360d01b604482015290519081900360640190fd5b005b34801561013457600080fd5b506101fa6004803603608081101561014b57600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b81111561018657600080fd5b82018360208201111561019857600080fd5b803590602001918460018302840111600160201b831117156101b957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106c1945050505050565b604080516001600160a01b039092168252519081900360200190f35b610126600480360360e081101561022c57600080fd5b6001600160a01b038235811692602081013582169260408201359092169160608201359160808101359160a0820135919081019060e0810160c0820135600160201b81111561027a57600080fd5b82018360208201111561028c57600080fd5b803590602001918460208302840111600160201b831117156102ad57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506106d8945050505050565b3480156102f757600080fd5b506101266004803603602081101561030e57600080fd5b5035610e3b565b34801561032157600080fd5b506101266004803603602081101561033857600080fd5b50356001600160a01b0316610e8d565b34801561035457600080fd5b506101fa610efe565b34801561036957600080fd5b506101266004803603602081101561038057600080fd5b5035610f0d565b610126600480360360e081101561039d57600080fd5b6001600160a01b038235811692602081013582169260408201359092169160608201359160808101359160a0820135919081019060e0810160c0820135600160201b8111156103eb57600080fd5b8201836020820111156103fd57600080fd5b803590602001918460208302840111600160201b8311171561041e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610faa945050505050565b34801561046857600080fd5b506101fa6116ef565b34801561047d57600080fd5b506101266004803603606081101561049457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156104c357600080fd5b8201836020820111156104d557600080fd5b803590602001918460018302840111600160201b831117156104f657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116fe945050505050565b34801561054357600080fd5b506101266004803603602081101561055a57600080fd5b50356001600160a01b0316611792565b34801561057657600080fd5b5061012661186e565b610126600480360360c081101561059557600080fd5b6001600160a01b038235811692602081013582169260408201359092169160608201359160808101359181019060c0810160a0820135600160201b8111156105dc57600080fd5b8201836020820111156105ee57600080fd5b803590602001918460018302840111600160201b8311171561060f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118e8945050505050565b34801561065c57600080fd5b506101fa611c74565b34801561067157600080fd5b506101fa611c8c565b34801561068657600080fd5b506106ad6004803603602081101561069d57600080fd5b50356001600160a01b0316611c9b565b604080519115158252519081900360200190f35b60006106cf85858585611cb9565b95945050505050565b8142811015610729576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6001600160a01b038816301415610771576040805162461bcd60e51b8152602060048201526007602482015266125b1b1959d85b60ca1b604482015290519081900360640190fd5b600084116107c1576040805162461bcd60e51b8152602060048201526018602482015277131a5b5a5d08105b5bdd5b9d081b5d5cdd081899481cd95d60421b604482015290519081900360640190fd5b6001600160a01b03881660009081526008602052604090205460026000196101006001841615020190911604610833576040805162461bcd60e51b815260206004820152601260248201527161646420666163746f7279206265666f726560701b604482015290519081900360640190fd5b6001600160a01b03881660009081526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156108d25780601f106108a7576101008083540402835291602001916108d2565b820191906000526020600020905b8154815290600101906020018083116108b557829003601f168201915b5050505050905060608351604051908082528060200260200182016040528015610906578160200160208202803883390190505b506001600160a01b038b166000908152600960205260409020549091506109308b89878685611dd6565b915050858160018351038151811061094457fe5b602002602001015110156109895760405162461bcd60e51b815260040180806020018281038252602b815260200180613288602b913960400191505060405180910390fd5b60006109bf8b8660008151811061099c57fe5b6020026020010151876001815181106109b157fe5b602002602001015186611cb9565b6006549091506001600160a01b038b8116911614610a23573415610a12576040805162461bcd60e51b8152602060048201526005602482015264065746820360dc1b604482015290519081900360640190fd5b610a1e8a33838b611f0f565b610ab9565b735545153ccfca01fbd7dd11c0b23ba694d9509a6f9950600a60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a8a57600080fd5b505af1158015610a9e573d6000803e3d6000fd5b50610ab9935050506001600160a01b038c169050823461206c565b610ac16120c3565b15610c9457610ad38b838730876120cd565b6006546001600160a01b038a811691161415610bbf57600a54604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b158015610b3c57600080fd5b505afa158015610b50573d6000803e3d6000fd5b505050506040513d6020811015610b6657600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b158015610ba657600080fd5b505af1158015610bba573d6000803e3d6000fd5b505050505b6000610bcb8a306122cf565b905087811015610c0c5760405162461bcd60e51b815260040180806020018281038252602b81526020018061317c602b913960400191505060405180910390fd5b6000610c188c306122cf565b90508015610c2b57610c2b8c3383612384565b610c5c8b33610c57600354610c4b600454886123e190919063ffffffff16565b9063ffffffff61244116565b612384565b600154600354600254610c8d928e926001600160a01b0390911691610c579190610c4b90889063ffffffff6123e116565b5050610db4565b6006546001600160a01b038a811691161415610da757610cb78b838730876120cd565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610d0257600080fd5b505afa158015610d16573d6000803e3d6000fd5b505050506040513d6020811015610d2c57600080fd5b5051600a5460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b50505050610da18a3383612384565b50610db4565b610db48b838733876120cd565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167fb5fe54d9d3d76c54a75a26f4d692877e4d2fc8562c4eb200c2969810388a33188e86600188510381518110610e0457fe5b602090810291909101810151604080516001600160a01b039094168452918301528051918290030190a45050505050505050505050565b6005546001600160a01b03163214610e88576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b600055565b6005546001600160a01b03163214610eda576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b600b546001600160a01b031681565b6005546001600160a01b03163214610f5a576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b600081118015610f6b5750600a8111155b610fa5576040805162461bcd60e51b815260206004808301919091526024820152630312d31360e41b604482015290519081900360640190fd5b600255565b8142811015610ffb576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6001600160a01b038816301415611043576040805162461bcd60e51b8152602060048201526007602482015266125b1b1959d85b60ca1b604482015290519081900360640190fd5b6001600160a01b038816600090815260086020526040902054600260001961010060018416150201909116046110b5576040805162461bcd60e51b815260206004820152601260248201527161646420666163746f7279206265666f726560701b604482015290519081900360640190fd5b6001600160a01b03881660009081526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156111545780601f1061112957610100808354040283529160200191611154565b820191906000526020600020905b81548152906001019060200180831161113757829003601f168201915b5050505050905060608351604051908082528060200260200182016040528015611188578160200160208202803883390190505b506001600160a01b038b166000908152600960205260409020549091506111b28b888786856124ab565b91505086816000815181106111c357fe5b602002602001015111156112085760405162461bcd60e51b81526004018080602001828103825260278152602001806132616027913960400191505060405180910390fd5b600061121b8b8660008151811061099c57fe5b6006549091506001600160a01b038b811691161461129357341561126e576040805162461bcd60e51b8152602060048201526005602482015264065746820360dc1b604482015290519081900360640190fd5b61128e8a33838560008151811061128157fe5b6020026020010151611f0f565b61139d565b34826000815181106112a157fe5b602002602001015111156112e65760405162461bcd60e51b81526004018080602001828103825260278152602001806132616027913960400191505060405180910390fd5b600a548251735545153ccfca01fbd7dd11c0b23ba694d9509a6f9b506001600160a01b039091169063d0e30db090849060009061131f57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561135257600080fd5b505af1158015611366573d6000803e3d6000fd5b505050505061139d818360008151811061137c57fe5b60200260200101518c6001600160a01b031661206c9092919063ffffffff16565b6113a56120c3565b156114f9576113b78b838730876120cd565b6006546001600160a01b038a8116911614156114a357600a54604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d9183916370a0823191602480820192602092909190829003018186803b15801561142057600080fd5b505afa158015611434573d6000803e3d6000fd5b505050506040513d602081101561144a57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b15801561148a57600080fd5b505af115801561149e573d6000803e3d6000fd5b505050505b6114c38933610c57600354610c4b6004548d6123e190919063ffffffff16565b6001546003546002546114f4928c926001600160a01b0390911691610c579190610c4b908d9063ffffffff6123e116565b611619565b6006546001600160a01b038a81169116141561160c5761151c8b838730876120cd565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561156757600080fd5b505afa15801561157b573d6000803e3d6000fd5b505050506040513d602081101561159157600080fd5b5051600a5460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b505050506116068a3383612384565b50611619565b6116198b838733876120cd565b8160008151811061162657fe5b602002602001015134111561169357336001600160a01b03166108fc6116698460008151811061165257fe5b6020026020010151346125cd90919063ffffffff16565b6040518115909202916000818181858888f19350505050158015611691573d6000803e3d6000fd5b505b604080516001600160a01b038d81168252602082018a9052825133938d831693928f16927f571a6dc94731a6842d1cbf05f308d1859ab291c73709f65d7d30bc45432a13b2929081900390910190a45050505050505050505050565b600c546001600160a01b031681565b6005546001600160a01b0316321461174b576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526008602090815260409091208251611774928401906130e3565b50506001600160a01b03909116600090815260096020526040902055565b6005546001600160a01b031632146117df576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b61186b8133836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561183a57600080fd5b505afa15801561184e573d6000803e3d6000fd5b505050506040513d602081101561186457600080fd5b505161262a565b50565b6005546001600160a01b031632146118bb576040805162461bcd60e51b81526020600482018190526024820152600080516020613241833981519152604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f1935050505015801561186b573d6000803e3d6000fd5b6001600160a01b038616301415611930576040805162461bcd60e51b8152602060048201526007602482015266125b1b1959d85b60ca1b604482015290519081900360640190fd5b60008211611980576040805162461bcd60e51b8152602060048201526018602482015277131a5b5a5d08105b5bdd5b9d081b5d5cdd081899481cd95d60421b604482015290519081900360640190fd5b61198986611c9b565b6119d3576040805162461bcd60e51b8152602060048201526016602482015275496c6c6567616c20726f75746572206164647265737360501b604482015290519081900360640190fd5b6006546001600160a01b03868116911614611a2e573415611a23576040805162461bcd60e51b8152602060048201526005602482015264065746820360dc1b604482015290519081900360640190fd5b611a2e853385612794565b611a38858761283d565b6000866001600160a01b031634836040518082805190602001908083835b60208310611a755780518252601f199092019160209182019101611a56565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ad7576040519150601f19603f3d011682016040523d82523d6000602084013e611adc565b606091505b5050905080611b21576040805162461bcd60e51b815260206004820152600c60248201526b18d85b1b08195e0819985a5b60a21b604482015290519081900360640190fd5b6000611b2d86306122cf565b905083811015611b6e5760405162461bcd60e51b815260040180806020018281038252602b81526020018061317c602b913960400191505060405180910390fd5b6000611b7a88306122cf565b90508015611b8d57611b8d883383612384565b611b956120c3565b15611bf057611bba8733610c57600354610c4b600454886123e190919063ffffffff16565b600154600354600254611beb928a926001600160a01b0390911691610c579190610c4b90889063ffffffff6123e116565b611bfb565b611bfb873384612384565b604080516001600160a01b038b8116825260208201859052825133938b831693928d16927fe04eda62df1f25208f4bce446a4cd6684f3e80876d019759249a4a248d2886c3929081900390910190a4600d546001600160a01b038a811691161415611c6957611c69336128f9565b505050505050505050565b735545153ccfca01fbd7dd11c0b23ba694d9509a6f81565b600d546001600160a01b031681565b6001600160a01b031660009081526007602052604090205460ff1690565b6000806000611cc886866129f0565b9150915086828260405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001208560405160200180806001600160f81b0319815250600101846001600160a01b03166001600160a01b031660601b815260140183815260200182805190602001908083835b60208310611d8a5780518252601f199092019160209182019101611d6b565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040528051906020012060001c92505050949350505050565b6060600284511015611e2f576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b8351604051908082528060200260200182016040528015611e5a578160200160208202803883390190505b5090508481600081518110611e6b57fe5b60200260200101818152505060005b6001855103811015611f0557600080611ebe89888581518110611e9957fe5b6020026020010151898660010181518110611eb057fe5b602002602001015189612ace565b91509150611ee1848481518110611ed157fe5b6020026020010151838388612b9e565b848460010181518110611ef057fe5b60209081029190910101525050600101611e7a565b5095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611f945780518252601f199092019160209182019101611f75565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ff6576040519150601f19603f3d011682016040523d82523d6000602084013e611ffb565b606091505b5091509150818015612029575080511580612029575080806020019051602081101561202657600080fd5b50515b6120645760405162461bcd60e51b81526004018080602001828103825260248152602001806132dd6024913960400191505060405180910390fd5b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526120be908490612c8d565b505050565b6000546001145b90565b60005b6001845103811015612064576000808583815181106120eb57fe5b602002602001015186846001018151811061210257fe5b602002602001015191509150600061211a83836129f0565b509050600088856001018151811061212e57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461215c57826000612160565b6000835b91509150600060028b510388106121775789612199565b6121998d878d8b6002018151811061218b57fe5b60200260200101518c611cb9565b90506121a78d88888c611cb9565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156121e4576020820181803883390190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561225557818101518382015260200161223d565b50505050905090810190601f1680156122825780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156122a457600080fd5b505af11580156122b8573d6000803e3d6000fd5b5050600190990198506120d0975050505050505050565b6006546000906001600160a01b03848116911614156122f957506001600160a01b0381163161237e565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561234f57600080fd5b505afa158015612363573d6000803e3d6000fd5b505050506040513d602081101561237957600080fd5b505190505b92915050565b6006546001600160a01b03848116911614156123d6576040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156123d0573d6000803e3d6000fd5b506120be565b6120be83838361262a565b6000826123f05750600061237e565b828202828482816123fd57fe5b041461243a5760405162461bcd60e51b81526004018080602001828103825260218152602001806132206021913960400191505060405180910390fd5b9392505050565b6000808211612497576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816124a257fe5b04949350505050565b6060600284511015612504576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b835160405190808252806020026020018201604052801561252f578160200160208202803883390190505b509050848160018351038151811061254357fe5b60209081029190910101528351600019015b8015611f05576000806125858988600186038151811061257157fe5b6020026020010151898681518110611eb057fe5b915091506125a884848151811061259857fe5b6020026020010151838388612e4b565b8460018503815181106125b757fe5b6020908102919091010152505060001901612555565b600082821115612624576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106126a75780518252601f199092019160209182019101612688565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612709576040519150601f19603f3d011682016040523d82523d6000602084013e61270e565b606091505b509150915081801561273c57508051158061273c575080806020019051602081101561273957600080fd5b50515b61278d576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6006546001600160a01b0384811691161480159061282c575060408051636eb1769f60e11b81526001600160a01b0384811660048301523060248301529151839286169163dd62ed3e916044808301926020929190829003018186803b1580156127fd57600080fd5b505afa158015612811573d6000803e3d6000fd5b505050506040513d602081101561282757600080fd5b505110155b156120be576120be83833084611f0f565b6006546001600160a01b038381169116148015906128d4575060408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b1580156128a657600080fd5b505afa1580156128ba573d6000803e3d6000fd5b505050506040513d60208110156128d057600080fd5b5051155b156128f5576128f56001600160a01b0383168260001963ffffffff612f3a16565b5050565b600c5460408051635c396e8760e11b815290516001600160a01b0390921691829163b872dd0e91600480830192600092919082900301818387803b15801561294057600080fd5b505af1158015612954573d6000803e3d6000fd5b5050600b54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156129a557600080fd5b505afa1580156129b9573d6000803e3d6000fd5b505050506040513d60208110156129cf57600080fd5b5051905080156120be57600b546120be906001600160a01b0316848361262a565b600080826001600160a01b0316846001600160a01b03161415612a445760405162461bcd60e51b81526004018080602001828103825260258152602001806131d36025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610612a64578284612a67565b83835b90925090506001600160a01b038216612ac7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6000806000612add86866129f0565b509050600080612aef89898989611cb9565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612b2757600080fd5b505afa158015612b3b573d6000803e3d6000fd5b505050506040513d6060811015612b5157600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0388811690841614612b8b578082612b8e565b81815b909a909950975050505050505050565b6000808511612bde5760405162461bcd60e51b815260040180806020018281038252602b815260200180613301602b913960400191505060405180910390fd5b600084118015612bee5750600083115b612c295760405162461bcd60e51b81526004018080602001828103825260288152602001806131f86028913960400191505060405180910390fd5b6000612c3b868463ffffffff6123e116565b90506000612c4f828663ffffffff6123e116565b90506000612c7583612c698961271063ffffffff6123e116565b9063ffffffff61304d16565b9050808281612c8057fe5b0498975050505050505050565b612c9f826001600160a01b03166130a7565b612cf0576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612d2e5780518252601f199092019160209182019101612d0f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d90576040519150601f19603f3d011682016040523d82523d6000602084013e612d95565b606091505b509150915081612dec576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612e4557808060200190516020811015612e0857600080fd5b5051612e455760405162461bcd60e51b815260040180806020018281038252602a8152602001806132b3602a913960400191505060405180910390fd5b50505050565b6000808511612e8b5760405162461bcd60e51b815260040180806020018281038252602c8152602001806131a7602c913960400191505060405180910390fd5b600084118015612e9b5750600083115b612ed65760405162461bcd60e51b81526004018080602001828103825260288152602001806131f86028913960400191505060405180910390fd5b6000612efa612710612eee878963ffffffff6123e116565b9063ffffffff6123e116565b90506000612f1284612eee878a63ffffffff6125cd16565b9050612f2f6001828481612f2257fe5b049063ffffffff61304d16565b979650505050505050565b801580612fc0575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612f9257600080fd5b505afa158015612fa6573d6000803e3d6000fd5b505050506040513d6020811015612fbc57600080fd5b5051155b612ffb5760405162461bcd60e51b815260040180806020018281038252603681526020018061332c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526120be908490612c8d565b60008282018381101561243a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906130db5750808214155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061312457805160ff1916838001178555613151565b82800160010185558215613151579182015b82811115613151578251825591602001919060010190613136565b5061315d929150613161565b5090565b6120ca91905b8082111561315d576000815560010161316756fe54726164652072657475726e6564206c657373207468616e20746865206d696e696d756d20616d6f756e74556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a723158207888e9d1b3c36e73b0c18da0c2782e8f30a3ce0a29f545bf11617cb4c414aaa664736f6c634300050b0032

Deployed ByteCode Sourcemap

15024:13795:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28455:10;28469:9;28455:23;;28447:42;;;;;-1:-1:-1;;;28447:42:0;;;;;;;;;;;;-1:-1:-1;;;28447:42:0;;;;;;;;;;;;;;;15024:13795;18506:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18506:209:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;18506:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;18506:209:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18506:209:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;18506:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;18506:209:0;;-1:-1:-1;18506:209:0;;-1:-1:-1;;;;;18506:209:0:i;:::-;;;;-1:-1:-1;;;;;18506:209:0;;;;;;;;;;;;;;21234:2614;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;21234:2614:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;21234:2614:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;21234:2614:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;21234:2614:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;21234:2614:0;;-1:-1:-1;21234:2614:0;;-1:-1:-1;;;;;21234:2614:0:i;19386:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19386:78:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19386:78:0;;:::i;18981:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18981:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18981:97:0;-1:-1:-1;;;;;18981:97:0;;:::i;16803:73::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16803:73:0;;;:::i;19472:130::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19472:130:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19472:130:0;;:::i;23858:2383::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;23858:2383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23858:2383:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23858:2383:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23858:2383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23858:2383:0;;-1:-1:-1;23858:2383:0;;-1:-1:-1;;;;;23858:2383:0:i;16883:76::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16883:76:0;;;:::i;19197:181::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19197:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;19197:181:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;19197:181:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19197:181:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19197:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19197:181:0;;-1:-1:-1;19197:181:0;;-1:-1:-1;;;;;19197:181:0:i;28256:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28256:144:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28256:144:0;-1:-1:-1;;;;;28256:144:0;;:::i;28145:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28145:103:0;;;:::i;19706:1520::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;19706:1520:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;19706:1520:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19706:1520:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19706:1520:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19706:1520:0;;-1:-1:-1;19706:1520:0;;-1:-1:-1;;;;;19706:1520:0:i;16339:74::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16339:74:0;;;:::i;16966:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16966:70:0;;;:::i;19086:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19086:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19086:103:0;-1:-1:-1;;;;;19086:103:0;;:::i;:::-;;;;;;;;;;;;;;;;;;18506:209;18616:12;18648:59;18673:7;18682:6;18690;18698:8;18648:24;:59::i;:::-;18641:66;18506:209;-1:-1:-1;;;;;18506:209:0:o;21234:2614::-;21418:8;18909:15;18897:8;:27;;18889:64;;;;;-1:-1:-1;;;18889:64:0;;;;;;;;;;;;-1:-1:-1;;;18889:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21447:24:0;;21466:4;21447:24;;21439:44;;;;;-1:-1:-1;;;21439:44:0;;;;;;;;;;;;-1:-1:-1;;;21439:44:0;;;;;;;;;;;;;;;21517:1;21502:12;:16;21494:53;;;;;-1:-1:-1;;;21494:53:0;;;;;;;;;;;;-1:-1:-1;;;21494:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21566:19:0;;21595:1;21566:19;;;:10;:19;;;;;:26;;-1:-1:-1;;21566:26:0;;;;;;;;;;;21558:61;;;;;-1:-1:-1;;;21558:61:0;;;;;;;;;;;;-1:-1:-1;;;21558:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21654:19:0;;;;;;:10;:19;;;;;;;;;21630:43;;;;;;-1:-1:-1;;21630:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:43;;;21654:19;21630:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21684:21;21719:4;:11;21708:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;21708:23:0;-1:-1:-1;;;;;;21768:22:0;;21757:8;21768:22;;;:13;:22;;;;;;21684:47;;-1:-1:-1;21815:70:0;21782:7;21855:8;21865:4;21871:8;21768:22;21815:30;:70::i;:::-;21805:80;;18964:1;21946:12;21915:7;21940:1;21923:7;:14;:18;21915:27;;;;;;;;;;;;;;:43;;21907:99;;;;-1:-1:-1;;;21907:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22019:17;22039:61;22064:7;22073:4;22078:1;22073:7;;;;;;;;;;;;;;22082:4;22087:1;22082:7;;;;;;;;;;;;;;22091:8;22039:24;:61::i;:::-;22135:9;;22019:81;;-1:-1:-1;;;;;;22115:29:0;;;22135:9;;22115:29;22111:339;;22169:9;:14;22161:32;;;;;-1:-1:-1;;;22161:32:0;;;;;;;;;;;;-1:-1:-1;;;22161:32:0;;;;;;;;;;;;;;;22208:67;22233:7;22243:10;22255:9;22266:8;22208:16;:67::i;:::-;22111:339;;;16371:42;22308:22;;22345:9;;;;;;;;;-1:-1:-1;;;;;22345:9:0;-1:-1:-1;;;;;22345:17:0;;22369:9;22345:36;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22345:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;22396:42:0;;-1:-1:-1;;;;;;;;22396:20:0;;;-1:-1:-1;22417:9:0;22428;22396:20;:42::i;:::-;22464:10;:8;:10::i;:::-;22460:1251;;;22510:54;22516:7;22525;22534:4;22548;22555:8;22510:5;:54::i;:::-;22621:9;;-1:-1:-1;;;;;22600:30:0;;;22621:9;;22600:30;22596:125;;;22651:9;;22670:34;;;-1:-1:-1;;;22670:34:0;;22698:4;22670:34;;;;;;-1:-1:-1;;;;;22651:9:0;;;;:18;;:9;;22670:19;;:34;;;;;;;;;;;;;;;22651:9;22670:34;;;5:2:-1;;;;30:1;27;20:12;5:2;22670:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22670:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22670:34:0;22651:54;;;-1:-1:-1;;;;;;22651:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22651:54:0;;;;;;;-1:-1:-1;22651:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;22651:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22651:54:0;;;;22596:125;22737:19;22759:36;22771:8;22789:4;22759:11;:36::i;:::-;22737:58;;22833:12;22818:11;:27;;22810:83;;;;-1:-1:-1;;;22810:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22910:16;22929:35;22941:7;22958:4;22929:11;:35::i;:::-;22910:54;-1:-1:-1;22983:12:0;;22979:93;;23016:40;23026:7;23035:10;23047:8;23016:9;:40::i;:::-;23086:83;23096:8;23106:10;23118:50;23153:14;;23118:30;23134:13;;23118:11;:15;;:30;;;;:::i;:::-;:34;:50;:34;:50;:::i;:::-;23086:9;:83::i;:::-;23204:7;;23242:14;;23229:7;;23184:74;;23194:8;;-1:-1:-1;;;;;23204:7:0;;;;23213:44;;23242:14;23213:24;;:11;;:24;:15;:24;:::i;23184:74::-;22460:1251;;;;;23318:9;;-1:-1:-1;;;;;23297:30:0;;;23318:9;;23297:30;23293:405;;;23348:54;23354:7;23363;23372:4;23386;23393:8;23348:5;:54::i;:::-;23443:9;;:34;;;-1:-1:-1;;;23443:34:0;;23471:4;23443:34;;;;;;23421:19;;-1:-1:-1;;;;;23443:9:0;;:19;;:34;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;23443:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23443:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23443:34:0;23496:9;;:31;;;-1:-1:-1;;;23496:31:0;;;;;;;;;;23443:34;;-1:-1:-1;;;;;;23496:9:0;;;;:18;;:31;;;;;:9;;:31;;;;;;;;:9;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;23496:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23496:31:0;;;;23546:44;23556:8;23566:10;23578:11;23546:9;:44::i;:::-;23293:405;;;;23631:51;23637:7;23646;23655:4;23661:10;23673:8;23631:5;:51::i;:::-;23791:10;-1:-1:-1;;;;;23726:114:0;23780:8;-1:-1:-1;;;;;23726:114:0;23762:7;-1:-1:-1;;;;;23726:114:0;;23803:7;23812;23837:1;23820:7;:14;:18;23812:27;;;;;;;;;;;;;;;;;;;23726:114;;;-1:-1:-1;;;;;23726:114:0;;;;;;;;;;;;;;;;;;18964:1;;;21234:2614;;;;;;;;:::o;19386:78::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;19445:7;:11;19386:78::o;18981:97::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19044:17:0;;;;;:9;:17;;;;;:24;;-1:-1:-1;;19044:24:0;19064:4;19044:24;;;18981:97::o;16803:73::-;;;-1:-1:-1;;;;;16803:73:0;;:::o;19472:130::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;19547:1;19541:3;:7;:20;;;;;19559:2;19552:3;:9;;19541:20;19533:37;;;;;-1:-1:-1;;;19533:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;19533:37:0;;;;;;;;;;;;;;;19581:7;:13;19472:130::o;23858:2383::-;24042:8;18909:15;18897:8;:27;;18889:64;;;;;-1:-1:-1;;;18889:64:0;;;;;;;;;;;;-1:-1:-1;;;18889:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24071:24:0;;24090:4;24071:24;;24063:44;;;;;-1:-1:-1;;;24063:44:0;;;;;;;;;;;;-1:-1:-1;;;24063:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24126:19:0;;24155:1;24126:19;;;:10;:19;;;;;:26;;-1:-1:-1;;24126:26:0;;;;;;;;;;;24118:61;;;;;-1:-1:-1;;;24118:61:0;;;;;;;;;;;;-1:-1:-1;;;24118:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24214:19:0;;;;;;:10;:19;;;;;;;;;24190:43;;;;;;-1:-1:-1;;24190:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:43;;;24214:19;24190:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24244:21;24279:4;:11;24268:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;24268:23:0;-1:-1:-1;;;;;;24328:22:0;;24317:8;24328:22;;;:13;:22;;;;;;24244:47;;-1:-1:-1;24375:70:0;24342:7;24414:9;24425:4;24431:8;24328:22;24375:29;:70::i;:::-;24365:80;;18964:1;24489:11;24475:7;24483:1;24475:10;;;;;;;;;;;;;;:25;;24467:77;;;;-1:-1:-1;;;24467:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24557:17;24577:61;24602:7;24611:4;24616:1;24611:7;;;;;;;24577:61;24673:9;;24557:81;;-1:-1:-1;;;;;;24653:29:0;;;24673:9;;24653:29;24649:433;;24707:9;:14;24699:32;;;;;-1:-1:-1;;;24699:32:0;;;;;;;;;;;;-1:-1:-1;;;24699:32:0;;;;;;;;;;;;;;;24746:69;24771:7;24781:10;24793:9;24804:7;24812:1;24804:10;;;;;;;;;;;;;;24746:16;:69::i;:::-;24649:433;;;24870:9;24856:7;24864:1;24856:10;;;;;;;;;;;;;;:23;;24848:75;;;;-1:-1:-1;;;24848:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24975:9;;24999:10;;16371:42;;-1:-1:-1;;;;;;24975:9:0;;;;:17;;24999:7;;24975:9;;24999:10;;;;;;;;;;24975:37;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24975:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24975:37:0;;;;;25027:43;25048:9;25059:7;25067:1;25059:10;;;;;;;;;;;;;;25027:7;-1:-1:-1;;;;;25027:20:0;;;:43;;;;;:::i;:::-;25096:10;:8;:10::i;:::-;25092:898;;;25142:54;25148:7;25157;25166:4;25180;25187:8;25142:5;:54::i;:::-;25253:9;;-1:-1:-1;;;;;25232:30:0;;;25253:9;;25232:30;25228:125;;;25283:9;;25302:34;;;-1:-1:-1;;;25302:34:0;;25330:4;25302:34;;;;;;-1:-1:-1;;;;;25283:9:0;;;;:18;;:9;;25302:19;;:34;;;;;;;;;;;;;;;25283:9;25302:34;;;5:2:-1;;;;30:1;27;20:12;5:2;25302:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25302:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25302:34:0;25283:54;;;-1:-1:-1;;;;;;25283:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25283:54:0;;;;;;;-1:-1:-1;25283:54:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;25283:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25283:54:0;;;;25228:125;25369:81;25379:8;25389:10;25401:48;25434:14;;25401:28;25415:13;;25401:9;:13;;:28;;;;:::i;25369:81::-;25485:7;;25521:14;;25508:7;;25465:72;;25475:8;;-1:-1:-1;;;;;25485:7:0;;;;25494:42;;25521:14;25494:22;;:9;;:22;:13;:22;:::i;25465:72::-;25092:898;;;25597:9;;-1:-1:-1;;;;;25576:30:0;;;25597:9;;25576:30;25572:405;;;25627:54;25633:7;25642;25651:4;25665;25672:8;25627:5;:54::i;:::-;25722:9;;:34;;;-1:-1:-1;;;25722:34:0;;25750:4;25722:34;;;;;;25700:19;;-1:-1:-1;;;;;25722:9:0;;:19;;:34;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;25722:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25722:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25722:34:0;25775:9;;:31;;;-1:-1:-1;;;25775:31:0;;;;;;;;;;25722:34;;-1:-1:-1;;;;;;25775:9:0;;;;:18;;:31;;;;;:9;;:31;;;;;;;;:9;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;25775:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25775:31:0;;;;25825:44;25835:8;25845:10;25857:11;25825:9;:44::i;:::-;25572:405;;;;25910:51;25916:7;25925;25934:4;25940:10;25952:8;25910:5;:51::i;:::-;26016:7;26024:1;26016:10;;;;;;;;;;;;;;26004:9;:22;26000:120;;;26062:10;-1:-1:-1;;;;;26062:19:0;:46;26082:25;26096:7;26104:1;26096:10;;;;;;;;;;;;;;26082:9;:13;;:25;;;;:::i;:::-;26062:46;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26062:46:0;26000:120;26137:96;;;-1:-1:-1;;;;;26137:96:0;;;;;;;;;;;;;26202:10;;26137:96;;;;;;;;;;;;;;;;;;;18964:1;;;23858:2383;;;;;;;;:::o;16883:76::-;;;-1:-1:-1;;;;;16883:76:0;;:::o;19197:181::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19299:20:0;;;;;;:10;:20;;;;;;;;:31;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;19341:23:0;;;;;;;:13;:23;;;;;:29;19197:181::o;28256:144::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;28324:68;28345:3;28351:10;28363:3;-1:-1:-1;;;;;28363:13:0;;28385:4;28363:28;;;;;;;;;;;;;-1:-1:-1;;;;;28363:28:0;-1:-1:-1;;;;;28363:28:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28363:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28363:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28363:28:0;28324:12;:68::i;:::-;28256:144;:::o;28145:103::-;18776:6;;-1:-1:-1;;;;;18776:6:0;18763:9;:19;18755:64;;;;;-1:-1:-1;;;18755:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18755:64:0;;;;;;;;;;;;;;;28198:42;;:10;;28226:4;28218:21;28198:42;;;;;;;;;28218:21;28198:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19706:1520:0;-1:-1:-1;;;;;19869:23:0;;19887:4;19869:23;;19861:43;;;;;-1:-1:-1;;;19861:43:0;;;;;;;;;;;;-1:-1:-1;;;19861:43:0;;;;;;;;;;;;;;;19938:1;19923:12;:16;19915:53;;;;;-1:-1:-1;;;19915:53:0;;;;;;;;;;;;-1:-1:-1;;;19915:53:0;;;;;;;;;;;;;;;19987:16;19996:6;19987:8;:16::i;:::-;19979:51;;;;;-1:-1:-1;;;19979:51:0;;;;;;;;;;;;-1:-1:-1;;;19979:51:0;;;;;;;;;;;;;;;20067:9;;-1:-1:-1;;;;;20047:29:0;;;20067:9;;20047:29;20043:156;;20101:9;:14;20093:32;;;;;-1:-1:-1;;;20093:32:0;;;;;;;;;;;;-1:-1:-1;;;20093:32:0;;;;;;;;;;;;;;;20140:47;20157:7;20166:10;20178:8;20140:16;:47::i;:::-;20211:24;20219:7;20228:6;20211:7;:24::i;:::-;20263:12;20280:6;-1:-1:-1;;;;;20280:11:0;20298:9;20309:4;20280:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20280:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20262:52:0;;;20333:7;20325:32;;;;;-1:-1:-1;;;20325:32:0;;;;;;;;;;;;-1:-1:-1;;;20325:32:0;;;;;;;;;;;;;;;20370:19;20392:36;20404:8;20422:4;20392:11;:36::i;:::-;20370:58;;20462:12;20447:11;:27;;20439:83;;;;-1:-1:-1;;;20439:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20572:16;20591:35;20603:7;20620:4;20591:11;:35::i;:::-;20572:54;-1:-1:-1;20641:12:0;;20637:85;;20670:40;20680:7;20689:10;20701:8;20670:9;:40::i;:::-;20738:10;:8;:10::i;:::-;20734:292;;;20765:83;20775:8;20785:10;20797:50;20832:14;;20797:30;20813:13;;20797:11;:15;;:30;;;;:::i;20765:83::-;20883:7;;20921:14;;20908:7;;20863:74;;20873:8;;-1:-1:-1;;;;;20883:7:0;;;;20892:44;;20921:14;20892:24;;:11;;:24;:15;:24;:::i;20863:74::-;20734:292;;;20970:44;20980:8;20990:10;21002:11;20970:9;:44::i;:::-;21041:84;;;-1:-1:-1;;;;;21041:84:0;;;;;;;;;;;;;21093:10;;21041:84;;;;;;;;;;;;;;;;;;;21152:10;;-1:-1:-1;;;;;21142:20:0;;;21152:10;;21142:20;21138:81;;;21179:28;21196:10;21179:16;:28::i;:::-;19706:1520;;;;;;;;;:::o;16339:74::-;16371:42;16339:74;:::o;16966:70::-;;;-1:-1:-1;;;;;16966:70:0;;:::o;19086:103::-;-1:-1:-1;;;;;19164:17:0;19141:4;19164:17;;;:9;:17;;;;;;;;;19086:103::o;11103:440::-;11215:12;11241:14;11257;11275:26;11286:6;11294;11275:10;:26::i;:::-;11240:61;;;;11403:7;11456:6;11464;11439:32;;;;;;-1:-1:-1;;;;;11439:32:0;-1:-1:-1;;;;;11439:32:0;;;;;;;;-1:-1:-1;;;;;11439:32:0;-1:-1:-1;;;;;11439:32:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11439:32:0;;;11429:43;;;;;;11491:8;11342:190;;;;;;-1:-1:-1;;;;;;11342:190:0;;;;;;-1:-1:-1;;;;;11342:190:0;-1:-1:-1;;;;;11342:190:0;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11342:190:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11342:190:0;;;11332:201;;;;;;11327:207;;11312:223;;11103:440;;;;;;;;:::o;13361:559::-;13495:21;13552:1;13537:4;:11;:16;;13529:59;;;;;-1:-1:-1;;;13529:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13620:4;:11;13609:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13609:23:0;;13599:33;;13656:8;13643:7;13651:1;13643:10;;;;;;;;;;;;;:21;;;;;13680:6;13675:238;13706:1;13692:4;:11;:15;13688:1;:19;13675:238;;;13730:14;13746:15;13765:52;13777:7;13786:4;13791:1;13786:7;;;;;;;;;;;;;;13795:4;13800:1;13804;13800:5;13795:11;;;;;;;;;;;;;;13808:8;13765:11;:52::i;:::-;13729:88;;;;13849:52;13862:7;13870:1;13862:10;;;;;;;;;;;;;;13874:9;13885:10;13897:3;13849:12;:52::i;:::-;13832:7;13840:1;13844;13840:5;13832:14;;;;;;;;;;;;;;;;;:69;-1:-1:-1;;13709:3:0;;13675:238;;;;13361:559;;;;;;;:::o;15887:323::-;16033:51;;;-1:-1:-1;;;;;16033:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16033:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;16022:63:0;;;;15987:12;;16001:17;;16022:10;;;;16033:51;16022:63;;;25:18:-1;16022:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16022:63:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15986:99:0;;;;16104:7;:57;;;;-1:-1:-1;16116:11:0;;:16;;:44;;;16147:4;16136:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16136:24:0;16116:44;16096:106;;;;-1:-1:-1;;;16096:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15887:323;;;;;;:::o;7699:176::-;7808:58;;;-1:-1:-1;;;;;7808:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7808:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;7782:85:0;;7801:5;;7782:18;:85::i;:::-;7699:176;;;:::o;19610:86::-;19653:4;19676:7;19687:1;19676:12;19610:86;;:::o;27338:799::-;27489:6;27484:646;27515:1;27501:4;:11;:15;27497:1;:19;27484:646;;;27539:13;27554:14;27573:4;27578:1;27573:7;;;;;;;;;;;;;;27582:4;27587:1;27591;27587:5;27582:11;;;;;;;;;;;;;;27538:56;;;;27610:14;27629:42;27657:5;27664:6;27629:27;:42::i;:::-;27609:62;;;27686:14;27703:7;27711:1;27715;27711:5;27703:14;;;;;;;;;;;;;;27686:31;;27733:15;27750;27778:6;-1:-1:-1;;;;;27769:15:0;:5;-1:-1:-1;;;;;27769:15:0;;:61;;27811:9;27827:1;27769:61;;;27793:1;27797:9;27769:61;27732:98;;;;27845:10;27876:1;27862:4;:11;:15;27858:1;:19;:92;;27947:3;27858:92;;;27880:64;27905:7;27914:6;27922:4;27927:1;27931;27927:5;27922:11;;;;;;;;;;;;;;27935:8;27880:24;:64::i;:::-;27845:105;;27980:58;28005:7;28014:5;28021:6;28029:8;27980:24;:58::i;:::-;-1:-1:-1;;;;;27965:79:0;;28063:10;28075;28087:2;28101:1;28091:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;28091:12:0;87:34:-1;135:17;;-1:-1;28091:12:0;;27965:153;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27965:153:0;-1:-1:-1;;;;;27965:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27965:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27965:153:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27518:3:0;;;;;-1:-1:-1;27484:646:0;;-1:-1:-1;;;;;;;;27484:646:0;26827:236;26938:9;;26898:7;;-1:-1:-1;;;;;26922:25:0;;;26938:9;;26922:25;26918:138;;;-1:-1:-1;;;;;;26971:13:0;;;26964:20;;26918:138;27024:3;-1:-1:-1;;;;;27024:13:0;;27038:5;27024:20;;;;;;;;;;;;;-1:-1:-1;;;;;27024:20:0;-1:-1:-1;;;;;27024:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27024:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27024:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27024:20:0;;-1:-1:-1;26918:138:0;26827:236;;;;:::o;27071:257::-;27183:9;;-1:-1:-1;;;;;27167:25:0;;;27183:9;;27167:25;27163:158;;;27209:24;;-1:-1:-1;;;;;27209:17:0;;;:24;;;;;27227:5;;27209:24;;;;27227:5;27209:17;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27209:24:0;27163:158;;;27266:43;27287:3;27293:8;27303:5;27266:12;:43::i;3909:470::-;3967:7;4211:6;4207:47;;-1:-1:-1;4241:1:0;4234:8;;4207:47;4278:5;;;4282:1;4278;:5;:1;4302:5;;;;;:10;4294:56;;;;-1:-1:-1;;;4294:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;3909:470;-1:-1:-1;;;3909:470:0:o;4847:333::-;4905:7;5004:1;5000;:5;4992:44;;;;;-1:-1:-1;;;4992:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5047:9;5063:1;5059;:5;;;;;;;4847:333;-1:-1:-1;;;;4847:333:0:o;14001:580::-;14135:21;14192:1;14177:4;:11;:16;;14169:59;;;;;-1:-1:-1;;;14169:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14260:4;:11;14249:23;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;14249:23:0;;14239:33;;14313:9;14283:7;14308:1;14291:7;:14;:18;14283:27;;;;;;;;;;;;;;;;;:39;14347:11;;-1:-1:-1;;14347:15:0;14333:241;14364:5;;14333:241;;14392:14;14408:15;14427:52;14439:7;14448:4;14457:1;14453;:5;14448:11;;;;;;;;;;;;;;14461:4;14466:1;14461:7;;;;;;;14427:52;14391:88;;;;14511:51;14523:7;14531:1;14523:10;;;;;;;;;;;;;;14535:9;14546:10;14558:3;14511:11;:51::i;:::-;14494:7;14506:1;14502;:5;14494:14;;;;;;;;;;;;;;;;;:68;-1:-1:-1;;;;14371:3:0;14333:241;;3474:184;3532:7;3565:1;3560;:6;;3552:49;;;;;-1:-1:-1;;;3552:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3624:5:0;;;3474:184::o;15582:297::-;15713:45;;;-1:-1:-1;;;;;15713:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15713:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;15702:57:0;;;;15667:12;;15681:17;;15702:10;;;;15713:45;15702:57;;;25:18:-1;15702:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15702:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15666:93:0;;;;15778:7;:57;;;;-1:-1:-1;15790:11:0;;:16;;:44;;;15821:4;15810:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15810:24:0;15790:44;15770:101;;;;;-1:-1:-1;;;15770:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15582:297;;;;;:::o;26251:305::-;26377:9;;-1:-1:-1;;;;;26361:25:0;;;26377:9;;26361:25;;;;:86;;-1:-1:-1;26399:35:0;;;-1:-1:-1;;;26399:35:0;;-1:-1:-1;;;;;26399:35:0;;;;;;;26428:4;26399:35;;;;;;26438:9;;26399:13;;;;;:35;;;;;;;;;;;;;;:13;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;26399:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26399:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26399:35:0;:48;;26361:86;26343:206;;;26474:63;26499:3;26505:5;26520:4;26527:9;26474:16;:63::i;26564:255::-;26665:9;;-1:-1:-1;;;;;26649:25:0;;;26665:9;;26649:25;;;;:85;;-1:-1:-1;26691:38:0;;;-1:-1:-1;;;26691:38:0;;26713:4;26691:38;;;;-1:-1:-1;;;;;26691:38:0;;;;;;;;;:13;;;;;;:38;;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;26691:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26691:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26691:38:0;:43;26649:85;26631:181;;;26761:39;-1:-1:-1;;;;;26761:15:0;;26777:8;-1:-1:-1;;26761:39:0;:15;:39;:::i;:::-;26564:255;;:::o;28505:311::-;28604:16;;28632:20;;;-1:-1:-1;;;28632:20:0;;;;-1:-1:-1;;;;;28604:16:0;;;;;;28632:18;;:20;;;;;28565;;28632;;;;;;;28565;28604:16;28632:20;;;5:2:-1;;;;30:1;27;20:12;5:2;28632:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28683:13:0;;28676:46;;;-1:-1:-1;;;28676:46:0;;28716:4;28676:46;;;;;;28663:10;;-1:-1:-1;;;;;;28683:13:0;;;;-1:-1:-1;28676:31:0;;:46;;;;;;;;;;;;;;28683:13;28676:46;;;5:2:-1;;;;30:1;27;20:12;5:2;28676:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28676:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28676:46:0;;-1:-1:-1;28737:6:0;;28733:76;;28773:13;;28760:37;;-1:-1:-1;;;;;28773:13:0;28788:4;28794:2;28760:12;:37::i;10662:349::-;10737:14;10753;10798:6;-1:-1:-1;;;;;10788:16:0;:6;-1:-1:-1;;;;;10788:16:0;;;10780:66;;;;-1:-1:-1;;;10780:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10885:6;-1:-1:-1;;;;;10876:15:0;:6;-1:-1:-1;;;;;10876:15:0;;:53;;10914:6;10922;10876:53;;;10895:6;10903;10876:53;10857:72;;-1:-1:-1;10857:72:0;-1:-1:-1;;;;;;10948:20:0;;10940:63;;;;;-1:-1:-1;;;10940:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10662:349;;;;;:::o;11601:424::-;11717:13;11732;11759:14;11778:26;11789:6;11797;11778:10;:26::i;:::-;11758:46;;;11816:13;11831;11864:42;11872:7;11881:6;11889;11897:8;11864:7;:42::i;:::-;-1:-1:-1;;;;;11849:70:0;;:72;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11849:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11849:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11849:72:0;;;;;;;11815:106;;;;;-1:-1:-1;11815:106:0;;-1:-1:-1;;;;;;11955:16:0;;;;;;;:62;;11998:8;12008;11955:62;;;11975:8;11985;11955:62;11932:85;;;;-1:-1:-1;11601:424:0;-1:-1:-1;;;;;;;;11601:424:0:o;12147:528::-;12250:14;12296:1;12285:8;:12;12277:68;;;;-1:-1:-1;;;12277:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12376:1;12364:9;:13;:31;;;;;12394:1;12381:10;:14;12364:31;12356:84;;;;-1:-1:-1;;;12356:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12451:20;12474:17;:8;12487:3;12474:17;:12;:17;:::i;:::-;12451:40;-1:-1:-1;12502:14:0;12519:31;12451:40;12539:10;12519:31;:19;:31;:::i;:::-;12502:48;-1:-1:-1;12561:16:0;12580:41;12605:15;12580:20;:9;12594:5;12580:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;12561:60;;12656:11;12644:9;:23;;;;;;;12147:528;-1:-1:-1;;;;;;;;12147:528:0:o;9109:1113::-;9713:27;9721:5;-1:-1:-1;;;;;9713:25:0;;:27::i;:::-;9705:71;;;;;-1:-1:-1;;;9705:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9850:12;9864:23;9899:5;-1:-1:-1;;;;;9891:19:0;9911:4;9891:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9891:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9849:67:0;;;;9935:7;9927:52;;;;;-1:-1:-1;;;9927:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:17;;:21;9992:223;;10137:10;10126:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10126:30:0;10118:85;;;;-1:-1:-1;;;10118:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9109:1113;;;;:::o;12796:483::-;12899:13;12945:1;12933:9;:13;12925:70;;;;-1:-1:-1;;;12925:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13026:1;13014:9;:13;:31;;;;;13044:1;13031:10;:14;13014:31;13006:84;;;;-1:-1:-1;;;13006:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13101:14;13118:35;13147:5;13118:24;:9;13132;13118:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13101:52;-1:-1:-1;13164:16:0;13183:34;13213:3;13183:25;:10;13198:9;13183:25;:14;:25;:::i;:34::-;13164:53;;13239:32;13269:1;13252:11;13240:9;:23;;;;;;;13239:32;:29;:32;:::i;:::-;13228:43;12796:483;-1:-1:-1;;;;;;;12796:483:0:o;8095:621::-;8465:10;;;8464:62;;-1:-1:-1;8481:39:0;;;-1:-1:-1;;;8481:39:0;;8505:4;8481:39;;;;-1:-1:-1;;;;;8481:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;8481:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8481:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8481:39:0;:44;8464:62;8456:152;;;;-1:-1:-1;;;8456:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8645:62;;;-1:-1:-1;;;;;8645:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8645:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8619:89:0;;8638:5;;8619:18;:89::i;3018:181::-;3076:7;3108:5;;;3132:6;;;;3124:46;;;;;-1:-1:-1;;;3124:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6324:808;6384:4;7042:20;;6886:66;7081:15;;;;;:42;;;7112:11;7100:8;:23;;7081:42;7073:51;6324:808;-1:-1:-1;;;;6324:808:0:o;15024:13795::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15024:13795:0;;;-1:-1:-1;15024:13795:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://7888e9d1b3c36e73b0c18da0c2782e8f30a3ce0a29f545bf11617cb4c414aaa6
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading