Contract 0x9675064a9b93dC4156366A4E5f1400185D751375

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x252fc856cbf2b3d07547b7bc0e8dc834a402618373e65e0a78047486a33de38bZap In AVAX202368892022-09-24 23:58:516 days 3 hrs ago0x183ca219c5873e0a0a2ba7aa680a762d66f0fa29 IN  0x9675064a9b93dc4156366a4e5f1400185d7513751 AVAX0.0152457415 26.5
0x1b5a6bee362d4385453793c2ad4310577287b138c40cf6d93d309eda21d5afefZap In198627042022-09-14 11:13:3116 days 15 hrs ago0x53ea7731a71d662f0419a92f0f8ac7f8142f4ca2 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.013918648 26.5
0x2b82f2ad8ccedd80784da007d557254609620a952f2579767b7218dc6595bedaZap In196882912022-09-08 18:30:4522 days 8 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.01406150271 26.41
0xe450157b894a7066176798ce1d9ad8ec18d4eddf876b36c502043f12531a381fZap In196882162022-09-08 18:26:2622 days 8 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.01406123861 26.41
0x0ef7e0869d618188f5b765849e017849b97e2895d8e2662d13501a43d363fed9Zap In194730452022-09-03 5:02:2327 days 21 hrs ago0xc979f3f9446201aa5c24303374e1a9e5d6b75c48 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.0133267175 26.5
0x6de64d939da8dc0662642487532cfdc522b3f26496005f25397949bc65ae7458Zap In AVAX194179822022-09-01 22:05:3129 days 4 hrs ago0xc979f3f9446201aa5c24303374e1a9e5d6b75c48 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750.158464878014645 AVAX0.0140430125 26.5
0x2ee32a65279f9f949359d6514ee446580830cc8f196a5de4f4336a67e8e33df6Zap In AVAX189232672022-08-21 8:30:3440 days 18 hrs ago0xd19e977b4f2d1175a47ab91fb86d9e53ed71ed9c IN  0x9675064a9b93dc4156366a4e5f1400185d7513752 AVAX0.015916748 26.5
0xdf6201a68b21b9ec4741c59b3b39b316a668a69a1efa9c9dd66185406062deddZap In AVAX188984052022-08-20 18:32:2741 days 8 hrs ago0xe368437cf2745cbe375ba4ae31e235345509dc9c IN  0x9675064a9b93dc4156366a4e5f1400185d7513750.420863494115954 AVAX0.0142048745 26.5
0xd3739b88f1342299076785e29d930f0bde6f710fa6c281ca3a4bbdabdee73cafZap In AVAX188580802022-08-19 19:56:4842 days 7 hrs ago0x5119983ccc63c3bbad68efeccb98fd366502b182 IN  0x9675064a9b93dc4156366a4e5f1400185d7513754.2 AVAX0.0147923265 26.5
0xcdd5fd9580f7c4535c85694169fab86b5dc660f750526844a0643f21e9f631e1Zap In AVAX185536462022-08-12 16:21:5849 days 10 hrs ago0x8cf13ed1fe6721705ae9c67ad81e8cd8b11d75b2 IN  0x9675064a9b93dc4156366a4e5f1400185d7513755 AVAX0.0135905515 26.5
0xa0cf7a0c22f8652498a570e6c428e26ab4fbd63b8e8c902ce519f329a73945abZap In AVAX184432002022-08-10 2:39:5952 days 21 mins ago0x35bd834605344886b1a463ea35c702da87865815 IN  0x9675064a9b93dc4156366a4e5f1400185d7513754.85 AVAX0.0147925915 26.5
0xaa253be34b0aede97613789f6de401d3ad27b12e9df8eefbd7e421abbf997a2aZap In AVAX184203322022-08-09 13:51:4952 days 13 hrs ago0x9d2da9a98af5cbaed356e190c2e05dca21aba63e IN  0x9675064a9b93dc4156366a4e5f1400185d7513751.5 AVAX0.0152454765 26.5
0x2966b82bd50aa2736f6d9f1d3c1f8a9a4f16a3c3c3d4e83c18f3123f01bd2745Zap In AVAX182617432022-08-05 21:02:3356 days 5 hrs ago0xd19e977b4f2d1175a47ab91fb86d9e53ed71ed9c IN  0x9675064a9b93dc4156366a4e5f1400185d7513754.537550883382137 AVAX0.0151188065 26.5
0x523cb3bb727be2d627c5048df66916ac0787653dc37407e4ea26633519218b2bZap In179567222022-07-29 15:35:0963 days 11 hrs ago0x05e5ab383f3c2d423cfd118b83420261ab0990bc IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.0138437 26
0x939972c8eb3ef325c218b00729f6055370d135bd512a6f6faeda19c3d1cfdcf6Zap In173649352022-07-15 16:02:2877 days 10 hrs ago0xc53943ef6d1f15329aad1006dbe2ed3dc2d5ef4a IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.0154065965 26.5
0xe0a749c7e6f143f13dd7b7fbb5592db0c340382590aa085e1e389a88552ad8e2Zap In172879442022-07-13 21:01:1979 days 6 hrs ago0x702816268ad970c41edc3f880e4b657b9dec0acd IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.0142997445 26.5
0xf05ba595591958793e997759e6e70ede23147b730a6ebb0cb6c2c9c64c7b1481Zap In AVAX172367422022-07-12 16:30:0280 days 10 hrs ago0x594e7eb84465eb1356bfa955f25512ba193cffee IN  0x9675064a9b93dc4156366a4e5f1400185d7513751.490337060949698 AVAX0.013661592655 26.3254
0xe7230acf233a94430d0dbf114f4abe82bf2836a9eda031312d62a6fdf2d08ccdZap In AVAX172364052022-07-12 16:18:4580 days 10 hrs ago0x594e7eb84465eb1356bfa955f25512ba193cffee IN  0x9675064a9b93dc4156366a4e5f1400185d7513752.994828196222614 AVAX0.01415737101 26.41
0x44134f2c23a7a71651b7542b35e7f4eb3a7375d6bae44fd981770ba3fe2de231Zap In172363032022-07-12 16:15:2180 days 10 hrs ago0x594e7eb84465eb1356bfa955f25512ba193cffee IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.01508058538 26.41
0x92e82c2a5cb81361894ece27c038b221cb23ff9f9626498ece1727dd122a1364Zap In AVAX161973392022-06-18 13:36:19104 days 13 hrs ago0xce2ffdc315f41464aa6d216948a67dfebeb1ec15 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750.131361116141659 AVAX0.014569463726.1
0xab701386be137185afeb117442ff61473153d1303bdc3c45d82ab7323c290e07Zap In AVAX159767142022-06-13 12:27:11109 days 14 hrs ago0x37c7622bc992f01ef28f8a31d836ea31be133141 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750.209320180280868 AVAX0.013677445 26.5
0xfbc74727d26c919311e78c9b6b620ab856ed505aa20fdbe684a05726c7429c9aZap In AVAX158149092022-06-09 19:05:47113 days 7 hrs ago0x37c7622bc992f01ef28f8a31d836ea31be133141 IN  0x9675064a9b93dc4156366a4e5f1400185d75137520.2 AVAX0.0147932805 26.5
0x5d1c08844a90855e7c41472b5440c7e92f7c1a093b132f9b7d40fbb36f8fc921Zap In157363982022-06-07 23:16:21115 days 3 hrs ago0x5f925586297c83744d0d9b5286bcce8243de7123 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.015519999475 27.425
0xcf121ac43e3c1f460e882808179c35e789267c3cd1c0e23228a2ec9ca5dec7efZap In AVAX149615952022-05-20 22:42:34133 days 4 hrs ago0x2cc600a35a5ec67aa332dec448a8f6d64f888588 IN  0x9675064a9b93dc4156366a4e5f1400185d7513750.894896584 AVAX0.015580819892 27.082430012
0x53ffd86f2d3497811b66532d019b1a24ed83a430f5c0214a84eb93a23c2adadaZap In149369472022-05-20 9:05:56133 days 17 hrs ago0x594e7eb84465eb1356bfa955f25512ba193cffee IN  0x9675064a9b93dc4156366a4e5f1400185d7513750 AVAX0.014602458 26
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x252fc856cbf2b3d07547b7bc0e8dc834a402618373e65e0a78047486a33de38b202368892022-09-24 23:58:516 days 3 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750x183ca219c5873e0a0a2ba7aa680a762d66f0fa290.000001117593954994 AVAX
0x252fc856cbf2b3d07547b7bc0e8dc834a402618373e65e0a78047486a33de38b202368892022-09-24 23:58:516 days 3 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000001117593954994 AVAX
0x252fc856cbf2b3d07547b7bc0e8dc834a402618373e65e0a78047486a33de38b202368892022-09-24 23:58:516 days 3 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX1 AVAX
0x6de64d939da8dc0662642487532cfdc522b3f26496005f25397949bc65ae7458194179822022-09-01 22:05:3129 days 4 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750xc979f3f9446201aa5c24303374e1a9e5d6b75c480.000000176911417802 AVAX
0x6de64d939da8dc0662642487532cfdc522b3f26496005f25397949bc65ae7458194179822022-09-01 22:05:3129 days 4 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000000176911417802 AVAX
0x6de64d939da8dc0662642487532cfdc522b3f26496005f25397949bc65ae7458194179822022-09-01 22:05:3129 days 4 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX0.158464878014645505 AVAX
0x2ee32a65279f9f949359d6514ee446580830cc8f196a5de4f4336a67e8e33df6189232672022-08-21 8:30:3440 days 18 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX2 AVAX
0xdf6201a68b21b9ec4741c59b3b39b316a668a69a1efa9c9dd66185406062dedd188984052022-08-20 18:32:2741 days 8 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750xe368437cf2745cbe375ba4ae31e235345509dc9c0.000000471906439041 AVAX
0xdf6201a68b21b9ec4741c59b3b39b316a668a69a1efa9c9dd66185406062dedd188984052022-08-20 18:32:2741 days 8 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000000471906439041 AVAX
0xdf6201a68b21b9ec4741c59b3b39b316a668a69a1efa9c9dd66185406062dedd188984052022-08-20 18:32:2741 days 8 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX0.420863494115954705 AVAX
0xd3739b88f1342299076785e29d930f0bde6f710fa6c281ca3a4bbdabdee73caf188580802022-08-19 19:56:4842 days 7 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750x5119983ccc63c3bbad68efeccb98fd366502b1820.000004567895652773 AVAX
0xd3739b88f1342299076785e29d930f0bde6f710fa6c281ca3a4bbdabdee73caf188580802022-08-19 19:56:4842 days 7 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000004567895652773 AVAX
0xd3739b88f1342299076785e29d930f0bde6f710fa6c281ca3a4bbdabdee73caf188580802022-08-19 19:56:4842 days 7 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX4.2 AVAX
0xcdd5fd9580f7c4535c85694169fab86b5dc660f750526844a0643f21e9f631e1185536462022-08-12 16:21:5849 days 10 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750x8cf13ed1fe6721705ae9c67ad81e8cd8b11d75b20.000004366384409186 AVAX
0xcdd5fd9580f7c4535c85694169fab86b5dc660f750526844a0643f21e9f631e1185536462022-08-12 16:21:5849 days 10 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000004366384409186 AVAX
0xcdd5fd9580f7c4535c85694169fab86b5dc660f750526844a0643f21e9f631e1185536462022-08-12 16:21:5849 days 10 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX5 AVAX
0xa0cf7a0c22f8652498a570e6c428e26ab4fbd63b8e8c902ce519f329a73945ab184432002022-08-10 2:39:5952 days 21 mins ago 0x9675064a9b93dc4156366a4e5f1400185d7513750x35bd834605344886b1a463ea35c702da878658150.000005253222786639 AVAX
0xa0cf7a0c22f8652498a570e6c428e26ab4fbd63b8e8c902ce519f329a73945ab184432002022-08-10 2:39:5952 days 21 mins ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000005253222786639 AVAX
0xa0cf7a0c22f8652498a570e6c428e26ab4fbd63b8e8c902ce519f329a73945ab184432002022-08-10 2:39:5952 days 21 mins ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX4.85 AVAX
0xaa253be34b0aede97613789f6de401d3ad27b12e9df8eefbd7e421abbf997a2a184203322022-08-09 13:51:4952 days 13 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750x9d2da9a98af5cbaed356e190c2e05dca21aba63e0.000001667924896716 AVAX
0xaa253be34b0aede97613789f6de401d3ad27b12e9df8eefbd7e421abbf997a2a184203322022-08-09 13:51:4952 days 13 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000001667924896716 AVAX
0xaa253be34b0aede97613789f6de401d3ad27b12e9df8eefbd7e421abbf997a2a184203322022-08-09 13:51:4952 days 13 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX1.5 AVAX
0x2966b82bd50aa2736f6d9f1d3c1f8a9a4f16a3c3c3d4e83c18f3123f01bd2745182617432022-08-05 21:02:3356 days 5 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d7513750xd19e977b4f2d1175a47ab91fb86d9e53ed71ed9c0.000003935559372765 AVAX
0x2966b82bd50aa2736f6d9f1d3c1f8a9a4f16a3c3c3d4e83c18f3123f01bd2745182617432022-08-05 21:02:3356 days 5 hrs ago Wrapped AVAX 0x9675064a9b93dc4156366a4e5f1400185d7513750.000003935559372765 AVAX
0x2966b82bd50aa2736f6d9f1d3c1f8a9a4f16a3c3c3d4e83c18f3123f01bd2745182617432022-08-05 21:02:3356 days 5 hrs ago 0x9675064a9b93dc4156366a4e5f1400185d751375 Wrapped AVAX4.53755088338213775 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SnowglobeZapAvaxPangolin

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2021-11-27
*/

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File contracts/lib/safe-math.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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


// File contracts/lib/context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File contracts/lib/erc20.sol

// File: contracts/GSN/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


// File: contracts/token/ERC20/IERC20.sol


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

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

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

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

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

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

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

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

// File: contracts/utils/Address.sol


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

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

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

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

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

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

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

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

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

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

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

// File: contracts/token/ERC20/ERC20.sol

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

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

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

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

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

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

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

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

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


// File contracts/interfaces/pangolin.sol

// SPDX-License-Identifier: MIT

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

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

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

    function addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountAVAX,
            uint256 liquidity
        );

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

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

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

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

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

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

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

interface IPangolinPair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;
}

interface IPangolinFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}


// File contracts/interfaces/joe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

interface IJoeRouter {

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

    function addLiquidityAVAX(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountAVAXMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountAVAX,
            uint256 liquidity
        );

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

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

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

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

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


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


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

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

interface IJoePair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;
}

interface IJoeFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}


// File contracts/lib/square-root.sol

// File: @uniswap/lib/contracts/libraries/Babylonian.sol
pragma solidity >=0.4.0;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}


// File contracts/interfaces/wavax.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

interface WAVAX {
    function name() external view returns (string memory);

    function approve(address guy, uint256 wad) external returns (bool);

    function totalSupply() external view returns (uint256);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function withdraw(uint256 wad) external;

    function decimals() external view returns (uint8);

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

    function symbol() external view returns (string memory);

    function transfer(address dst, uint256 wad) external returns (bool);

    function deposit() external payable;

    function allowance(address, address) external view returns (uint256);
}


// File contracts/interfaces/globe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;

interface IGlobe is IERC20 {
    function token() external view returns (address);

    function claimInsurance() external; // NOTE: Only yDelegatedVault implements this

    function getRatio() external view returns (uint256);

    function depositAll() external;

    function deposit(uint256) external;

    function withdrawAll() external;

    function withdraw(uint256) external;

    function earn() external;

    function decimals() external view returns (uint8);
}


// File contracts/interfaces/uniAmm.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

//this is a universal interface for pairs using uniswapv2.

interface IUniPair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;
}

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


// File contracts/zapper-contract/zapper-base.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;
abstract contract ZapperBase {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;
    using SafeERC20 for IGlobe;

    address public router;

    address public constant wavax = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7;

    uint256 public constant minimumAmount = 1000;

    constructor(address _router) public {
        // Safety checks to ensure WAVAX token address
        WAVAX(wavax).deposit{value: 0}();
        WAVAX(wavax).withdraw(0);
        router = _router;
    }

    receive() external payable {
        assert(msg.sender == wavax);
    }

    function _getSwapAmount(uint256 investmentA, uint256 reserveA, uint256 reserveB) public view virtual returns (uint256 swapAmount);

    //returns DUST
    function _returnAssets(address[] memory tokens) internal {
        uint256 balance;
        for (uint256 i; i < tokens.length; i++) {
            balance = IERC20(tokens[i]).balanceOf(address(this));
            if (balance > 0) {
                if (tokens[i] == wavax) {
                    WAVAX(wavax).withdraw(balance);
                    (bool success, ) = msg.sender.call{value: balance}(
                        new bytes(0)
                    );
                    require(success, "AVAX transfer failed");
                } else {
                    IERC20(tokens[i]).safeTransfer(msg.sender, balance);
                }
            }
        }
    }

    function _swapAndStake(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) public virtual;

    function zapInAVAX(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) external payable{
        require(msg.value >= minimumAmount, "Insignificant input amount");

        WAVAX(wavax).deposit{value: msg.value}();

        // allows us to zapIn if avax isn't part of the original pair
        if (tokenIn != wavax){
            uint256 _amount = IERC20(wavax).balanceOf(address(this));

            (, IUniPair pair) = _getVaultPair(snowglobe);

            (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
            require(reserveA > minimumAmount && reserveB > minimumAmount, "Liquidity pair reserves too low");

            bool isInputA = pair.token0() == tokenIn;
            require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

            address[] memory path = new address[](2);
            path[0] = wavax;
            path[1] = tokenIn;

            uint256 swapAmountIn;
        
            swapAmountIn = _getSwapAmount(_amount, reserveA, reserveB);
       
            _approveTokenIfNeeded(path[0], address(router));
            IUniAmmRouter(router).swapExactTokensForTokens(
                swapAmountIn,
                tokenAmountOutMin,
                path,
                address(this),
                block.timestamp
            );
            _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
        }else{
            _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
        }
    }

    // transfers tokens from msg.sender to this contract 
    function zapIn(address snowglobe, uint256 tokenAmountOutMin, address tokenIn, uint256 tokenInAmount) external {
        require(tokenInAmount >= minimumAmount, "Insignificant input amount");
        require(IERC20(tokenIn).allowance(msg.sender, address(this)) >= tokenInAmount, "Input token is not approved");

        // transfer token 
        IERC20(tokenIn).safeTransferFrom(
            msg.sender,
            address(this),
            tokenInAmount
        );
        _swapAndStake(snowglobe, tokenAmountOutMin, tokenIn);
    }

    function zapOutAndSwap(address snowglobe, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public virtual;

    function _removeLiquidity(address pair, address to) internal {
        IERC20(pair).safeTransfer(pair, IERC20(pair).balanceOf(address(this)));
        (uint256 amount0, uint256 amount1) = IUniPair(pair).burn(to);

        require(amount0 >= minimumAmount, "Router: INSUFFICIENT_A_AMOUNT");
        require(amount1 >= minimumAmount, "Router: INSUFFICIENT_B_AMOUNT");
    }

    function _getVaultPair(address snowglobe) internal view returns (IGlobe vault, IUniPair pair){

        vault = IGlobe(snowglobe);
        pair = IUniPair(vault.token());



        require(pair.factory() == IUniPair(router).factory(), "Incompatible liquidity pair factory");
    }

    function _approveTokenIfNeeded(address token, address spender) internal {
        if (IERC20(token).allowance(address(this), spender) == 0) {
            IERC20(token).safeApprove(spender, uint256(~0));
        }
    }

    function zapOut(address snowglobe, uint256 withdrawAmount) external {
        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);

        IERC20(snowglobe).safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);

        if (pair.token0() != wavax && pair.token1() != wavax) {
            return _removeLiquidity(address(pair), msg.sender);
        }


        _removeLiquidity(address(pair), address(this));

        address[] memory tokens = new address[](2);
        tokens[0] = pair.token0();
        tokens[1] = pair.token1();

        _returnAssets(tokens);
    }
}


// File contracts/interfaces/gaugeproxy.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;

interface IGaugeV2 {
    function depositAll() external;

    function deposit(uint256 amount) external;

    function depositFor(uint256 amount, address account) external;

    function withdrawAll() external;

    function withdraw(uint256 amount) external;

    function exit() external;

    function getReward() external;
}

interface IGaugeProxyV2 {
    function tokens() external view returns (address[] memory);

    function getGauge(address _token) external view returns (address);
}


// File contracts/zapper-contract/SnowglobeZapperPangolin.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7;
contract SnowglobeZapAvaxPangolin is ZapperBase {
    address public gaugeProxy = 0x215D5eDEb6A6a3f84AE9d72962FEaCCdF815BF27;

    constructor()
        public ZapperBase(0xE54Ca86531e17Ef3616d22Ca28b0D458b6C89106){

        }

    function zapOutAndSwap(address snowglobe, uint256 withdrawAmount, address desiredToken, uint256 desiredTokenOutMin) public override {

        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);
        address token0 = pair.token0();
        address token1 = pair.token1();
        require(token0 == desiredToken || token1 == desiredToken, "desired token not present in liquidity pair");

        vault.safeTransferFrom(msg.sender, address(this), withdrawAmount);
        vault.withdraw(withdrawAmount);
        _removeLiquidity(address(pair), address(this));

        address swapToken = token1 == desiredToken ? token0 : token1;
        address[] memory path = new address[](2);
        path[0] = swapToken;
        path[1] = desiredToken;

        _approveTokenIfNeeded(path[0], address(router));
        IPangolinRouter(router).swapExactTokensForTokens(
            IERC20(swapToken).balanceOf(address(this)),
            desiredTokenOutMin,
            path,
            address(this),
            block.timestamp
        );

        _returnAssets(path);
    }

    function _swapAndStake(address snowglobe, uint256 tokenAmountOutMin, address tokenIn) public override {
        (IGlobe vault, IUniPair pair) = _getVaultPair(snowglobe);

        (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
        require(reserveA > minimumAmount && reserveB > minimumAmount, "Liquidity pair reserves too low");

        bool isInputA = pair.token0() == tokenIn;
        require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

        address[] memory path = new address[](2);
        path[0] = tokenIn;
        path[1] = isInputA ? pair.token1() : pair.token0();

        uint256 fullInvestment = IERC20(tokenIn).balanceOf(address(this));
        uint256 swapAmountIn;
        if (isInputA) {
            swapAmountIn = _getSwapAmount(fullInvestment, reserveA, reserveB);
        } else {
            swapAmountIn = _getSwapAmount(fullInvestment, reserveB, reserveA);
        }

        _approveTokenIfNeeded(path[0], address(router));
        uint256[] memory swappedAmounts = IPangolinRouter(router).swapExactTokensForTokens(
                swapAmountIn,
                tokenAmountOutMin,
                path,
                address(this),
                block.timestamp
            );

        _approveTokenIfNeeded(path[1], address(router));
        (, , uint256 amountLiquidity) = IPangolinRouter(router).addLiquidity(
            path[0],
            path[1],
            fullInvestment.sub(swappedAmounts[0]),
            swappedAmounts[1],
            1,
            1,
            address(this),
            block.timestamp
        );

        _approveTokenIfNeeded(address(pair), address(vault));
        vault.deposit(amountLiquidity);

        //taking receipt token and sending back to user
        vault.safeTransfer(msg.sender, vault.balanceOf(address(this)));

        //interact with gauge proxy to get gauge address
        address gaugeAddress = IGaugeProxyV2(gaugeProxy).getGauge(snowglobe);

        //deposit for into gauge
        IGaugeV2(gaugeAddress).depositFor(vault.balanceOf(msg.sender), msg.sender);

        _returnAssets(path);
    }

    function _getSwapAmount(uint256 investmentA, uint256 reserveA, uint256 reserveB) public view override returns (uint256 swapAmount) {
        uint256 halfInvestment = investmentA.div(2);
        uint256 nominator = IPangolinRouter(router).getAmountOut(
            halfInvestment,
            reserveA,
            reserveB
        );
        uint256 denominator = IPangolinRouter(router).quote(
            halfInvestment,
            reserveA.add(halfInvestment),
            reserveB.sub(nominator)
        );
        swapAmount = investmentA.sub(
            Babylonian.sqrt(
                (halfInvestment * halfInvestment * nominator) / denominator
            )
        );
    }

    function estimateSwap(address snowglobe, address tokenIn, uint256 fullInvestmentIn) public view returns (uint256 swapAmountIn, uint256 swapAmountOut, address swapTokenOut){
        (, IUniPair pair) = _getVaultPair(snowglobe);

        bool isInputA = pair.token0() == tokenIn;
        require(isInputA || pair.token1() == tokenIn, "Input token not present in liquidity pair");

        (uint256 reserveA, uint256 reserveB, ) = pair.getReserves();
        (reserveA, reserveB) = isInputA ? (reserveA, reserveB) : (reserveB, reserveA);

        swapAmountIn = _getSwapAmount(fullInvestmentIn, reserveA, reserveB);
        swapAmountOut = IPangolinRouter(router).getAmountOut(
            swapAmountIn,
            reserveA,
            reserveB
        );
        swapTokenOut = isInputA ? pair.token1() : pair.token0();
    }

}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"investmentA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"_getSwapAmount","outputs":[{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"_swapAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"fullInvestmentIn","type":"uint256"}],"name":"estimateSwap","outputs":[{"internalType":"uint256","name":"swapAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapAmountOut","type":"uint256"},{"internalType":"address","name":"swapTokenOut","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wavax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"}],"name":"zapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"tokenAmountOutMin","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"zapInAVAX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"snowglobe","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"},{"internalType":"address","name":"desiredToken","type":"address"},{"internalType":"uint256","name":"desiredTokenOutMin","type":"uint256"}],"name":"zapOutAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b03191673215d5edeb6a6a3f84ae9d72962feaccdf815bf271790553480156200003757600080fd5b5073e54ca86531e17ef3616d22ca28b0d458b6c8910673b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db060006040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200009e57600080fd5b505af1158015620000b3573d6000803e3d6000fd5b505060408051632e1a7d4d60e01b8152600060048201819052915173b31f66aa3c1e785363f0875a1b74e27b85fd66c79550632e1a7d4d945060248083019450909182900301818387803b1580156200010b57600080fd5b505af115801562000120573d6000803e3d6000fd5b5050600080546001600160a01b039094166001600160a01b0319909416939093179092555050612f6280620001566000396000f3fe6080604052600436106100a05760003560e01c8063b384bcbc11610064578063b384bcbc14610229578063bb0c82981461026c578063ca1c9b7514610281578063d9139f6314610296578063f3cc669a146102cf578063f887ea4014610316576100c4565b8063117be4c2146100c95780633f2f869a146100fa578063597fd0a21461016457806372f8b6cd146101ac578063b302b64c146101f3576100c4565b366100c4573373b31f66aa3c1e785363f0875a1b74e27b85fd66c7146100c257fe5b005b600080fd5b3480156100d557600080fd5b506100de61032b565b604080516001600160a01b039092168252519081900360200190f35b34801561010657600080fd5b5061013d6004803603606081101561011d57600080fd5b506001600160a01b03813581169160208101359091169060400135610343565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b34801561017057600080fd5b5061019a6004803603606081101561018757600080fd5b508035906020810135906040013561069b565b60408051918252519081900360200190f35b3480156101b857600080fd5b506100c2600480360360808110156101cf57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610812565b6100c26004803603606081101561020957600080fd5b506001600160a01b03813581169160208101359160409091013516610963565b34801561023557600080fd5b506100c26004803603606081101561024c57600080fd5b506001600160a01b03813581169160208101359160409091013516610f77565b34801561027857600080fd5b5061019a6118e1565b34801561028d57600080fd5b506100de6118e7565b3480156102a257600080fd5b506100c2600480360360408110156102b957600080fd5b506001600160a01b0381351690602001356118f6565b3480156102db57600080fd5b506100c2600480360360808110156102f257600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c1b565b34801561032257600080fd5b506100de61209e565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b600080600080610352876120ad565b9150506000866001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561039a57600080fd5b505afa1580156103ae573d6000803e3d6000fd5b505050506040513d60208110156103c457600080fd5b50516001600160a01b031614905080806104535750866001600160a01b0316826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561041c57600080fd5b505afa158015610430573d6000803e3d6000fd5b505050506040513d602081101561044657600080fd5b50516001600160a01b0316145b61048e5760405162461bcd60e51b8152600401808060200182810382526029815260200180612f046029913960400191505060405180910390fd5b600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156104ca57600080fd5b505afa1580156104de573d6000803e3d6000fd5b505050506040513d60608110156104f457600080fd5b5080516020909101516001600160701b0391821693501690508261051957808261051c565b81815b909250905061052c88838361069b565b60005460408051630153543560e21b815260048101849052602481018690526044810185905290519299506001600160a01b039091169163054d50d491606480820192602092909190829003018186803b15801561058957600080fd5b505afa15801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b505195508261062657836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105f557600080fd5b505afa158015610609573d6000803e3d6000fd5b505050506040513d602081101561061f57600080fd5b505161068c565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561065f57600080fd5b505afa158015610673573d6000803e3d6000fd5b505050506040513d602081101561068957600080fd5b50515b94505050505093509350939050565b6000806106af85600263ffffffff61224616565b6000805460408051630153543560e21b8152600481018590526024810189905260448101889052905193945091926001600160a01b039091169163054d50d4916064808301926020929190829003018186803b15801561070e57600080fd5b505afa158015610722573d6000803e3d6000fd5b505050506040513d602081101561073857600080fd5b505160008054919250906001600160a01b031663ad615dec84610761898263ffffffff61228f16565b610771898763ffffffff6122e916565b6040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156107b357600080fd5b505afa1580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b505190506108076107fa828580028502816107f457fe5b0461232b565b889063ffffffff6122e916565b979650505050505050565b6103e8811015610869576040805162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e74000000000000604482015290519081900360640190fd5b60408051636eb1769f60e11b8152336004820152306024820152905182916001600160a01b0385169163dd62ed3e91604480820192602092909190829003018186803b1580156108b857600080fd5b505afa1580156108cc573d6000803e3d6000fd5b505050506040513d60208110156108e257600080fd5b50511015610937576040805162461bcd60e51b815260206004820152601b60248201527f496e70757420746f6b656e206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b6109526001600160a01b03831633308463ffffffff61247216565b61095d848484610f77565b50505050565b6103e83410156109ba576040805162461bcd60e51b815260206004820152601a60248201527f496e7369676e69666963616e7420696e70757420616d6f756e74000000000000604482015290519081900360640190fd5b73b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a0957600080fd5b505af1158015610a1d573d6000803e3d6000fd5b505050506001600160a01b03821673b31f66aa3c1e785363f0875a1b74e27b85fd66c7149050610f6757604080516370a0823160e01b8152306004820152905160009173b31f66aa3c1e785363f0875a1b74e27b85fd66c7916370a0823191602480820192602092909190829003018186803b158015610a9c57600080fd5b505afa158015610ab0573d6000803e3d6000fd5b505050506040513d6020811015610ac657600080fd5b505190506000610ad5856120ad565b915050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d6060811015610b3e57600080fd5b5080516020909101516001600160701b0391821693501690506103e882118015610b6957506103e881115b610bba576040805162461bcd60e51b815260206004820152601f60248201527f4c6971756964697479207061697220726573657276657320746f6f206c6f7700604482015290519081900360640190fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610bff57600080fd5b505afa158015610c13573d6000803e3d6000fd5b505050506040513d6020811015610c2957600080fd5b50516001600160a01b03161490508080610cb85750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8157600080fd5b505afa158015610c95573d6000803e3d6000fd5b505050506040513d6020811015610cab57600080fd5b50516001600160a01b0316145b610cf35760405162461bcd60e51b8152600401808060200182810382526029815260200180612f046029913960400191505060405180910390fd5b604080516002808252606080830184529260208301908036833701905050905073b31f66aa3c1e785363f0875a1b74e27b85fd66c781600081518110610d3557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110610d6357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000610d9087868661069b565b9050610dbe82600081518110610da257fe5b60209081029190910101516000546001600160a01b03166124cc565b6000809054906101000a90046001600160a01b03166001600160a01b03166338ed1739828b8530426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610e5f578181015183820152602001610e47565b505050509050019650505050505050600060405180830381600087803b158015610e8857600080fd5b505af1158015610e9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ec557600080fd5b8101908080516040519392919084600160201b821115610ee457600080fd5b908301906020820185811115610ef957600080fd5b82518660208202830111600160201b82111715610f1557600080fd5b82525081516020918201928201910280838360005b83811015610f42578181015183820152602001610f2a565b5050505090500160405250505050610f5b8a8a8a610f77565b50505050505050610f72565b610f72838383610f77565b505050565b600080610f83856120ad565b91509150600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610fc357600080fd5b505afa158015610fd7573d6000803e3d6000fd5b505050506040513d6060811015610fed57600080fd5b5080516020909101516001600160701b0391821693501690506103e88211801561101857506103e881115b611069576040805162461bcd60e51b815260206004820152601f60248201527f4c6971756964697479207061697220726573657276657320746f6f206c6f7700604482015290519081900360640190fd5b6000856001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b50516001600160a01b031614905080806111675750856001600160a01b0316846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561113057600080fd5b505afa158015611144573d6000803e3d6000fd5b505050506040513d602081101561115a57600080fd5b50516001600160a01b0316145b6111a25760405162461bcd60e51b8152600401808060200182810382526029815260200180612f046029913960400191505060405180910390fd5b604080516002808252606080830184529260208301908036833701905050905086816000815181106111d057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508161125f57846001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561122e57600080fd5b505afa158015611242573d6000803e3d6000fd5b505050506040513d602081101561125857600080fd5b50516112c5565b846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561129857600080fd5b505afa1580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b50515b816001815181106112d257fe5b6001600160a01b03928316602091820292909201810191909152604080516370a0823160e01b815230600482015290516000938b16926370a082319260248082019391829003018186803b15801561132957600080fd5b505afa15801561133d573d6000803e3d6000fd5b505050506040513d602081101561135357600080fd5b50519050600083156113715761136a82878761069b565b905061137f565b61137c82868861069b565b90505b61138f83600081518110610da257fe5b60606000809054906101000a90046001600160a01b03166001600160a01b03166338ed1739838d8730426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561143257818101518382015260200161141a565b505050509050019650505050505050600060405180830381600087803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561149857600080fd5b8101908080516040519392919084600160201b8211156114b757600080fd5b9083019060208201858111156114cc57600080fd5b82518660208202830111600160201b821117156114e857600080fd5b82525081516020918201928201910280838360005b838110156115155781810151838201526020016114fd565b50505050905001604052505050905061153484600181518110610da257fe5b6000805485516001600160a01b039091169063e8e33700908790849061155657fe5b60200260200101518760018151811061156b57fe5b602002602001015161159a8660008151811061158357fe5b6020026020010151896122e990919063ffffffff16565b866001815181106115a757fe5b6020908102919091010151604080516001600160e01b031960e088901b1681526001600160a01b0395861660048201529390941660248401526044830191909152606482015260016084820181905260a48201523060c48201524260e482015290516101048083019260609291908290030181600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506040513d606081101561165557600080fd5b50604001519050611666898b6124cc565b896001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116ac57600080fd5b505af11580156116c0573d6000803e3d6000fd5b5050604080516370a0823160e01b8152306004820152905161175393503392506001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b50516001600160a01b038d16919063ffffffff61256816565b6000600160009054906101000a90046001600160a01b03166001600160a01b031663b1c6f0e98f6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156117c057600080fd5b505afa1580156117d4573d6000803e3d6000fd5b505050506040513d60208110156117ea57600080fd5b5051604080516370a0823160e01b815233600482015290519192506001600160a01b03808416926336efd16f92918f16916370a08231916024808301926020929190829003018186803b15801561184057600080fd5b505afa158015611854573d6000803e3d6000fd5b505050506040513d602081101561186a57600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925233602483015251604480830192600092919082900301818387803b1580156118b057600080fd5b505af11580156118c4573d6000803e3d6000fd5b505050506118d1866125ba565b5050505050505050505050505050565b6103e881565b6001546001600160a01b031681565b600080611902846120ad565b90925090506119226001600160a01b03851633308663ffffffff61247216565b816001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561196857600080fd5b505af115801561197c573d6000803e3d6000fd5b5050505073b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d757600080fd5b505afa1580156119eb573d6000803e3d6000fd5b505050506040513d6020811015611a0157600080fd5b50516001600160a01b031614801590611aa4575073b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6c57600080fd5b505afa158015611a80573d6000803e3d6000fd5b505050506040513d6020811015611a9657600080fd5b50516001600160a01b031614155b15611aba57611ab3813361284b565b5050611c17565b611ac4813061284b565b6040805160028082526060808301845292602083019080368337019050509050816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1d57600080fd5b505afa158015611b31573d6000803e3d6000fd5b505050506040513d6020811015611b4757600080fd5b505181518290600090611b5657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611baf57600080fd5b505afa158015611bc3573d6000803e3d6000fd5b505050506040513d6020811015611bd957600080fd5b5051815182906001908110611bea57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c13816125ba565b5050505b5050565b600080611c27866120ad565b915091506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6657600080fd5b505afa158015611c7a573d6000803e3d6000fd5b505050506040513d6020811015611c9057600080fd5b50516040805163d21220a760e01b815290519192506000916001600160a01b0385169163d21220a7916004808301926020929190829003018186803b158015611cd857600080fd5b505afa158015611cec573d6000803e3d6000fd5b505050506040513d6020811015611d0257600080fd5b505190506001600160a01b038281169087161480611d315750856001600160a01b0316816001600160a01b0316145b611d6c5760405162461bcd60e51b815260040180806020018281038252602b815260200180612e56602b913960400191505060405180910390fd5b611d876001600160a01b03851633308a63ffffffff61247216565b836001600160a01b0316632e1a7d4d886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611dcd57600080fd5b505af1158015611de1573d6000803e3d6000fd5b50505050611def833061284b565b6000866001600160a01b0316826001600160a01b031614611e105781611e12565b825b6040805160028082526060808301845293945090916020830190803683370190505090508181600081518110611e4457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110611e7257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611ea281600081518110610da257fe5b600054604080516370a0823160e01b815230600482015290516001600160a01b03928316926338ed173992908616916370a0823191602480820192602092909190829003018186803b158015611ef757600080fd5b505afa158015611f0b573d6000803e3d6000fd5b505050506040513d6020811015611f2157600080fd5b50516040516001600160e01b031960e084901b16815260048101828152602482018c90523060648301819052426084840181905260a060448501908152885160a486015288518f958a95929160c4909101906020878101910280838360005b83811015611f98578181015183820152602001611f80565b505050509050019650505050505050600060405180830381600087803b158015611fc157600080fd5b505af1158015611fd5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ffe57600080fd5b8101908080516040519392919084600160201b82111561201d57600080fd5b90830190602082018581111561203257600080fd5b82518660208202830111600160201b8211171561204e57600080fd5b82525081516020918201928201910280838360005b8381101561207b578181015183820152602001612063565b5050505090500160405250505050612092816125ba565b50505050505050505050565b6000546001600160a01b031681565b600080829150816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ec57600080fd5b505afa158015612100573d6000803e3d6000fd5b505050506040513d602081101561211657600080fd5b50516000546040805163c45a015560e01b815290519293506001600160a01b039091169163c45a015591600480820192602092909190829003018186803b15801561216057600080fd5b505afa158015612174573d6000803e3d6000fd5b505050506040513d602081101561218a57600080fd5b50516040805163c45a015560e01b815290516001600160a01b039283169284169163c45a0155916004808301926020929190829003018186803b1580156121d057600080fd5b505afa1580156121e4573d6000803e3d6000fd5b505050506040513d60208110156121fa57600080fd5b50516001600160a01b0316146122415760405162461bcd60e51b8152600401808060200182810382526023815260200180612e816023913960400191505060405180910390fd5b915091565b600061228883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a0b565b9392505050565b600082820183811015612288576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061228883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612aad565b60008161233a5750600061246d565b816001600160801b82106123535760809190911c9060401b5b68010000000000000000821061236e5760409190911c9060201b5b600160201b82106123845760209190911c9060101b5b6201000082106123995760109190911c9060081b5b61010082106123ad5760089190911c9060041b5b601082106123c05760049190911c9060021b5b600882106123cc5760011b5b60018185816123d757fe5b048201901c905060018185816123e957fe5b048201901c905060018185816123fb57fe5b048201901c9050600181858161240d57fe5b048201901c9050600181858161241f57fe5b048201901c9050600181858161243157fe5b048201901c9050600181858161244357fe5b048201901c9050600081858161245557fe5b0490508082106124655780612467565b815b93505050505b919050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261095d908590612b07565b60408051636eb1769f60e11b81523060048201526001600160a01b03838116602483015291519184169163dd62ed3e91604480820192602092909190829003018186803b15801561251c57600080fd5b505afa158015612530573d6000803e3d6000fd5b505050506040513d602081101561254657600080fd5b5051611c1757611c176001600160a01b0383168260001963ffffffff612bb816565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f72908490612b07565b6000805b8251811015610f72578281815181106125d357fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561263057600080fd5b505afa158015612644573d6000803e3d6000fd5b505050506040513d602081101561265a57600080fd5b5051915081156128435773b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031683828151811061268e57fe5b60200260200101516001600160a01b031614156128125773b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156126ff57600080fd5b505af1158015612713573d6000803e3d6000fd5b505060408051600080825260208201928390528151909450339350869290819081908082805b602083106127585780518252601f199092019160209182019101612739565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146127ba576040519150601f19603f3d011682016040523d82523d6000602084013e6127bf565b606091505b505090508061280c576040805162461bcd60e51b815260206004820152601460248201527310559056081d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b50612843565b612843338385848151811061282357fe5b60200260200101516001600160a01b03166125689092919063ffffffff16565b6001016125be565b604080516370a0823160e01b815230600482015290516128da9184916001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561289757600080fd5b505afa1580156128ab573d6000803e3d6000fd5b505050506040513d60208110156128c157600080fd5b50516001600160a01b038516919063ffffffff61256816565b6040805163226bf2d160e21b81526001600160a01b03838116600483015282516000938493928716926389afcb44926024808301939282900301818787803b15801561292557600080fd5b505af1158015612939573d6000803e3d6000fd5b505050506040513d604081101561294f57600080fd5b50805160209091015190925090506103e88210156129b4576040805162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e54000000604482015290519081900360640190fd5b6103e881101561095d576040805162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e54000000604482015290519081900360640190fd5b60008183612a975760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a5c578181015183820152602001612a44565b50505050905090810190601f168015612a895780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612aa357fe5b0495945050505050565b60008184841115612aff5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612a5c578181015183820152602001612a44565b505050900390565b6060612b5c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ccb9092919063ffffffff16565b805190915015610f7257808060200190516020811015612b7b57600080fd5b5051610f725760405162461bcd60e51b815260040180806020018281038252602a815260200180612ea4602a913960400191505060405180910390fd5b801580612c3e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612c1057600080fd5b505afa158015612c24573d6000803e3d6000fd5b505050506040513d6020811015612c3a57600080fd5b5051155b612c795760405162461bcd60e51b8152600401808060200182810382526036815260200180612ece6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f72908490612b07565b6060612cda8484600085612ce2565b949350505050565b6060612ced85612e4f565b612d3e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612d7d5780518252601f199092019160209182019101612d5e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ddf576040519150601f19603f3d011682016040523d82523d6000602084013e612de4565b606091505b50915091508115612df8579150612cda9050565b805115612e085780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612a5c578181015183820152602001612a44565b3b15159056fe6465736972656420746f6b656e206e6f742070726573656e7420696e206c69717569646974792070616972496e636f6d70617469626c65206c6971756964697479207061697220666163746f72795361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365496e70757420746f6b656e206e6f742070726573656e7420696e206c69717569646974792070616972a2646970667358221220fbdeb2442c0c51ffa9bdf9c0f3ed6355d172fc8f77041ba862aae08491e70e1764736f6c63430006070033

Deployed ByteCode Sourcemap

54452:5107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48868:10;48506:42;48868:19;48861:27;;;;54452:5107;;12:1:-1;9;2:12;48474:74:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48474:74:0;;;:::i;:::-;;;;-1:-1:-1;;;;;48474:74:0;;;;;;;;;;;;;;58713:841;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58713:841:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;58713:841:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;58713:841:0;;;;;;;;;;;;;;58003:702;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58003:702:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58003:702:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51450:546;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51450:546:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;51450:546:0;;;;;;;;;;;;;;;;;;;;:::i;49859:1524::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;49859:1524:0;;;;;;;;;;;;;;;;;:::i;55798:2197::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55798:2197:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;55798:2197:0;;;;;;;;;;;;;;;;;:::i;48557:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48557:44:0;;;:::i;54507:70::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54507:70:0;;;:::i;53055:639::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53055:639:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;53055:639:0;;;;;;;;:::i;54692:1098::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54692:1098:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;54692:1098:0;;;;;;;;;;;;;;;;;;;;:::i;48444:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48444:21:0;;;:::i;48474:74::-;48506:42;48474:74;:::o;58713:841::-;58818:20;58840:21;58863:20;58898:13;58915:24;58929:9;58915:13;:24::i;:::-;58895:44;;;58952:13;58985:7;-1:-1:-1;;;;;58968:24:0;:4;-1:-1:-1;;;;;58968:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58968:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58968:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58968:13:0;-1:-1:-1;;;;;58968:24:0;;;-1:-1:-1;58968:24:0;;59011:36;;;59040:7;-1:-1:-1;;;;;59023:24:0;:4;-1:-1:-1;;;;;59023:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59023:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59023:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59023:13:0;-1:-1:-1;;;;;59023:24:0;;59011:36;59003:90;;;;-1:-1:-1;;;59003:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59107:16;59125;59147:4;-1:-1:-1;;;;;59147:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59147:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59147:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59147:18:0;;;;;;;-1:-1:-1;;;;;59106:59:0;;;;-1:-1:-1;59106:59:0;;-1:-1:-1;59199:8:0;:54;;59234:8;59244;59199:54;;;59211:8;59221;59199:54;59176:77;;-1:-1:-1;59176:77:0;-1:-1:-1;59281:52:0;59296:16;59176:77;;59281:14;:52::i;:::-;59376:6;;59360:120;;;-1:-1:-1;;;59360:120:0;;;;;;;;;;;;;;;;;;;;;;59266:67;;-1:-1:-1;;;;;;59376:6:0;;;;59360:36;;:120;;;;;;;;;;;;;;;59376:6;59360:120;;;2:2:-1;;;;27:1;24;17:12;2:2;59360:120:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59360:120:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59360:120:0;;-1:-1:-1;59506:8:0;:40;;59533:4;-1:-1:-1;;;;;59533:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59533:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59533:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59533:13:0;59506:40;;;59517:4;-1:-1:-1;;;;;59517:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59517:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59517:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59517:13:0;59506:40;59491:55;;58713:841;;;;;;;;;;;:::o;58003:702::-;58114:18;;58170;:11;58186:1;58170:18;:15;:18;:::i;:::-;58199:17;58235:6;;58219:122;;;-1:-1:-1;;;58219:122:0;;;;;;;;;;;;;;;;;;;;;;58145:43;;-1:-1:-1;58199:17:0;;-1:-1:-1;;;;;58235:6:0;;;;58219:36;;:122;;;;;;;;;;;;;;58235:6;58219:122;;;2:2:-1;;;;27:1;24;17:12;2:2;58219:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58219:122:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58219:122:0;58352:19;58390:6;;58219:122;;-1:-1:-1;58352:19:0;-1:-1:-1;;;;;58390:6:0;58374:29;58418:14;58447:28;:8;58418:14;58447:28;:12;:28;:::i;:::-;58490:23;:8;58503:9;58490:23;:12;:23;:::i;:::-;58374:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58374:150:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58374:150:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;58374:150:0;;-1:-1:-1;58548:149:0;58578:108;58374:150;58613:31;;;:43;;58374:150;58612:59;;;;;58578:15;:108::i;:::-;58548:11;;:149;:15;:149;:::i;:::-;58535:162;58003:702;-1:-1:-1;;;;;;;58003:702:0:o;51450:546::-;48597:4;51579:13;:30;;51571:69;;;;;-1:-1:-1;;;51571:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51659:52;;;-1:-1:-1;;;51659:52:0;;51685:10;51659:52;;;;51705:4;51659:52;;;;;;51715:13;;-1:-1:-1;;;;;51659:25:0;;;;;:52;;;;;;;;;;;;;;;:25;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;51659:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51659:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51659:52:0;:69;;51651:109;;;;;-1:-1:-1;;;51651:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51801:124;-1:-1:-1;;;;;51801:32:0;;51848:10;51881:4;51901:13;51801:124;:32;:124;:::i;:::-;51936:52;51950:9;51961:17;51980:7;51936:13;:52::i;:::-;51450:546;;;;:::o;49859:1524::-;48597:4;49976:9;:26;;49968:65;;;;;-1:-1:-1;;;49968:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48506:42;-1:-1:-1;;;;;50046:20:0;;50074:9;50046:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50046:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;50174:16:0;;48506:42;50174:16;;-1:-1:-1;50170:1206:0;;50224:38;;;-1:-1:-1;;;50224:38:0;;50256:4;50224:38;;;;;;50206:15;;48506:42;;50224:23;;:38;;;;;;;;;;;;;;;48506:42;50224:38;;;2:2:-1;;;;27:1;24;17:12;2:2;50224:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50224:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50224:38:0;;-1:-1:-1;50282:13:0;50299:24;50313:9;50299:13;:24::i;:::-;50279:44;;;50341:16;50359;50381:4;-1:-1:-1;;;;;50381:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50381:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50381:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50381:18:0;;;;;;;-1:-1:-1;;;;;50340:59:0;;;;-1:-1:-1;50340:59:0;;-1:-1:-1;48597:4:0;50422:24;;:52;;;;;48597:4;50450:8;:24;50422:52;50414:96;;;;;-1:-1:-1;;;50414:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50527:13;50560:7;-1:-1:-1;;;;;50543:24:0;:4;-1:-1:-1;;;;;50543:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50543:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50543:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50543:13:0;-1:-1:-1;;;;;50543:24:0;;;-1:-1:-1;50543:24:0;;50590:36;;;50619:7;-1:-1:-1;;;;;50602:24:0;:4;-1:-1:-1;;;;;50602:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50602:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50602:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50602:13:0;-1:-1:-1;;;;;50602:24:0;;50590:36;50582:90;;;;-1:-1:-1;;;50582:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50713:16;;;50727:1;50713:16;;;50689:21;50713:16;;;;;50689:21;50713:16;;;;;109:14:-1;50713:16:0;88:42:-1;144:17;;-1:-1;50713:16:0;50689:40;;48506:42;50744:4;50749:1;50744:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;50744:15:0;;;-1:-1:-1;;;;;50744:15:0;;;;;50784:7;50774:4;50779:1;50774:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;50774:17:0;;;-1:-1:-1;;;;;50774:17:0;;;;;50808:20;50868:43;50883:7;50892:8;50902;50868:14;:43::i;:::-;50853:58;;50935:47;50957:4;50962:1;50957:7;;;;;;;;;;;;;;;;;;50974:6;;-1:-1:-1;;;;;50974:6:0;50935:21;:47::i;:::-;51011:6;;;;;;;;;-1:-1:-1;;;;;51011:6:0;-1:-1:-1;;;;;50997:46:0;;51062:12;51093:17;51129:4;51160;51184:15;50997:217;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50997:217:0;-1:-1:-1;;;;;50997:217: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;50997:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50997:217:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50997:217:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;50997:217:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;50997:217:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;50997:217:0;;421:4:-1;412:14;;;;50997:217:0;;;;;412:14:-1;50997:217: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;50997:217:0;;;;;;;;;;;;51229:52;51243:9;51254:17;51273:7;51229:13;:52::i;:::-;50170:1206;;;;;;;;;;51312:52;51326:9;51337:17;51356:7;51312:13;:52::i;:::-;49859:1524;;;:::o;55798:2197::-;55912:12;55926:13;55943:24;55957:9;55943:13;:24::i;:::-;55911:56;;;;55981:16;55999;56021:4;-1:-1:-1;;;;;56021:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56021:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56021:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56021:18:0;;;;;;;-1:-1:-1;;;;;55980:59:0;;;;-1:-1:-1;55980:59:0;;-1:-1:-1;48597:4:0;56058:24;;:52;;;;;48597:4;56086:8;:24;56058:52;56050:96;;;;;-1:-1:-1;;;56050:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56159:13;56192:7;-1:-1:-1;;;;;56175:24:0;:4;-1:-1:-1;;;;;56175:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56175:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56175:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56175:13:0;-1:-1:-1;;;;;56175:24:0;;;-1:-1:-1;56175:24:0;;56218:36;;;56247:7;-1:-1:-1;;;;;56230:24:0;:4;-1:-1:-1;;;;;56230:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56230:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56230:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56230:13:0;-1:-1:-1;;;;;56230:24:0;;56218:36;56210:90;;;;-1:-1:-1;;;56210:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56337:16;;;56351:1;56337:16;;;56313:21;56337:16;;;;;56313:21;56337:16;;;;;109:14:-1;56337:16:0;88:42:-1;144:17;;-1:-1;56337:16:0;56313:40;;56374:7;56364:4;56369:1;56364:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;56364:17:0;;;-1:-1:-1;;;;;56364:17:0;;;;;56402:8;:40;;56429:4;-1:-1:-1;;;;;56429:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56429:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56429:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56429:13:0;56402:40;;;56413:4;-1:-1:-1;;;;;56413:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56413:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56413:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56413:13:0;56402:40;56392:4;56397:1;56392:7;;;;;;;;-1:-1:-1;;;;;56392:50:0;;;:7;;;;;;;;;;:50;;;;56480:40;;;-1:-1:-1;;;56480:40:0;;56514:4;56480:40;;;;;;56455:22;;56480:25;;;;;:40;;;;;;;;;;;:25;:40;;;2:2:-1;;;;27:1;24;17:12;2:2;56480:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56480:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56480:40:0;;-1:-1:-1;56531:20:0;56562:204;;;;56606:50;56621:14;56637:8;56647;56606:14;:50::i;:::-;56591:65;;56562:204;;;56704:50;56719:14;56735:8;56745;56704:14;:50::i;:::-;56689:65;;56562:204;56778:47;56800:4;56805:1;56800:7;;;;;;;56778:47;56836:31;56886:6;;;;;;;;;-1:-1:-1;;;;;56886:6:0;-1:-1:-1;;;;;56870:48:0;;56937:12;56968:17;57004:4;57035;57059:15;56870:219;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56870:219:0;-1:-1:-1;;;;;56870:219: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;56870:219:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56870:219:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56870:219:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;56870:219:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;56870:219:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;56870:219:0;;421:4:-1;412:14;;;;56870:219:0;;;;;412:14:-1;56870:219: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;56870:219:0;;;;;;;;;;;56836:253;;57102:47;57124:4;57129:1;57124:7;;;;;;;57102:47;57165:23;57208:6;;57243:7;;-1:-1:-1;;;;;57208:6:0;;;;57192:36;;57243:4;;57165:23;;57243:7;;;;;;;;;;57265:4;57270:1;57265:7;;;;;;;;;;;;;;57287:37;57306:14;57321:1;57306:17;;;;;;;;;;;;;;57287:14;:18;;:37;;;;:::i;:::-;57339:14;57354:1;57339:17;;;;;;;;;;;;;;;;;;57192:265;;;-1:-1:-1;;;;;;57192:265:0;;;;;;;-1:-1:-1;;;;;57192:265:0;;;;;;;;;;;;;;;;;;;;;;;;;;57371:1;57192:265;;;;;;;;;;57411:4;57192:265;;;;57431:15;57192:265;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57192:265:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;57192:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57192:265:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57192:265:0;;;;-1:-1:-1;57470:52:0;57500:4;57515:5;57470:21;:52::i;:::-;57533:5;-1:-1:-1;;;;;57533:13:0;;57547:15;57533:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57533:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;57664:30:0;;;-1:-1:-1;;;57664:30:0;;57688:4;57664:30;;;;;;57633:62;;-1:-1:-1;57652:10:0;;-1:-1:-1;;;;;;57664:15:0;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;57664:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57664:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57664:30:0;-1:-1:-1;;;;;57633:18:0;;;:62;;:18;:62;:::i;:::-;57766:20;57803:10;;;;;;;;;-1:-1:-1;;;;;57803:10:0;-1:-1:-1;;;;;57789:34:0;;57824:9;57789:45;;;;;;;;;;;;;-1:-1:-1;;;;;57789:45:0;-1:-1:-1;;;;;57789:45:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57789:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57789:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57789:45:0;57915:27;;;-1:-1:-1;;;57915:27:0;;57931:10;57915:27;;;;;;57789:45;;-1:-1:-1;;;;;;57881:33:0;;;;;;57915:15;;;;;;:27;;;;;57789:45;;57915:27;;;;;;;:15;:27;;;2:2:-1;;;;27:1;24;17:12;2:2;57915:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57915:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;57915:27:0;57881:74;;;-1:-1:-1;;;;;;57881:74:0;;;;;;;;;;;;;;57944:10;57881:74;;;;;;;;;;-1:-1:-1;;57881:74:0;;;;;;;-1:-1:-1;57881:74:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;57881:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57881:74:0;;;;57968:19;57982:4;57968:13;:19::i;:::-;55798:2197;;;;;;;;;;;;;;:::o;48557:44::-;48597:4;48557:44;:::o;54507:70::-;;;-1:-1:-1;;;;;54507:70:0;;:::o;53055:639::-;53135:12;53149:13;53166:24;53180:9;53166:13;:24::i;:::-;53134:56;;-1:-1:-1;53134:56:0;-1:-1:-1;53203:77:0;-1:-1:-1;;;;;53203:34:0;;53238:10;53258:4;53265:14;53203:77;:34;:77;:::i;:::-;53291:5;-1:-1:-1;;;;;53291:14:0;;53306;53291:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53291:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53291:30:0;;;;48506:42;-1:-1:-1;;;;;53338:22:0;:4;-1:-1:-1;;;;;53338:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53338:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53338:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53338:13:0;-1:-1:-1;;;;;53338:22:0;;;;;:48;;;48506:42;-1:-1:-1;;;;;53364:22:0;:4;-1:-1:-1;;;;;53364:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53364:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53364:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53364:13:0;-1:-1:-1;;;;;53364:22:0;;;53338:48;53334:131;;;53410:43;53435:4;53442:10;53410:16;:43::i;:::-;53403:50;;;;53334:131;53479:46;53504:4;53519;53479:16;:46::i;:::-;53564:16;;;53578:1;53564:16;;;53538:23;53564:16;;;;;53538:23;53564:16;;;;;109:14:-1;53564:16:0;88:42:-1;144:17;;-1:-1;53564:16:0;53538:42;;53603:4;-1:-1:-1;;;;;53603:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53603:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53603:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53603:13:0;53591:9;;:6;;53598:1;;53591:9;;;;;;;;;:25;-1:-1:-1;;;;;53591:25:0;;;-1:-1:-1;;;;;53591:25:0;;;;;53639:4;-1:-1:-1;;;;;53639:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53639:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53639:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53639:13:0;53627:9;;:6;;53634:1;;53627:9;;;;;;;;;;;:25;-1:-1:-1;;;;;53627:25:0;;;-1:-1:-1;;;;;53627:25:0;;;;;53665:21;53679:6;53665:13;:21::i;:::-;53055:639;;;;;;:::o;54692:1098::-;54838:12;54852:13;54869:24;54883:9;54869:13;:24::i;:::-;54837:56;;;;54904:14;54921:4;-1:-1:-1;;;;;54921:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54921:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54921:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54921:13:0;54962;;;-1:-1:-1;;;54962:13:0;;;;54921;;-1:-1:-1;54945:14:0;;-1:-1:-1;;;;;54962:11:0;;;;;:13;;;;;54921;;54962;;;;;;;:11;:13;;;2:2:-1;;;;27:1;24;17:12;2:2;54962:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54962:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54962:13:0;;-1:-1:-1;;;;;;54994:22:0;;;;;;;;:48;;;55030:12;-1:-1:-1;;;;;55020:22:0;:6;-1:-1:-1;;;;;55020:22:0;;54994:48;54986:104;;;;-1:-1:-1;;;54986:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55103:65;-1:-1:-1;;;;;55103:22:0;;55126:10;55146:4;55153:14;55103:65;:22;:65;:::i;:::-;55179:5;-1:-1:-1;;;;;55179:14:0;;55194;55179:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55179:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55179:30:0;;;;55220:46;55245:4;55260;55220:16;:46::i;:::-;55279:17;55309:12;-1:-1:-1;;;;;55299:22:0;:6;-1:-1:-1;;;;;55299:22:0;;:40;;55333:6;55299:40;;;55324:6;55299:40;55374:16;;;55388:1;55374:16;;;55350:21;55374:16;;;;;55279:60;;-1:-1:-1;55374:16:0;;;;;;;109:14:-1;55374:16:0;88:42:-1;144:17;;-1:-1;55374:16:0;55350:40;;55411:9;55401:4;55406:1;55401:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;55401:19:0;;;-1:-1:-1;;;;;55401:19:0;;;;;55441:12;55431:4;55436:1;55431:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;55431:22:0;;;-1:-1:-1;;;;;55431:22:0;;;;;55466:47;55488:4;55493:1;55488:7;;;;;;;55466:47;55540:6;;55587:42;;;-1:-1:-1;;;55587:42:0;;55623:4;55587:42;;;;;;-1:-1:-1;;;;;55540:6:0;;;;55524:48;;55587:27;;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;55587:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55587:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55587:42:0;55524:226;;-1:-1:-1;;;;;;55524:226:0;;;;;;;;;;;;;;;;;;;55704:4;55524:226;;;;;;55724:15;55524:226;;;;;;;;;;;;;;;;;;;;;55644:18;;55677:4;;55524:226;;;;;;;55587:42;55524:226;;;;;;;;-1:-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;55524:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55524:226:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55524:226:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;55524:226:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;55524:226:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;55524:226:0;;421:4:-1;412:14;;;;55524:226:0;;;;;412:14:-1;55524:226: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;55524:226:0;;;;;;;;;;;;55763:19;55777:4;55763:13;:19::i;:::-;54692:1098;;;;;;;;;;:::o;48444:21::-;;;-1:-1:-1;;;;;48444:21:0;;:::o;52528:289::-;52593:12;52607:13;52649:9;52634:25;;52686:5;-1:-1:-1;;;;;52686:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52686:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52686:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52686:13:0;52752:6;;52743:26;;;-1:-1:-1;;;52743:26:0;;;;52686:13;;-1:-1:-1;;;;;;52752:6:0;;;;52743:24;;:26;;;;;52686:13;;52743:26;;;;;;;;52752:6;52743:26;;;2:2:-1;;;;27:1;24;17:12;2:2;52743:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52743:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52743:26:0;52725:14;;;-1:-1:-1;;;52725:14:0;;;;-1:-1:-1;;;;;52725:44:0;;;;:12;;;;;:14;;;;;52743:26;;52725:14;;;;;;;:12;:14;;;2:2:-1;;;;27:1;24;17:12;2:2;52725:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52725:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52725:14:0;-1:-1:-1;;;;;52725:44:0;;52717:92;;;;-1:-1:-1;;;52717:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52528:289;;;:::o;3306:132::-;3364:7;3391:39;3395:1;3398;3391:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3384:46;3306:132;-1:-1:-1;;;3306:132:0:o;1005:181::-;1063:7;1095:5;;;1119:6;;;;1111:46;;;;;-1:-1:-1;;;1111:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1469:136;1527:7;1554:43;1558:1;1561;1554:43;;;;;;;;;;;;;;;;;:3;:43::i;42385:1239::-;42433:7;42457:6;42453:20;;-1:-1:-1;42472:1:0;42465:8;;42453:20;42651:1;42675;-1:-1:-1;;;42691:41:0;;42687:107;;42756:3;42749:10;;;;;42780:2;42774:8;42687:107;42814:19;42808:2;:25;42804:90;;42857:2;42850:9;;;;;42880:2;42874:8;42804:90;-1:-1:-1;;;42908:2:0;:17;42904:82;;42949:2;42942:9;;;;;42972:2;42966:8;42904:82;43006:7;43000:2;:13;42996:77;;43037:2;43030:9;;;;;43060:1;43054:7;42996:77;43093:5;43087:2;:11;43083:74;;43122:1;43115:8;;;;;43144:1;43138:7;43083:74;43177:4;43171:2;:10;43167:73;;43205:1;43198:8;;;;;43227:1;43221:7;43167:73;43260:3;43254:2;:9;43250:49;;43286:1;43280:7;43250:49;43328:1;43322;43318;:5;;;;;;43314:1;:9;43313:16;;43309:20;;43359:1;43353;43349;:5;;;;;;43345:1;:9;43344:16;;43340:20;;43390:1;43384;43380;:5;;;;;;43376:1;:9;43375:16;;43371:20;;43421:1;43415;43411;:5;;;;;;43407:1;:9;43406:16;;43402:20;;43452:1;43446;43442;:5;;;;;;43438:1;:9;43437:16;;43433:20;;43483:1;43477;43473;:5;;;;;;43469:1;:9;43468:16;;43464:20;;43514:1;43508;43504;:5;;;;;;43500:1;:9;43499:16;;43495:20;;43563:10;43580:1;43576;:5;;;;;;43563:18;;43604:2;43600:1;:6;:15;;43613:2;43600:15;;;43609:1;43600:15;43592:24;;;;;42385:1239;;;;:::o;27062:205::-;27190:68;;;-1:-1:-1;;;;;27190:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27190:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;27163:96:0;;27183:5;;27163:19;:96::i;52825:222::-;52912:47;;;-1:-1:-1;;;52912:47:0;;52944:4;52912:47;;;;-1:-1:-1;;;;;52912:47:0;;;;;;;;;:23;;;;;;:47;;;;;;;;;;;;;;;:23;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;52912:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52912:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52912:47:0;52908:132;;52981:47;-1:-1:-1;;;;;52981:25:0;;53007:7;-1:-1:-1;;52981:47:0;:25;:47;:::i;26877:177::-;26987:58;;;-1:-1:-1;;;;;26987:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26987:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;26960:86:0;;26980:5;;26960:19;:86::i;49062:680::-;49130:15;49161:9;49156:579;49176:6;:13;49172:1;:17;49156:579;;;49228:6;49235:1;49228:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49221:27:0;;49257:4;49221:42;;;;;;;;;;;;;-1:-1:-1;;;;;49221:42:0;-1:-1:-1;;;;;49221:42:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49221:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49221:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49221:42:0;;-1:-1:-1;49282:11:0;;49278:446;;48506:42;-1:-1:-1;;;;;49318:18:0;:6;49325:1;49318:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49318:18:0;;49314:395;;;48506:42;-1:-1:-1;;;;;49361:21:0;;49383:7;49361:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49361:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;49491:12:0;;;49415;49491;;;;;;;;;;49433:93;;49415:12;;-1:-1:-1;49433:10:0;;-1:-1:-1;49456:7:0;;49491:12;;;;;49433:93;49491:12;;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;;;49433:93:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;49414:112:0;;;49557:7;49549:40;;;;;-1:-1:-1;;;49549:40:0;;;;;;;;;;;;-1:-1:-1;;;49549:40:0;;;;;;;;;;;;;;;49314:395;;;;49638:51;49669:10;49681:7;49645:6;49652:1;49645:9;;;;;;;;;;;;;;-1:-1:-1;;;;;49638:30:0;;;:51;;;;;:::i;:::-;49191:3;;49156:579;;52143:377;52247:37;;;-1:-1:-1;;;52247:37:0;;52278:4;52247:37;;;;;;52215:70;;52241:4;;-1:-1:-1;;;;;52247:22:0;;;;;:37;;;;;;;;;;;;;;:22;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;52247:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52247:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52247:37:0;-1:-1:-1;;;;;52215:25:0;;;:70;;:25;:70;:::i;:::-;52333:23;;;-1:-1:-1;;;52333:23:0;;-1:-1:-1;;;;;52333:23:0;;;;;;;;;52297:15;;;;52333:19;;;;;;:23;;;;;;;;;;;52297:15;52333:19;:23;;;2:2:-1;;;;27:1;24;17:12;2:2;52333:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52333:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52333:23:0;;;;;;;;;-1:-1:-1;52333:23:0;-1:-1:-1;48597:4:0;52377:24;;;52369:66;;;;;-1:-1:-1;;;52369:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48597:4;52454:7;:24;;52446:66;;;;;-1:-1:-1;;;52446:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3934:278;4020:7;4055:12;4048:5;4040:28;;;;-1:-1:-1;;;4040:28: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;4040:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:9;4095:1;4091;:5;;;;;;;3934:278;-1:-1:-1;;;;;3934:278:0:o;1908:192::-;1994:7;2030:12;2022:6;;;;2014:29;;;;-1:-1:-1;;;2014:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;2014:29:0;-1:-1:-1;;;2066:5:0;;;1908:192::o;29182:761::-;29606:23;29632:69;29660:4;29632:69;;;;;;;;;;;;;;;;;29640:5;-1:-1:-1;;;;;29632:27:0;;;:69;;;;;:::i;:::-;29716:17;;29606:95;;-1:-1:-1;29716:21:0;29712:224;;29858:10;29847:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29847:30:0;29839:85;;;;-1:-1:-1;;;29839:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27536:622;27906:10;;;27905:62;;-1:-1:-1;27922:39:0;;;-1:-1:-1;;;27922:39:0;;27946:4;27922:39;;;;-1:-1:-1;;;;;27922:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;27922:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27922:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27922:39:0;:44;27905:62;27897:152;;;;-1:-1:-1;;;27897:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28087:62;;;-1:-1:-1;;;;;28087:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28087:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28060:90:0;;28080:5;;28060:19;:90::i;13003:196::-;13106:12;13138:53;13161:6;13169:4;13175:1;13178:12;13138:22;:53::i;:::-;13131:60;13003:196;-1:-1:-1;;;;13003:196:0:o;14380:979::-;14510:12;14543:18;14554:6;14543:10;:18::i;:::-;14535:60;;;;;-1:-1:-1;;;14535:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14669:12;14683:23;14710:6;-1:-1:-1;;;;;14710:11:0;14730:8;14741:4;14710:36;;;;;;;;;;;;;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;;;14710:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14668:78:0;;;;14761:7;14757:595;;;14792:10;-1:-1:-1;14785:17:0;;-1:-1:-1;14785:17:0;14757:595;14906:17;;:21;14902:439;;15169:10;15163:17;15230:15;15217:10;15213:2;15209:19;15202:44;15117:148;15305:20;;-1:-1:-1;;;15305:20:0;;;;;;;;;;;;;;;;;15312:12;;15305:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10085:422:0;10452:20;10491:8;;;10085:422::o

Swarm Source

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