Contract 0x8abcab16372160679d6a155d96d9986454136a0a 1

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xd6b10811ce1d94ad74e7e3b76e21c90f504bbc100c3b315d985ddf15ae8b3f13Distribute Box410294772023-04-01 19:32:2549 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.008845883755 81.939713916
0xc433577b9302e0b76bc4a7409d5bc96c06e25401a97efafa27f8fbe718603ff0Request Box With...410294722023-04-01 19:32:1549 mins ago0xed0598b07faacb711870b58eae40878128928a4b IN  0x8abcab16372160679d6a155d96d9986454136a0a1.93 MATIC0.01195581017973.312996642
0xcf86487c7c1db8e9026499c31292dcae3685280f1dde507bfba11be481f53b13Distribute Box410294562023-04-01 19:31:1150 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.007437577531 68.894526762
0xb4130e874f505fdb220ad5481e4262354457cfdaee4ffb6a62be06339553c04aRequest Box With...410294492023-04-01 19:30:5350 mins ago0xed0598b07faacb711870b58eae40878128928a4b IN  0x8abcab16372160679d6a155d96d9986454136a0a9.53 MATIC0.01058480332364.905986197
0xcff94d3ea15ee3f52e9aa50cf3f4c15895fb9855f1a0004975ece58f367157f4Distribute Box410293612023-04-01 19:27:4754 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.008398000237 77.790954068
0x20b96bde1d911bcb5f51b1d432bdc5c8e4764568d7031e1b74e5042595294937Request Box With...410293542023-04-01 19:27:3154 mins ago0xed0598b07faacb711870b58eae40878128928a4b IN  0x8abcab16372160679d6a155d96d9986454136a0a1.93 MATIC0.01192948905173.151595552
0x38abece51afb92233aacad7b9767489ebf710061b9d64ffe20d6446e44ae70fdDistribute Box410280982023-04-01 18:40:211 hr 41 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.010365024878 96.011568404
0x303427ddc2962a569087e09a6961b51ba72b8f84e1e40336faec02563b0d3625Request Box With...410280942023-04-01 18:40:111 hr 41 mins ago0x65bec97e1106ab12907765f5887a151d0d35fe4b IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.02172727682197.906780079
0xe647a17ac14b318f682455ca92918062ed35acdfd38539988fa6318aa4e14dedDistribute Box410279292023-04-01 18:33:491 hr 48 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.008518816371 78.910077917
0xa4bc6584cb4355e08a7637b8d04fa48515bee18ef403a466ca4b9dac19de0e63Request Box With...410279252023-04-01 18:33:411 hr 48 mins ago0x65bec97e1106ab12907765f5887a151d0d35fe4b IN  0x8abcab16372160679d6a155d96d9986454136a0a4.98 MATIC0.01218761470974.686791574
0xcdd7cc23e725b996f1da1b4339b924e63994ebeb2b650d286a98717b2e8d58e0Update Box Reque...410279042023-04-01 18:32:571 hr 48 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.002500980806 87.61844192
0xe8e0068d2a63cbfe19877c5b0129c6710133bb0cb1c6d8008b7906cd9ccef4ecUpdate Box Reque...410278862023-04-01 18:32:171 hr 49 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.00260099385 91.122262124
0x489073cd2c63d644fecf5f7619235f32500b6099556dba7ab604471d46521b31Update Box Reque...410278762023-04-01 18:31:571 hr 49 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.002770495761 97.060529748
0xfea5623d908ead6fc394746754e61a7932febc2bd04eedc8cef6024afc51875dUpdate Box Reque...410278552023-04-01 18:31:111 hr 50 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.002476053483 78.996091234
0x0af6666a4981dd084145298e6b7c1da4d5237229258b055f1bb4a975b1790bedDistribute Box410278382023-04-01 18:30:351 hr 51 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.009533566564 88.309742532
0xa6729bc5dbfdb7dce8dc3d8d0e9ae0e294e24055f13723f8899a73610920b00dDistribute Box410278312023-04-01 18:30:211 hr 51 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.009305074684 86.193214681
0xddf6781fb1a8b6399961f3b6f3a12de7db0b6964a047c16f8f379f0233d6df80Distribute Box410278262023-04-01 18:30:111 hr 51 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.002325644177 78.950476196
0x1147e252d5ddc267b6bf80322348c3292398c50d091a41b4fc5bf96db28d6901Distribute Box410278262023-04-01 18:30:111 hr 51 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.009034418434 83.68611689
0x4d6b29612524511a698e8787a5fa09b05d68e00a6d76a95bf6f47a00406f42cfRequest Box With...410270792023-04-01 18:03:102 hrs 18 mins ago0x5e75d8a59bba836bee68b91073b7106a296b3be5 IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.013397878616 93.582170585
0x5ae1049cfb5fdb19a95f5ef5414d69e90f64956f02119b59891ac76e435ec158Request Box With...410265822023-04-01 17:45:142 hrs 36 mins ago0xbdf1ddd66f3bce7c914f8c2b382f3f081ea3144f IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.01168960134781.650110343
0xd9edee7879f257238f06da9fb71a56ed766f489df84acffac67566590655159dRequest Box With...410257152023-04-01 17:12:493 hrs 9 mins ago0xb30182b504bb0913fef1a7561d92eac49bb0df39 IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.014127603429 98.607557912
0xf7a1446dd6b8cdbed6d77b1367e85b45467594bf0cb2cf5c436386e9966a2f32Distribute Box410243602023-04-01 16:24:203 hrs 57 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.011292056304 104.598691178
0x3aaebe12bc412e9cf9272bf8ab91570b669dbcddb04220b4e1892adec39f6b5dRequest Box With...410243492023-04-01 16:23:563 hrs 57 mins ago0xf8ff8f233138ed93dfc2c52efbb9c05717657091 IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.01428895286299.806190413
0xc62aac2c484128707ed798dc8251357014bef9a12dacd4a0b8575234f86fc9f0Distribute Box410242072023-04-01 16:18:544 hrs 2 mins ago0x55dc352c9247ea5168687a26e219933f8ba7a493 IN  0x8abcab16372160679d6a155d96d9986454136a0a0 MATIC0.010047713438 93.072302031
0x1448adb86819d6c72ee43f548fb9efdd6e6f0552c9e8e188e2f5171b3a8c085aRequest Box With...410241042023-04-01 16:15:164 hrs 6 mins ago0x514c3c2ee2a980fb2d50fd47ef4316a875f37c0d IN  0x8abcab16372160679d6a155d96d9986454136a0a0.03 MATIC0.015347453377 107.199657587
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x08d277b5f1b5a17cd250215f9efab3f6724d6a9cf0507bf8bcc31bc428389f5b410079262023-04-01 6:23:2113 hrs 58 mins ago 0x8abcab16372160679d6a155d96d9986454136a0a0xcc9c77e059431bc8d30e4c9b5ca036bdb6ce28790.5 MATIC
0x8ae208cf5a1405460c46ae19124ac57e7fddbc1a3b4207d3ec7233974c68b5bd409948922023-03-31 22:30:5221 hrs 51 mins ago 0x8abcab16372160679d6a155d96d9986454136a0a0xcba243c836764892123ddf8996bea38837c8ac6b0.299999999999999989 MATIC
0xde610135697430c62e182fea1400e39323f83fbc1d7a3be1edb8d72341bfa6d8409635322023-03-31 3:30:471 day 16 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x5b129c4052e2224a1664e676bfcc7ee561f222581 MATIC
0x1a1be92d2210d3f3eb4a689d9c37c4f63db6cbd5df9733d23f78aa5606665623409570152023-03-30 23:34:051 day 20 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x7871c0bd29cd6c5f66f5ac5ebcb93734610fc67f0.699999999999999956 MATIC
0x6f97a17141e7fb7ae17fb2e7e0d3692036e172441fd6352fe353435597386591409079122023-03-29 17:30:423 days 2 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x134c913a280eb4603e9ab45fd6bbf2d053c8dc670.299999999999999989 MATIC
0x75e91e511aab621fe644ea79344d1df3c4fcea868efc4cefc86bb2a95f3c6ad9408858822023-03-29 3:38:463 days 16 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xd982e5919aaacde21e3063caedf684d328af143d0.699999999999999956 MATIC
0x5958f22761de94c8ae40d868db0224a99f9e7f823f85440d3aef9abdc16129d2408793152023-03-28 23:30:113 days 20 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x3f34b1bddf904c39373f75a87380cb9cedea9fd80.200000000000000011 MATIC
0x0e24fc8486e7d694569b1dc84e414f11d80ced20ba5d103f2f67ab9a3437df05408365212023-03-27 19:59:275 days 22 mins ago 0x8abcab16372160679d6a155d96d9986454136a0a0x383308f39f493bb640ed94a2e32c6a84351b7d071.199999999999999956 MATIC
0xa3a6238074db7b8527ffecca546fb07c38a0d06f4ec13d3f39fe0ee1a35caa5b408210232023-03-27 10:18:055 days 10 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xe5a95515b90d07dda69b5e4d1c363bed9a84a93d0.200000000000000011 MATIC
0x94f64e5ba1a7a07c19451bd7f1568e80ba3f976bf6bc000e33c9cbf9a77923f2408182302023-03-27 8:30:465 days 11 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x2231403dc54d73860c6cf7702e4917a30e6ad44d0.5 MATIC
0x01df6c725297869f61d28bad9087feb4f1244accfa166e52147bd77722ea17d0408004562023-03-26 20:30:225 days 23 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xe2c7199a93b3f175b185087e18c02a39aaa0c2770.200000000000000011 MATIC
0xa4a1bdef44da92092a5b4c3677ddbb305c1015f71a73c43c4bcdfc1bb723999f407870692023-03-26 10:30:346 days 9 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x1c71f3103e18df24ecde46b653e016fbc0ea248a0.200000000000000011 MATIC
0xb75e4cff300f314917d717fbd3f7152f989505535f551c5acfd319280cbb52de407711282023-03-26 0:30:156 days 19 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x8714f53df9a003a090330baf9fc532ae9d1e3ca70.5 MATIC
0xcf7d72294ce81cb2c7f27b632efe38dbe35a41fe80a303b6007e35515770926b407499002023-03-25 11:31:157 days 8 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x626c4fd38dfcebd0a3d1951ffb4b4388391ab1da0.599999999999999978 MATIC
0x077d4373a468fdaea556e4faa96770d75c94d85ca92ffa9dc7af70f723ce7448407259572023-03-24 20:47:477 days 23 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xed0598b07faacb711870b58eae40878128928a4b0.200000000000000011 MATIC
0x06dd379c29315333c3c4f37f3bd2b61f9b2b4a434810678d9b544a185b6a73ac407205712023-03-24 17:31:018 days 2 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x0ce6409cd3d9692a4538fbf0528f330dec9554f30.200000000000000011 MATIC
0xfe4dde7f28b5d304ccf51a6dbc812312206ae34aee10c34660a3941ec91f82a6407159362023-03-24 14:30:418 days 5 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xa5210613135ac1abfc1480082da7317659600c960.299999999999999989 MATIC
0x1a29164f275dab516a80e59bf50adeecf053380456d7aa8f41b6bb832e2eff12406557432023-03-23 0:37:589 days 19 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xed0598b07faacb711870b58eae40878128928a4b0.200000000000000011 MATIC
0x325fc9d5694dbb6529736d7cf6f993f1bec88777ed55d9426322064ca166edf5406350882023-03-22 11:17:2210 days 9 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0xd77df0b7b7d7b45693c21aac464af2ba104331710.200000000000000011 MATIC
0x53be32112981e1fa743531a8edbafd547afa44657275ff0a64f35818d60bd360406132812023-03-21 21:15:0210 days 23 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x3f4de830ae136c8cf20aa73312db0d9cd4866cb20.200000000000000011 MATIC
0xffa0a079b792346f27672e03e1732ac57639cfe8773a1bffd474b81d916b9bae406103702023-03-21 19:27:1511 days 54 mins ago 0x8abcab16372160679d6a155d96d9986454136a0a0xa99e7d8cab882173ec8684ed0adb62c1a664722d1 MATIC
0x58a380ab914a975d38a5ed0bc18134ad363ef556dd6160a3ed53b75a5a9ced95405409502023-03-19 21:24:1112 days 22 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x486ad9d12d4210471a403efcc16ec52c6df11ffb0.5 MATIC
0x8494d6623fe648c8a0c2bc8c564af375787aa43890ca7dc58623d20ab69d3924405337592023-03-19 16:44:4113 days 3 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x61d07ba641dec0b2e1457c16989b7815e34be2e40.5 MATIC
0xd52eae2a13052fb443562466b415d83040c7e68e0eccc9be4f8e7780a9ed3ce9405304532023-03-19 14:39:2213 days 5 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x77b4b018cc0090fff9d36dbed0c44c7d8543e8881.199999999999999956 MATIC
0x1ccb85efbf6ca5b99f290a7c33657fc0b66af04af2eaa9f06c95bc393f9fc601404916782023-03-18 13:51:1514 days 6 hrs ago 0x8abcab16372160679d6a155d96d9986454136a0a0x96fccdd40aa504a3610ce770467d1ea5d483d3540.699999999999999956 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixMysteryBox

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-11-19
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/PhenixMysteryBox.sol


pragma solidity ^0.8.9;






contract PhenixMysteryBox is Ownable {
    using SafeMath for uint256;

    uint256 constant FXP_BASE = 100000;

    bool public isEnabled;
    address public tokenERC20Address;
    address public tokenERC721Address;
    address public routerAddress;
    uint256 public tokenERC721Discount;
    uint256 public tokenERC721DiscountMaximum;
    uint256 public boxRequestFee;
    uint256 public maxBoxQuantity;

    mapping(address => bool) public adminMapping;
    mapping(uint256 => Box) public boxes;
    mapping(address => bool) public boxFeeExempt;
    BoxRequest[] public boxRequests;

    enum BoxRequestStatus {
        PENDING,
        DISTRIBUTED,
        FAILED
    }

    struct Box {
        uint256 boxIndex; // The Box Index
        uint256 boxCostETH; // Cost of Box in ETH
        uint256 boxCostERC20; // Cost of Box in ERC20
        bool useETHPrice; // Whether ERC20 Price should be based on ETH Price
        address rewardERC20Address; // ERC20 Token Reward Address
        address rewardERC721Address; // ERC721 Token Reward Address
        uint256 minimumERC20Holdings; // Minimum Token Holdings Required to Acesss
        bool boxEnabled;
    }

    struct BoxCost {
        uint256 ethPrice;
        uint256 erc20Price;
    }

    struct BoxRequest {
        uint256 boxRequestIndex;
        uint256 boxIndex;
        uint256 boxQuantity;
        BoxRequestStatus boxStatus;
        address recipient;
        uint256 rewardERC20Amount;
        uint256 rewardETHAmount;
        uint256[] rewardERC721Tokens;
    }

    constructor(
        address _admin,
        address _tokenERC20Address,
        address _tokenERC721Address
    ) {
        adminMapping[_admin] = true;
        boxFeeExempt[msg.sender] = true;

        tokenERC20Address = _tokenERC20Address;
        tokenERC721Address = _tokenERC721Address;
        boxRequestFee = 1 ether;

        // routerAddress = 0x145677FC4d9b8F19B5D56d1820c48e0443049a30; // MMF
        routerAddress = 0x51aBA405De2b25E5506DeA32A6697F450cEB1a17; // PhotoSwap (Testnet)

        tokenERC721Discount = (1 * FXP_BASE) / 100;
        tokenERC721DiscountMaximum = (5 * FXP_BASE) / 100;
        isEnabled = true;
        maxBoxQuantity = 500;

        // Initialize Starting Boxes
        _setBox(
            0,
            0 ether,
            0 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            1,
            2 ether,
            2 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            2,
            5 ether,
            5 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
        _setBox(
            3,
            10 ether,
            10 ether,
            true,
            _tokenERC20Address,
            _tokenERC721Address,
            0,
            true
        );
    }

    event RequestBox(
        uint256 indexed boxIndex,
        uint256 indexed boxQuantity,
        address indexed recipient
    );

    modifier enabled() {
        require(isEnabled == true, "Boxes are disabled.");
        _;
    }

    modifier isAdmin() {
        require(
            adminMapping[msg.sender] == true || msg.sender == owner(),
            "Not admin."
        );
        _;
    }

    modifier isValidBox(uint256 _boxIndex) {
        require(boxes[_boxIndex].boxEnabled == true, "Box index is invalid.");
        _;
    }

    modifier enoughTokens(uint256 _boxIndex) {
        require(
            IERC20(tokenERC20Address).balanceOf(msg.sender) >=
                boxes[_boxIndex].minimumERC20Holdings,
            "Not Enough Tokens Held."
        );
        _;
    }

    function setEnabledStatus(bool _status) external onlyOwner {
        isEnabled = _status;
    }

    function setUserAdmin(address _user, bool _status) external onlyOwner {
        adminMapping[_user] = _status;
    }

    function setBoxFeeExemptUser(address _address, bool _status)
        external
        onlyOwner
    {
        boxFeeExempt[_address] = _status;
    }

    function setMaxBoxQuantity(uint256 _maxBoxQuantity) external onlyOwner {
        maxBoxQuantity = _maxBoxQuantity;
    }

    function setERC721Discount(uint256 _numerator, uint256 _denominator)
        external
        onlyOwner
    {
        tokenERC721Discount = FXP_BASE.mul(_numerator).div(_denominator);
    }

    function setERC721DiscountMaximum(uint256 _numerator, uint256 _denominator)
        external
        onlyOwner
    {
        tokenERC721DiscountMaximum = FXP_BASE.mul(_numerator).div(_denominator);
    }

    function setERC721Address(address _tokenAddress) external onlyOwner {
        tokenERC721Address = _tokenAddress;
    }

    function setERC20Address(address _tokenAddress) external onlyOwner {
        tokenERC20Address = _tokenAddress;
    }

    function setBoxRequestFee(uint256 _boxRequestFee) external onlyOwner {
        boxRequestFee = _boxRequestFee;
    }

    function setRouterAddress(address _address) external onlyOwner {
        routerAddress = _address;
    }

    function setBox(
        uint256 _boxIndex,
        uint256 _boxCostETH,
        uint256 _boxCostERC20,
        bool _useETHPrice,
        address _rewardERC20Address,
        address _rewardERC721Address,
        uint256 _minimumERC20Holdings,
        bool _boxEnabled
    ) external onlyOwner {
        _setBox(
            _boxIndex,
            _boxCostETH,
            _boxCostERC20,
            _useETHPrice,
            _rewardERC20Address,
            _rewardERC721Address,
            _minimumERC20Holdings,
            _boxEnabled
        );
    }

    function _setBox(
        uint256 _boxIndex,
        uint256 _boxCostETH,
        uint256 _boxCostERC20,
        bool _useETHPrice,
        address _rewardERC20Address,
        address _rewardERC721Address,
        uint256 _minimumERC20Holdings,
        bool _boxEnabled
    ) internal {
        boxes[_boxIndex] = Box(
            _boxIndex,
            _boxCostETH,
            _boxCostERC20,
            _useETHPrice,
            _rewardERC20Address,
            _rewardERC721Address,
            _minimumERC20Holdings,
            _boxEnabled
        );
    }

    function withdrawERC721Tokens(
        address _erc721Address,
        uint256[] memory _tokenIds
    ) external onlyOwner {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            IERC721(_erc721Address).transferFrom(
                address(this),
                msg.sender,
                _tokenIds[i]
            );
        }
    }

    function withdrawERC20Token(address _tokenAddress, uint256 _amount)
        external
        onlyOwner
    {
        require(
            IERC20(_tokenAddress).balanceOf(address(this)) >= _amount,
            "Not enough tokens to withdraw."
        );

        IERC20(_tokenAddress).transfer(msg.sender, _amount);
    }

    function withdrawETH(uint256 _amount) external onlyOwner {
        require(address(this).balance >= _amount, "Not enough ETH to withdraw");
        (bool success, ) = address(msg.sender).call{value: _amount}("");

        require(success, "Failed to withdraw ETH.");
    }

    function boxCostOf(uint256 _boxValue, address _user)
        public
        view
        returns (uint256)
    {
        uint256 userERC721Balance = IERC721(tokenERC721Address).balanceOf(
            _user
        );
        if (userERC721Balance > 0) {
            uint256 discountNumerator = (tokenERC721Discount *
                userERC721Balance) > tokenERC721DiscountMaximum
                ? tokenERC721DiscountMaximum
                : (tokenERC721Discount * userERC721Balance);

            uint256 discountAmount = _boxValue.mul(discountNumerator).div(
                FXP_BASE
            );

            return _boxValue.sub(discountAmount);
        } else {
            return _boxValue;
        }
    }

    function getFeeTokenAmount(uint256 _ethAmount)
        public
        view
        returns (uint256)
    {
        if (_ethAmount > 0) {
            address[] memory path = new address[](2);
            path[0] = IUniswapV2Router02(routerAddress).WETH();
            path[1] = tokenERC20Address;

            uint256[] memory amountsOut = IUniswapV2Router02(routerAddress)
                .getAmountsOut(_ethAmount, path);

            return amountsOut[1];
        } else {
            return 0;
        }
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function getBoxRequestsCount() external view returns (uint256) {
        return boxRequests.length;
    }

    function getBoxRequests(uint256 _count)
        external
        view
        returns (BoxRequest[] memory)
    {
        uint256 _boxRequestsCount = _count >= boxRequests.length || _count == 0
            ? boxRequests.length
            : _count;

        BoxRequest[] memory _boxRequests = new BoxRequest[](_boxRequestsCount);

        for (uint256 i = _boxRequestsCount; i > 0; i--) {
            _boxRequests[i - 1] = boxRequests[(boxRequests.length - i)];
        }

        return _boxRequests;
    }

    function getBoxes(uint256 _count) external view returns (Box[] memory) {
        Box[] memory _boxes = new Box[](_count);

        for (uint256 i = 0; i < _count; i++) {
            _boxes[i] = boxes[i];
        }

        return _boxes;
    }

    function getBoxPrices(uint256 _count)
        external
        view
        returns (BoxCost[] memory)
    {
        BoxCost[] memory _boxCosts = new BoxCost[](_count);
        for (uint256 i = 0; i < _count; i++) {
            _boxCosts[i] = BoxCost(
                boxes[i].boxCostETH,
                boxes[i].useETHPrice
                    ? getFeeTokenAmount(boxes[i].boxCostERC20)
                    : boxes[i].boxCostERC20
            );
        }
        return _boxCosts;
    }

    function requestBoxAdmin(
        address _recipient,
        uint256 _boxIndex,
        uint256 _boxQuantity
    ) external isAdmin isValidBox(_boxIndex) {
        _requestBox(_recipient, _boxIndex, _boxQuantity);
    }

    function requestBoxWithETH(uint256 _boxIndex, uint256 _boxQuantity)
        external
        payable
        isValidBox(_boxIndex)
        enoughTokens(_boxIndex)
        enabled
    {
        require(_boxQuantity <= maxBoxQuantity, "Max Quantity Exceeded!");
        if (boxFeeExempt[msg.sender] == false) {
            uint256 requestCost = boxCostOf(
                boxes[_boxIndex].boxCostETH,
                msg.sender
            ) * _boxQuantity;
            require(
                msg.value >= requestCost.add(boxRequestFee),
                "Not enough ETH to pay."
            );
        }

        _requestBox(msg.sender, _boxIndex, _boxQuantity);
    }

    function requestBoxWithToken(uint256 _boxIndex, uint256 _boxQuantity)
        external
        payable
        isValidBox(_boxIndex)
        enoughTokens(_boxIndex)
        enabled
    {
        require(_boxQuantity <= maxBoxQuantity, "Max Quantity Exceeded!");
        if (boxFeeExempt[msg.sender] == false) {
            uint256 requestCost = boxes[_boxIndex].useETHPrice
                ? getFeeTokenAmount(
                    boxCostOf(boxes[_boxIndex].boxCostERC20, msg.sender) *
                        _boxQuantity
                )
                : boxCostOf(boxes[_boxIndex].boxCostERC20, msg.sender) *
                    _boxQuantity;

            require(msg.value >= boxRequestFee, "Not enough ETH to pay fee.");
            require(
                IERC20(tokenERC20Address).balanceOf(msg.sender) >= requestCost,
                "Not enough tokens to pay."
            );
            IERC20(tokenERC20Address).transferFrom(
                msg.sender,
                address(this),
                requestCost
            );
        }
        _requestBox(msg.sender, _boxIndex, _boxQuantity);
    }

    function _requestBox(
        address _recipient,
        uint256 _boxIndex,
        uint256 _boxQuantity
    ) internal {
        boxRequests.push(
            BoxRequest(
                boxRequests.length,
                _boxIndex,
                _boxQuantity,
                BoxRequestStatus.PENDING,
                _recipient,
                0,
                0,
                new uint256[](0)
            )
        );
        emit RequestBox(_boxIndex, _boxQuantity, msg.sender);
    }

    function updateBoxRequestStatus(
        uint256 _boxRequestIndex,
        BoxRequestStatus _status
    ) external isAdmin {
        require(
            _boxRequestIndex <= boxRequests.length,
            "Invalid Box request Index."
        );

        boxRequests[_boxRequestIndex].boxStatus = _status;
    }

    function distributeBox(
        uint256 _boxRequestIndex,
        uint256 _rewardETHAmount,
        uint256 _rewardERC20Amount,
        uint256[] memory _rewardERC721Tokens
    ) external isAdmin {
        require(
            _boxRequestIndex <= boxRequests.length &&
                boxRequests[_boxRequestIndex].boxStatus ==
                BoxRequestStatus.PENDING,
            "Box request cannot be distributed."
        );

        if (_rewardETHAmount > 0) {
            (bool sent, ) = address(boxRequests[_boxRequestIndex].recipient)
                .call{value: _rewardETHAmount}("");
            require(sent, "Failed to send ETH reward.");
        }

        if (_rewardERC20Amount > 0) {
            IERC20(
                boxes[boxRequests[_boxRequestIndex].boxIndex].rewardERC20Address
            ).transfer(
                    boxRequests[_boxRequestIndex].recipient,
                    _rewardERC20Amount
                );
        }

        for (uint256 i = 0; i < _rewardERC721Tokens.length; i++) {
            IERC721(
                boxes[boxRequests[_boxRequestIndex].boxIndex]
                    .rewardERC721Address
            ).transferFrom(
                    address(this),
                    boxRequests[_boxRequestIndex].recipient,
                    _rewardERC721Tokens[i]
                );
        }

        boxRequests[_boxRequestIndex] = BoxRequest(
            boxRequests[_boxRequestIndex].boxRequestIndex,
            boxRequests[_boxRequestIndex].boxIndex,
            boxRequests[_boxRequestIndex].boxQuantity,
            BoxRequestStatus.DISTRIBUTED,
            boxRequests[_boxRequestIndex].recipient,
            _rewardERC20Amount,
            _rewardETHAmount,
            _rewardERC721Tokens
        );
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_tokenERC20Address","type":"address"},{"internalType":"address","name":"_tokenERC721Address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"boxIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"RequestBox","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminMapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxValue","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"boxCostOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boxFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boxRequestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxRequests","outputs":[{"internalType":"uint256","name":"boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"boxStatus","type":"uint8"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"rewardERC20Amount","type":"uint256"},{"internalType":"uint256","name":"rewardETHAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxes","outputs":[{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxCostETH","type":"uint256"},{"internalType":"uint256","name":"boxCostERC20","type":"uint256"},{"internalType":"bool","name":"useETHPrice","type":"bool"},{"internalType":"address","name":"rewardERC20Address","type":"address"},{"internalType":"address","name":"rewardERC721Address","type":"address"},{"internalType":"uint256","name":"minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"boxEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"_rewardETHAmount","type":"uint256"},{"internalType":"uint256","name":"_rewardERC20Amount","type":"uint256"},{"internalType":"uint256[]","name":"_rewardERC721Tokens","type":"uint256[]"}],"name":"distributeBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxPrices","outputs":[{"components":[{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"uint256","name":"erc20Price","type":"uint256"}],"internalType":"struct PhenixMysteryBox.BoxCost[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxRequests","outputs":[{"components":[{"internalType":"uint256","name":"boxRequestIndex","type":"uint256"},{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxQuantity","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"boxStatus","type":"uint8"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"rewardERC20Amount","type":"uint256"},{"internalType":"uint256","name":"rewardETHAmount","type":"uint256"},{"internalType":"uint256[]","name":"rewardERC721Tokens","type":"uint256[]"}],"internalType":"struct PhenixMysteryBox.BoxRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBoxRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getBoxes","outputs":[{"components":[{"internalType":"uint256","name":"boxIndex","type":"uint256"},{"internalType":"uint256","name":"boxCostETH","type":"uint256"},{"internalType":"uint256","name":"boxCostERC20","type":"uint256"},{"internalType":"bool","name":"useETHPrice","type":"bool"},{"internalType":"address","name":"rewardERC20Address","type":"address"},{"internalType":"address","name":"rewardERC721Address","type":"address"},{"internalType":"uint256","name":"minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"boxEnabled","type":"bool"}],"internalType":"struct PhenixMysteryBox.Box[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"getFeeTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBoxQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxQuantity","type":"uint256"}],"name":"requestBoxWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxIndex","type":"uint256"},{"internalType":"uint256","name":"_boxCostETH","type":"uint256"},{"internalType":"uint256","name":"_boxCostERC20","type":"uint256"},{"internalType":"bool","name":"_useETHPrice","type":"bool"},{"internalType":"address","name":"_rewardERC20Address","type":"address"},{"internalType":"address","name":"_rewardERC721Address","type":"address"},{"internalType":"uint256","name":"_minimumERC20Holdings","type":"uint256"},{"internalType":"bool","name":"_boxEnabled","type":"bool"}],"name":"setBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBoxFeeExemptUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestFee","type":"uint256"}],"name":"setBoxRequestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setERC20Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setERC721Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setERC721Discount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setERC721DiscountMaximum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEnabledStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBoxQuantity","type":"uint256"}],"name":"setMaxBoxQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setUserAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenERC20Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenERC721DiscountMaximum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boxRequestIndex","type":"uint256"},{"internalType":"enum PhenixMysteryBox.BoxRequestStatus","name":"_status","type":"uint8"}],"name":"updateBoxRequestStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawERC721Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620036ef380380620036ef83398101604081905262000034916200084a565b6200003f33620007dd565b6001600160a01b038084166000908152600860209081526040808320805460ff199081166001908117909255338552600a909352922080549091168217905580548483166001600160a01b03199182161782556002805493851693821693909317909255670de0b6b3a7640000600655600380549092167351aba405de2b25e5506dea32a6697f450ceb1a1717909155606490620000e290620186a09062000894565b620000ee9190620008c0565b600455606462000103620186a0600562000894565b6200010f9190620008c0565b6005556000805460ff60a01b1916600160a01b1781556101f460075560408051610100808201835283825260208083018581529383018581526001606085018181526001600160a01b038a8116608088019081528a821660a0890190815260c089018b815260e08a019586529a8052600990965296517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b5596517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c5591517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d5590517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6e805495516001600160a81b0319909616911515610100600160a81b0319169190911794861690930293909317909155517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6f80546001600160a01b031916919093161790915590517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f7055517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f71805460ff19169115159190911790556040805161010080820183526001808352671bc16d674ec800006020808501828152958501918252606085018381526001600160a01b038981166080880190815289821660a08901908152600060c08a0181815260e08b0189815298909152600990955297517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a365597517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a375592517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3855517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a39805497516001600160a81b0319909816911515610100600160a81b031916919091179683169094029590951790925591517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3a80546001600160a01b0319169190921617905590517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3b55517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3c805460ff19169115159190911790556040805161010080820183526002808352674563918244f4000060208085018281529585019182526001606086018181526001600160a01b038a8116608089019081528a821660a08a01908152600060c08b0181815260e08c01968752989052600990955297517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c35597517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c45592517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c55591517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c6805496516001600160a81b0319909716911515610100600160a81b031916919091179587169094029490941790925591517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c780546001600160a01b0319169190941617909255517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c855517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c9805460ff19169115159190911790556040805161010080820183526003808352678ac7230489e8000060208085018281529585019182526001606086018181526001600160a01b038a8116608089019081528a821660a08a01908152600060c08b0181815260e08c01968752989052600990955297517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e75597517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e85592517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e95591517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ea805496516001600160a81b0319909716911515610100600160a81b031916919091179587169094029490941790925591517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61eb80546001600160a01b0319169190941617909255517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ec55517fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ed805460ff1916911515919091179055505050620008e3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200084557600080fd5b919050565b6000806000606084860312156200086057600080fd5b6200086b846200082d565b92506200087b602085016200082d565b91506200088b604085016200082d565b90509250925092565b8082028115828204841417620008ba57634e487b7160e01b600052601160045260246000fd5b92915050565b600082620008de57634e487b7160e01b600052601260045260246000fd5b500490565b612dfc80620008f36000396000f3fe60806040526004361061024a5760003560e01c80636aa633b611610139578063b50fbeee116100b6578063e966b7ce1161007a578063e966b7ce1461076f578063ed2b77e61461078f578063f14210a6146107bf578063f145e29f146107df578063f2fde38b146107ff578063fba178ba1461081f57600080fd5b8063b50fbeee146106c9578063c49d56f3146106f9578063cf5bc2371461070c578063dc9efc7914610722578063dce265651461074257600080fd5b8063928d81c1116100fd578063928d81c11461063357806397e2a462146106535780639a03d9a3146106735780639c05e53014610693578063b00f90a6146106b357600080fd5b80636aa633b61461056f578063715018a6146105a057806379057cab146105b55780638be24888146105e85780638da5cb5b1461061557600080fd5b80633268cc56116101c75780634604a9621161018b5780634604a962146104375780634ed3faf2146104575780635c86ae711461050f5780635e2ff4d31461052f5780635e4a6e3e1461054f57600080fd5b80633268cc56146103a2578063338cef61146103c257806341bec0d2146103d757806341cb87fc146103f757806344e038201461041757600080fd5b806312065fe01161020e57806312065fe01461030c57806315510fcd1461031f5780631902aab11461033f5780632d3e400a1461035f5780633267f8ab1461037557600080fd5b80630342836e1461025657806305c15b4c1461027857806308d68d4d1461029857806309d1b2d1146102d55780631137ea53146102f957600080fd5b3661025157005b600080fd5b34801561026257600080fd5b5061027661027136600461259f565b61083f565b005b34801561028457600080fd5b506102766102933660046125d6565b610865565b3480156102a457600080fd5b506001546102b8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e157600080fd5b506102eb60065481565b6040519081526020016102cc565b61027661030736600461259f565b610900565b34801561031857600080fd5b50476102eb565b34801561032b57600080fd5b5061027661033a366004612619565b610b4d565b34801561034b57600080fd5b5061027661035a366004612652565b610b80565b34801561036b57600080fd5b506102eb60055481565b34801561038157600080fd5b50610395610390366004612652565b610b8d565b6040516102cc919061266b565b3480156103ae57600080fd5b506003546102b8906001600160a01b031681565b3480156103ce57600080fd5b50600b546102eb565b3480156103e357600080fd5b506102766103f236600461270d565b610cdd565b34801561040357600080fd5b5061027661041236600461270d565b610d07565b34801561042357600080fd5b50610276610432366004612800565b610d31565b34801561044357600080fd5b50610276610452366004612850565b610df2565b34801561046357600080fd5b506104c6610472366004612652565b600960205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929360ff808416946101009094046001600160a01b03908116949316921688565b6040805198895260208901979097529587019490945291151560608601526001600160a01b0390811660808601521660a084015260c0830152151560e0820152610100016102cc565b34801561051b57600080fd5b5061027661052a3660046128aa565b6113a6565b34801561053b57600080fd5b506102eb61054a3660046128d3565b61148b565b34801561055b57600080fd5b5061027661056a3660046128f8565b61156a565b34801561057b57600080fd5b5060005461059090600160a01b900460ff1681565b60405190151581526020016102cc565b3480156105ac57600080fd5b50610276611670565b3480156105c157600080fd5b506105d56105d0366004612652565b611684565b6040516102cc97969594939291906129b5565b3480156105f457600080fd5b50610608610603366004612652565b6116df565b6040516102cc91906129fe565b34801561062157600080fd5b506000546001600160a01b03166102b8565b34801561063f57600080fd5b5061027661064e366004612af2565b6118d2565b34801561065f57600080fd5b506102eb61066e366004612652565b611a03565b34801561067f57600080fd5b5061027661068e36600461270d565b611b93565b34801561069f57600080fd5b506102766106ae36600461259f565b611bbd565b3480156106bf57600080fd5b506102eb60075481565b3480156106d557600080fd5b506105906106e436600461270d565b600a6020526000908152604090205460ff1681565b61027661070736600461259f565b611bdd565b34801561071857600080fd5b506102eb60045481565b34801561072e57600080fd5b5061027661073d366004612652565b611f9e565b34801561074e57600080fd5b5061076261075d366004612652565b611fab565b6040516102cc9190612b1e565b34801561077b57600080fd5b5061027661078a366004612619565b6120b5565b34801561079b57600080fd5b506105906107aa36600461270d565b60086020526000908152604090205460ff1681565b3480156107cb57600080fd5b506102766107da366004612652565b6120e8565b3480156107eb57600080fd5b506102766107fa366004612b60565b6121dc565b34801561080b57600080fd5b5061027661081a36600461270d565b612202565b34801561082b57600080fd5b506002546102b8906001600160a01b031681565b61084761227b565b61085e81610858620186a0856122d5565b906122e8565b6004555050565b3360009081526008602052604090205460ff1615156001148061089257506000546001600160a01b031633145b6108b75760405162461bcd60e51b81526004016108ae90612b7d565b60405180910390fd5b600082815260096020526040902060060154829060ff1615156001146108ef5760405162461bcd60e51b81526004016108ae90612ba1565b6108fa8484846122f4565b50505050565b600082815260096020526040902060060154829060ff1615156001146109385760405162461bcd60e51b81526004016108ae90612ba1565b600083815260096020526040908190206005015460015491516370a0823160e01b815233600482015285926001600160a01b0316906370a0823190602401602060405180830381865afa158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190612bd0565b10156109ff5760405162461bcd60e51b81526020600482015260176024820152762737ba1022b737bab3b4102a37b5b2b739902432b6321760491b60448201526064016108ae565b600054600160a01b900460ff161515600114610a535760405162461bcd60e51b81526020600482015260136024820152722137bc32b99030b932903234b9b0b13632b21760691b60448201526064016108ae565b600754831115610a9e5760405162461bcd60e51b81526020600482015260166024820152754d6178205175616e746974792045786365656465642160501b60448201526064016108ae565b336000908152600a602052604081205460ff1615159003610b42576000848152600960205260408120600101548490610ad7903361148b565b610ae19190612bff565b9050610af86006548261247890919063ffffffff16565b341015610b405760405162461bcd60e51b81526020600482015260166024820152752737ba1032b737bab3b41022aa24103a37903830bc9760511b60448201526064016108ae565b505b6108fa3385856122f4565b610b5561227b565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610b8861227b565b600755565b606060008267ffffffffffffffff811115610baa57610baa61272a565b604051908082528060200260200182016040528015610c1957816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201528252600019909201910181610bc85790505b50905060005b83811015610cd6576000818152600960209081526040918290208251610100808201855282548252600183015493820193909352600282015493810193909352600381015460ff808216151560608601529290046001600160a01b03908116608085015260048201541660a0840152600581015460c08401526006015416151560e08201528251839083908110610cb857610cb8612c16565b60200260200101819052508080610cce90612c2c565b915050610c1f565b5092915050565b610ce561227b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610d0f61227b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610d3961227b565b60005b8151811015610ded57826001600160a01b03166323b872dd3033858581518110610d6857610d68612c16565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b505050508080610de590612c2c565b915050610d3c565b505050565b3360009081526008602052604090205460ff16151560011480610e1f57506000546001600160a01b031633145b610e3b5760405162461bcd60e51b81526004016108ae90612b7d565b600b548411801590610e8757506000600b8581548110610e5d57610e5d612c16565b600091825260209091206003600790920201015460ff166002811115610e8557610e8561297d565b145b610ede5760405162461bcd60e51b815260206004820152602260248201527f426f7820726571756573742063616e6e6f742062652064697374726962757465604482015261321760f11b60648201526084016108ae565b8215610fb2576000600b8581548110610ef957610ef9612c16565b60009182526020822060079190910201600301546040516101009091046001600160a01b03169186919081818185875af1925050503d8060008114610f5a576040519150601f19603f3d011682016040523d82523d6000602084013e610f5f565b606091505b5050905080610fb05760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f2073656e6420455448207265776172642e00000000000060448201526064016108ae565b505b81156110b25760096000600b8681548110610fcf57610fcf612c16565b906000526020600020906007020160010154815260200190815260200160002060030160019054906101000a90046001600160a01b03166001600160a01b031663a9059cbb600b868154811061102757611027612c16565b600091825260209091206007909102016003015460405160e083901b6001600160e01b03191681526101009091046001600160a01b03166004820152602481018590526044016020604051808303816000875af115801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190612c45565b505b60005b81518110156111ea5760096000600b87815481106110d5576110d5612c16565b906000526020600020906007020160010154815260200190815260200160002060040160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd30600b888154811061112e5761112e612c16565b906000526020600020906007020160030160019054906101000a90046001600160a01b031685858151811061116557611165612c16565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b5050505080806111e290612c2c565b9150506110b5565b50604051806101000160405280600b868154811061120a5761120a612c16565b9060005260206000209060070201600001548152602001600b868154811061123457611234612c16565b9060005260206000209060070201600101548152602001600b868154811061125e5761125e612c16565b60009182526020918290206002600790920201015482520160018152602001600b868154811061129057611290612c16565b906000526020600020906007020160030160019054906101000a90046001600160a01b03166001600160a01b0316815260200183815260200184815260200182815250600b85815481106112e6576112e6612c16565b906000526020600020906007020160008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561133c5761133c61297d565b021790555060808201516003820180546001600160a01b0390921661010002610100600160a81b031990921691909117905560a0820151600482015560c0820151600582015560e0820151805161139d9160068401916020909101906124e0565b50505050505050565b3360009081526008602052604090205460ff161515600114806113d357506000546001600160a01b031633145b6113ef5760405162461bcd60e51b81526004016108ae90612b7d565b600b548211156114415760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420426f78207265717565737420496e6465782e00000000000060448201526064016108ae565b80600b838154811061145557611455612c16565b60009182526020909120600360079092020101805460ff191660018360028111156114825761148261297d565b02179055505050565b6002546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190612bd0565b9050801561155f576000600554826004546115189190612bff565b11611530578160045461152b9190612bff565b611534565b6005545b90506000611549620186a061085888856122d5565b90506115558682612484565b9350505050611564565b839150505b92915050565b61157261227b565b61166688888888888888886040805161010080820183528a825260208083019a8b52828401998a52971515606083019081526001600160a01b039788166080840190815296881660a0840190815260c0840196875294151560e0840190815260009c8d52600990995292909a20905181559751600189015595516002880155945160038701805493518516909802610100600160a81b0319911515919091166001600160a81b031990931692909217919091179095559151600484018054919093166001600160a01b0319909116179091559151600582015590516006909101805491151560ff1992909216919091179055565b5050505050505050565b61167861227b565b6116826000612490565b565b600b818154811061169457600080fd5b60009182526020909120600790910201805460018201546002830154600384015460048501546005909501549395509193909260ff83169261010090046001600160a01b0316919087565b600b54606090600090831015806116f4575082155b6116fe5782611702565b600b545b905060008167ffffffffffffffff81111561171f5761171f61272a565b60405190808252806020026020018201604052801561175857816020015b61174561252b565b81526020019060019003908161173d5790505b509050815b80156118ca57600b8054611772908390612c62565b8154811061178257611782612c16565b9060005260206000209060070201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1660028111156117de576117de61297d565b60028111156117ef576117ef61297d565b81526020016003820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160048201548152602001600582015481526020016006820180548060200260200160405190810160405280929190818152602001828054801561188557602002820191906000526020600020905b815481526020019060010190808311611871575b5050505050815250508260018361189c9190612c62565b815181106118ac576118ac612c16565b602002602001018190525080806118c290612c75565b91505061175d565b509392505050565b6118da61227b565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190612bd0565b10156119925760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e7320746f2077697468647261772e000060448201526064016108ae565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ded9190612c45565b60008115611b8b576040805160028082526060820183526000926020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a999190612c8c565b81600081518110611aac57611aac612c16565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611adc57611adc612c16565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152600092919091169063d06ca61f90611b209087908690600401612ca9565b600060405180830381865afa158015611b3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b659190810190612d00565b905080600181518110611b7a57611b7a612c16565b602002602001015192505050919050565b506000919050565b611b9b61227b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611bc561227b565b611bd681610858620186a0856122d5565b6005555050565b600082815260096020526040902060060154829060ff161515600114611c155760405162461bcd60e51b81526004016108ae90612ba1565b600083815260096020526040908190206005015460015491516370a0823160e01b815233600482015285926001600160a01b0316906370a0823190602401602060405180830381865afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c949190612bd0565b1015611cdc5760405162461bcd60e51b81526020600482015260176024820152762737ba1022b737bab3b4102a37b5b2b739902432b6321760491b60448201526064016108ae565b600054600160a01b900460ff161515600114611d305760405162461bcd60e51b81526020600482015260136024820152722137bc32b99030b932903234b9b0b13632b21760691b60448201526064016108ae565b600754831115611d7b5760405162461bcd60e51b81526020600482015260166024820152754d6178205175616e746974792045786365656465642160501b60448201526064016108ae565b336000908152600a602052604081205460ff1615159003610b425760008481526009602052604081206003015460ff16611ddc576000858152600960205260409020600201548490611dcd903361148b565b611dd79190612bff565b611e08565b600085815260096020526040902060020154611e08908590611dfe903361148b565b61066e9190612bff565b9050600654341015611e5c5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682045544820746f20706179206665652e00000000000060448201526064016108ae565b6001546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec89190612bd0565b1015611f165760405162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f75676820746f6b656e7320746f207061792e0000000000000060448201526064016108ae565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190612c45565b50506108fa3385856122f4565b611fa661227b565b600655565b606060008267ffffffffffffffff811115611fc857611fc861272a565b60405190808252806020026020018201604052801561200d57816020015b6040805180820190915260008082526020820152815260200190600190039081611fe65790505b50905060005b83811015610cd6576040805180820182526000838152600960208181529382206001810154845291859052835260030154909182019060ff1661206757600083815260096020526040902060020154612082565b60008381526009602052604090206002015461208290611a03565b81525082828151811061209757612097612c16565b602002602001018190525080806120ad90612c2c565b915050612013565b6120bd61227b565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6120f061227b565b804710156121405760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682045544820746f20776974686472617700000000000060448201526064016108ae565b604051600090339083908381818185875af1925050503d8060008114612182576040519150601f19603f3d011682016040523d82523d6000602084013e612187565b606091505b50509050806121d85760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f207769746864726177204554482e00000000000000000060448201526064016108ae565b5050565b6121e461227b565b60008054911515600160a01b0260ff60a01b19909216919091179055565b61220a61227b565b6001600160a01b03811661226f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ae565b61227881612490565b50565b6000546001600160a01b031633146116825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ae565b60006122e18284612bff565b9392505050565b60006122e18284612d91565b6040805161010081018252600b80548252602082018590529181018390526060810160008152602001856001600160a01b031681526020016000815260200160008152602001600067ffffffffffffffff8111156123545761235461272a565b60405190808252806020026020018201604052801561237d578160200160208202803683370190505b50905281546001818101845560009384526020938490208351600790930201918255928201518184015560408201516002808301919091556060830151600383018054949593949193909260ff199092169184908111156123e0576123e061297d565b021790555060808201516003820180546001600160a01b0390921661010002610100600160a81b031990921691909117905560a0820151600482015560c0820151600582015560e082015180516124419160068401916020909101906124e0565b5050604051339150829084907fc141efc5224689477b2f8e1ed15f5fbc9997078d32769b5901867444be2e562890600090a4505050565b60006122e18284612db3565b60006122e18284612c62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821561251b579160200282015b8281111561251b578251825591602001919060010190612500565b5061252792915061258a565b5090565b6040518061010001604052806000815260200160008152602001600081526020016000600281111561255f5761255f61297d565b815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b5b80821115612527576000815560010161258b565b600080604083850312156125b257600080fd5b50508035926020909101359150565b6001600160a01b038116811461227857600080fd5b6000806000606084860312156125eb57600080fd5b83356125f6816125c1565b95602085013595506040909401359392505050565b801515811461227857600080fd5b6000806040838503121561262c57600080fd5b8235612637816125c1565b915060208301356126478161260b565b809150509250929050565b60006020828403121561266457600080fd5b5035919050565b602080825282518282018190526000919060409081850190868401855b8281101561270057815180518552868101518786015285810151868601526060808201511515908601526080808201516001600160a01b039081169187019190915260a0808301519091169086015260c0808201519086015260e0908101511515908501526101009093019290850190600101612688565b5091979650505050505050565b60006020828403121561271f57600080fd5b81356122e1816125c1565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127695761276961272a565b604052919050565b600067ffffffffffffffff82111561278b5761278b61272a565b5060051b60200190565b600082601f8301126127a657600080fd5b813560206127bb6127b683612771565b612740565b82815260059290921b840181019181810190868411156127da57600080fd5b8286015b848110156127f557803583529183019183016127de565b509695505050505050565b6000806040838503121561281357600080fd5b823561281e816125c1565b9150602083013567ffffffffffffffff81111561283a57600080fd5b61284685828601612795565b9150509250929050565b6000806000806080858703121561286657600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561289257600080fd5b61289e87828801612795565b91505092959194509250565b600080604083850312156128bd57600080fd5b8235915060208301356003811061264757600080fd5b600080604083850312156128e657600080fd5b823591506020830135612647816125c1565b600080600080600080600080610100898b03121561291557600080fd5b88359750602089013596506040890135955060608901356129358161260b565b94506080890135612945816125c1565b935060a0890135612955816125c1565b925060c0890135915060e089013561296c8161260b565b809150509295985092959890939650565b634e487b7160e01b600052602160045260246000fd5b600381106129b157634e487b7160e01b600052602160045260246000fd5b9052565b878152602081018790526040810186905260e081016129d76060830187612993565b6001600160a01b0394909416608082015260a081019290925260c090910152949350505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015612ae357603f198a85030186528251610100808601825187528a8301518b880152898301518a880152606080840151612a65828a0182612993565b50506080838101516001600160a01b03169088015260a0838101519088015260c0808401519088015260e092830151928701919091528151908190529089019061012086019084905b80821015612ace5783518352928b0192918b019160019190910190612aae565b50509689019694505091870191600101612a26565b50919998505050505050505050565b60008060408385031215612b0557600080fd5b8235612b10816125c1565b946020939093013593505050565b602080825282518282018190526000919060409081850190868401855b8281101561270057815180518552860151868501529284019290850190600101612b3b565b600060208284031215612b7257600080fd5b81356122e18161260b565b6020808252600a90820152692737ba1030b236b4b71760b11b604082015260600190565b6020808252601590820152742137bc1034b73232bc1034b99034b73b30b634b21760591b604082015260600190565b600060208284031215612be257600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761156457611564612be9565b634e487b7160e01b600052603260045260246000fd5b600060018201612c3e57612c3e612be9565b5060010190565b600060208284031215612c5757600080fd5b81516122e18161260b565b8181038181111561156457611564612be9565b600081612c8457612c84612be9565b506000190190565b600060208284031215612c9e57600080fd5b81516122e1816125c1565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612cf35784516001600160a01b031683529383019391830191600101612cce565b5090979650505050505050565b60006020808385031215612d1357600080fd5b825167ffffffffffffffff811115612d2a57600080fd5b8301601f81018513612d3b57600080fd5b8051612d496127b682612771565b81815260059190911b82018301908381019087831115612d6857600080fd5b928401925b82841015612d8657835182529284019290840190612d6d565b979650505050505050565b600082612dae57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561156457611564612be956fea2646970667358221220ad056c03cfab77e66ed5290018f8073985d001d2c36af86ff56fa62a5e62198564736f6c6343000811003300000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a4930000000000000000000000006c997a37f5a1dca62b58eeb01041f056942966b3000000000000000000000000752892900c197b9c5b10b93e6f19b0365c296f18

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a4930000000000000000000000006c997a37f5a1dca62b58eeb01041f056942966b3000000000000000000000000752892900c197b9c5b10b93e6f19b0365c296f18

-----Decoded View---------------
Arg [0] : _admin (address): 0x55dc352c9247ea5168687a26e219933f8ba7a493
Arg [1] : _tokenERC20Address (address): 0x6c997a37f5a1dca62b58eeb01041f056942966b3
Arg [2] : _tokenERC721Address (address): 0x752892900c197b9c5b10b93e6f19b0365c296f18

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000055dc352c9247ea5168687a26e219933f8ba7a493
Arg [1] : 0000000000000000000000006c997a37f5a1dca62b58eeb01041f056942966b3
Arg [2] : 000000000000000000000000752892900c197b9c5b10b93e6f19b0365c296f18


Deployed ByteCode Sourcemap

24691:15207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29214:194;;;;;;;;;;-1:-1:-1;29214:194:0;;;;;:::i;:::-;;:::i;:::-;;35105:226;;;;;;;;;;-1:-1:-1;35105:226:0;;;;;:::i;:::-;;:::i;24841:32::-;;;;;;;;;;-1:-1:-1;24841:32:0;;;;-1:-1:-1;;;;;24841:32:0;;;;;;-1:-1:-1;;;;;955:32:1;;;937:51;;925:2;910:18;24841:32:0;;;;;;;;25044:28;;;;;;;;;;;;;;;;;;;1145:25:1;;;1133:2;1118:18;25044:28:0;999:177:1;35339:688:0;;;;;;:::i;:::-;;:::i;33579:101::-;;;;;;;;;;-1:-1:-1;33651:21:0;33579:101;;28922:154;;;;;;;;;;-1:-1:-1;28922:154:0;;;;;:::i;:::-;;:::i;29084:122::-;;;;;;;;;;-1:-1:-1;29084:122:0;;;;;:::i;:::-;;:::i;24996:41::-;;;;;;;;;;;;;;;;34334:251;;;;;;;;;;-1:-1:-1;34334:251:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24920:28::-;;;;;;;;;;-1:-1:-1;24920:28:0;;;;-1:-1:-1;;;;;24920:28:0;;;33688:107;;;;;;;;;;-1:-1:-1;33769:11:0;:18;33688:107;;29761:119;;;;;;;;;;-1:-1:-1;29761:119:0;;;;;:::i;:::-;;:::i;30014:106::-;;;;;;;;;;-1:-1:-1;30014:106:0;;;;;:::i;:::-;;:::i;31304:361::-;;;;;;;;;;-1:-1:-1;31304:361:0;;;;;:::i;:::-;;:::i;38041:1817::-;;;;;;;;;;-1:-1:-1;38041:1817:0;;;;;:::i;:::-;;:::i;25168:36::-;;;;;;;;;;-1:-1:-1;25168:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25168:36:0;;;;;;;;;;;;;;6289:25:1;;;6345:2;6330:18;;6323:34;;;;6373:18;;;6366:34;;;;6443:14;;6436:22;6431:2;6416:18;;6409:50;-1:-1:-1;;;;;6534:15:1;;;6528:3;6513:19;;6506:44;6587:15;6486:3;6566:19;;6559:44;6634:3;6619:19;;6612:35;6691:14;6684:22;6678:3;6663:19;;6656:51;6276:3;6261:19;25168:36:0;5958:755:1;37712:321:0;;;;;;;;;;-1:-1:-1;37712:321:0;;;;;:::i;:::-;;:::i;32296:738::-;;;;;;;;;;-1:-1:-1;32296:738:0;;;;;:::i;:::-;;:::i;30128:577::-;;;;;;;;;;-1:-1:-1;30128:577:0;;;;;:::i;:::-;;:::i;24813:21::-;;;;;;;;;;-1:-1:-1;24813:21:0;;;;-1:-1:-1;;;24813:21:0;;;;;;;;;8493:14:1;;8486:22;8468:41;;8456:2;8441:18;24813:21:0;8328:187:1;23792:103:0;;;;;;;;;;;;;:::i;25262:31::-;;;;;;;;;;-1:-1:-1;25262:31:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;33803:523::-;;;;;;;;;;-1:-1:-1;33803:523:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23144:87::-;;;;;;;;;;-1:-1:-1;23190:7:0;23217:6;-1:-1:-1;;;;;23217:6:0;23144:87;;31673:330;;;;;;;;;;-1:-1:-1;31673:330:0;;;;;:::i;:::-;;:::i;33042:529::-;;;;;;;;;;-1:-1:-1;33042:529:0;;;;;:::i;:::-;;:::i;29632:121::-;;;;;;;;;;-1:-1:-1;29632:121:0;;;;;:::i;:::-;;:::i;29416:208::-;;;;;;;;;;-1:-1:-1;29416:208:0;;;;;:::i;:::-;;:::i;25079:29::-;;;;;;;;;;;;;;;;25211:44;;;;;;;;;;-1:-1:-1;25211:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36035:1144;;;;;;:::i;:::-;;:::i;24955:34::-;;;;;;;;;;;;;;;;29888:118;;;;;;;;;;-1:-1:-1;29888:118:0;;;;;:::i;:::-;;:::i;34593:504::-;;;;;;;;;;-1:-1:-1;34593:504:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28796:118::-;;;;;;;;;;-1:-1:-1;28796:118:0;;;;;:::i;:::-;;:::i;25117:44::-;;;;;;;;;;-1:-1:-1;25117:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32011:277;;;;;;;;;;-1:-1:-1;32011:277:0;;;;;:::i;:::-;;:::i;28691:97::-;;;;;;;;;;-1:-1:-1;28691:97:0;;;;;:::i;:::-;;:::i;24050:201::-;;;;;;;;;;-1:-1:-1;24050:201:0;;;;;:::i;:::-;;:::i;24880:33::-;;;;;;;;;;-1:-1:-1;24880:33:0;;;;-1:-1:-1;;;;;24880:33:0;;;29214:194;23030:13;:11;:13::i;:::-;29358:42:::1;29387:12:::0;29358:24:::1;24798:6;29371:10:::0;29358:12:::1;:24::i;:::-;:28:::0;::::1;:42::i;:::-;29336:19;:64:::0;-1:-1:-1;;29214:194:0:o;35105:226::-;28176:10;28163:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;23190:7:0;23217:6;-1:-1:-1;;;;;23217:6:0;28199:10;:21;28163:57;28141:117;;;;-1:-1:-1;;;28141:117:0;;;;;;;:::i;:::-;;;;;;;;;28344:16:::1;::::0;;;:5:::1;:16;::::0;;;;:27:::1;;::::0;35253:9;;28344:27:::1;;:35;;:27:::0;:35:::1;28336:69;;;;-1:-1:-1::0;;;28336:69:0::1;;;;;;;:::i;:::-;35275:48:::2;35287:10;35299:9;35310:12;35275:11;:48::i;:::-;28269:1:::1;35105:226:::0;;;:::o;35339:688::-;28344:16;;;;:5;:16;;;;;:27;;;35462:9;;28344:27;;:35;;:27;:35;28336:69;;;;-1:-1:-1;;;28336:69:0;;;;;;;:::i;:::-;28575:16:::1;::::0;;;:5:::1;:16;::::0;;;;;;:37:::1;;::::0;28514:17:::1;::::0;28507:47;;-1:-1:-1;;;28507:47:0;;28543:10:::1;28507:47;::::0;::::1;937:51:1::0;28575:16:0;;-1:-1:-1;;;;;28514:17:0::1;::::0;28507:35:::1;::::0;910:18:1;;28507:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:105;;28485:178;;;::::0;-1:-1:-1;;;28485:178:0;;14142:2:1;28485:178:0::1;::::0;::::1;14124:21:1::0;14181:2;14161:18;;;14154:30;-1:-1:-1;;;14200:18:1;;;14193:53;14263:18;;28485:178:0::1;13940:347:1::0;28485:178:0::1;28042:9:::2;::::0;-1:-1:-1;;;28042:9:0;::::2;;;:17;;28055:4;28042:17;28034:49;;;::::0;-1:-1:-1;;;28034:49:0;;14494:2:1;28034:49:0::2;::::0;::::2;14476:21:1::0;14533:2;14513:18;;;14506:30;-1:-1:-1;;;14552:18:1;;;14545:49;14611:18;;28034:49:0::2;14292:343:1::0;28034:49:0::2;35563:14:::3;;35547:12;:30;;35539:65;;;::::0;-1:-1:-1;;;35539:65:0;;14842:2:1;35539:65:0::3;::::0;::::3;14824:21:1::0;14881:2;14861:18;;;14854:30;-1:-1:-1;;;14900:18:1;;;14893:52;14962:18;;35539:65:0::3;14640:346:1::0;35539:65:0::3;35632:10;35619:24;::::0;;;:12:::3;:24;::::0;;;;;::::3;;:33;;::::0;;35615:344:::3;;35669:19;35719:16:::0;;;:5:::3;:16;::::0;;;;:27:::3;;::::0;35793:12;;35691:99:::3;::::0;35765:10:::3;35691:9;:99::i;:::-;:114;;;;:::i;:::-;35669:136;;35859:30;35875:13;;35859:11;:15;;:30;;;;:::i;:::-;35846:9;:43;;35820:127;;;::::0;-1:-1:-1;;;35820:127:0;;15498:2:1;35820:127:0::3;::::0;::::3;15480:21:1::0;15537:2;15517:18;;;15510:30;-1:-1:-1;;;15556:18:1;;;15549:52;15618:18;;35820:127:0::3;15296:346:1::0;35820:127:0::3;35654:305;35615:344;35971:48;35983:10;35995:9;36006:12;35971:11;:48::i;28922:154::-:0;23030:13;:11;:13::i;:::-;-1:-1:-1;;;;;29036:22:0;;;::::1;;::::0;;;:12:::1;:22;::::0;;;;:32;;-1:-1:-1;;29036:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28922:154::o;29084:122::-;23030:13;:11;:13::i;:::-;29166:14:::1;:32:::0;29084:122::o;34334:251::-;34391:12;34416:19;34448:6;34438:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34438:17:0;;-1:-1:-1;;34438:17:0;;;;;;;;;;;;34416:39;;34473:9;34468:84;34492:6;34488:1;:10;34468:84;;;34532:8;;;;:5;:8;;;;;;;;;34520:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34520:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;;;;34532:8;;34520:9;;;;;;:::i;:::-;;;;;;:20;;;;34500:3;;;;;:::i;:::-;;;;34468:84;;;-1:-1:-1;34571:6:0;34334:251;-1:-1:-1;;34334:251:0:o;29761:119::-;23030:13;:11;:13::i;:::-;29839:17:::1;:33:::0;;-1:-1:-1;;;;;;29839:33:0::1;-1:-1:-1::0;;;;;29839:33:0;;;::::1;::::0;;;::::1;::::0;;29761:119::o;30014:106::-;23030:13;:11;:13::i;:::-;30088::::1;:24:::0;;-1:-1:-1;;;;;;30088:24:0::1;-1:-1:-1::0;;;;;30088:24:0;;;::::1;::::0;;;::::1;::::0;;30014:106::o;31304:361::-;23030:13;:11;:13::i;:::-;31446:9:::1;31441:217;31465:9;:16;31461:1;:20;31441:217;;;31511:14;-1:-1:-1::0;;;;;31503:36:0::1;;31566:4;31590:10;31619:9;31629:1;31619:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;31503:143:::1;::::0;-1:-1:-1;;;;;;31503:143:0::1;::::0;;;;;;-1:-1:-1;;;;;16177:15:1;;;31503:143:0::1;::::0;::::1;16159:34:1::0;16229:15;;;;16209:18;;;16202:43;16261:18;;;16254:34;16094:18;;31503:143:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31483:3;;;;;:::i;:::-;;;;31441:217;;;;31304:361:::0;;:::o;38041:1817::-;28176:10;28163:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;23190:7:0;23217:6;-1:-1:-1;;;;;23217:6:0;28199:10;:21;28163:57;28141:117;;;;-1:-1:-1;;;28141:117:0;;;;;;;:::i;:::-;38295:11:::1;:18:::0;38275:38;::::1;::::0;::::1;::::0;:143:::1;;-1:-1:-1::0;38394:24:0::1;38334:11;38346:16;38334:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39;::::0;::::1;;:84;::::0;::::1;;;;;;:::i;:::-;;38275:143;38253:227;;;::::0;-1:-1:-1;;;38253:227:0;;16501:2:1;38253:227:0::1;::::0;::::1;16483:21:1::0;16540:2;16520:18;;;16513:30;16579:34;16559:18;;;16552:62;-1:-1:-1;;;16630:18:1;;;16623:32;16672:19;;38253:227:0::1;16299:398:1::0;38253:227:0::1;38497:20:::0;;38493:227:::1;;38535:9;38558:11;38570:16;38558:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;:39;;::::0;38550:100:::1;::::0;38558:39:::1;::::0;;::::1;-1:-1:-1::0;;;;;38558:39:0::1;::::0;38629:16;;38550:100;;38558:29;38550:100;38629:16;38558:39;38550:100:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38534:116;;;38673:4;38665:43;;;::::0;-1:-1:-1;;;38665:43:0;;17114:2:1;38665:43:0::1;::::0;::::1;17096:21:1::0;17153:2;17133:18;;;17126:30;17192:28;17172:18;;;17165:56;17238:18;;38665:43:0::1;16912:350:1::0;38665:43:0::1;38519:201;38493:227;38736:22:::0;;38732:290:::1;;38800:5;:45;38806:11;38818:16;38806:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;38800:45;;;;;;;;;;;:64;;;;;;;;;;-1:-1:-1::0;;;;;38800:64:0::1;-1:-1:-1::0;;;;;38775:113:0::1;;38911:11;38923:16;38911:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:39;;::::0;38775:235:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;38775:235:0;;;38911:39:::1;::::0;;::::1;-1:-1:-1::0;;;;;38911:39:0::1;38775:235;::::0;::::1;17441:51:1::0;17508:18;;;17501:34;;;17414:18;;38775:235:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38732:290;39039:9;39034:387;39058:19;:26;39054:1;:30;39034:387;;;39132:5;:45;39138:11;39150:16;39138:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;39132:45;;;;;;;;;;;:87;;;;;;;;;;-1:-1:-1::0;;;;;39132:87:0::1;-1:-1:-1::0;;;;;39106:141:0::1;;39278:4;39306:11;39318:16;39306:29;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1::0;;;;;39306:39:0::1;39368:19;39388:1;39368:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;39106:303:::1;::::0;-1:-1:-1;;;;;;39106:303:0::1;::::0;;;;;;-1:-1:-1;;;;;16177:15:1;;;39106:303:0::1;::::0;::::1;16159:34:1::0;16229:15;;;;16209:18;;;16202:43;16261:18;;;16254:34;16094:18;;39106:303:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39086:3;;;;;:::i;:::-;;;;39034:387;;;;39465:385;;;;;;;;39490:11;39502:16;39490:29;;;;;;;;:::i;:::-;;;;;;;;;;;:45;;;39465:385;;;;39550:11;39562:16;39550:29;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;;39465:385;;;;39603:11;39615:16;39603:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:41:::1;:29;::::0;;::::1;;:41;::::0;39465:385;;::::1;39659:28;39465:385;;;;39702:11;39714:16;39702:29;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1::0;;;;;39702:39:0::1;-1:-1:-1::0;;;;;39465:385:0::1;;;;;39756:18;39465:385;;;;39789:16;39465:385;;;;39820:19;39465:385;;::::0;39433:11:::1;39445:16;39433:29;;;;;;;;:::i;:::-;;;;;;;;;;;:417;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;39433:417:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;39433:417:0;;::::1;;;-1:-1:-1::0;;;;;;39433:417:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;;38041:1817:0:o;37712:321::-;28176:10;28163:24;;;;:12;:24;;;;;;;;:32;;:24;:32;;:57;;-1:-1:-1;23190:7:0;23217:6;-1:-1:-1;;;;;23217:6:0;28199:10;:21;28163:57;28141:117;;;;-1:-1:-1;;;28141:117:0;;;;;;;:::i;:::-;37891:11:::1;:18:::0;37871:38;::::1;;37849:114;;;::::0;-1:-1:-1;;;37849:114:0;;17998:2:1;37849:114:0::1;::::0;::::1;17980:21:1::0;18037:2;18017:18;;;18010:30;18076:28;18056:18;;;18049:56;18122:18;;37849:114:0::1;17796:350:1::0;37849:114:0::1;38018:7;37976:11;37988:16;37976:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:39:::1;:29;::::0;;::::1;;:39;:49:::0;;-1:-1:-1;;37976:49:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;37712:321:::0;;:::o;32296:738::-;32458:18;;32450:68;;-1:-1:-1;;;32450:68:0;;-1:-1:-1;;;;;955:32:1;;;32450:68:0;;;937:51:1;32397:7:0;;;;32458:18;;;32450:37;;910:18:1;;32450:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32422:96;-1:-1:-1;32533:21:0;;32529:498;;32571:25;32660:26;;32639:17;32600:19;;:56;;;;:::i;:::-;32599:87;:194;;32775:17;32753:19;;:39;;;;:::i;:::-;32599:194;;;32706:26;;32599:194;32571:222;-1:-1:-1;32810:22:0;32835:78;24798:6;32835:32;:9;32571:222;32835:13;:32::i;:78::-;32810:103;-1:-1:-1;32937:29:0;:9;32810:103;32937:13;:29::i;:::-;32930:36;;;;;;;32529:498;33006:9;32999:16;;;32296:738;;;;;:::o;30128:577::-;23030:13;:11;:13::i;:::-;30443:254:::1;30465:9;30489:11;30515:13;30543:12;30570:19;30604:20;30639:21;30675:11;31038:250:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31038:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31019:16:0;;;:5;:16;;;;;;;:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31019:269:0;;;;;;;-1:-1:-1;;;;;;31019:269:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31019:269:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31019:269:0;;;;;;;;;;30713:583;30443:254:::1;30128:577:::0;;;;;;;;:::o;23792:103::-;23030:13;:11;:13::i;:::-;23857:30:::1;23884:1;23857:18;:30::i;:::-;23792:103::o:0;25262:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25262:31:0;;;;;;;;;;;-1:-1:-1;;;;;25262:31:0;;;;:::o;33803:523::-;33968:11;:18;33893:19;;33930:25;;33958:28;;;;:43;;-1:-1:-1;33990:11:0;;33958:43;:99;;34051:6;33958:99;;;34017:11;:18;33958:99;33930:127;;34070:32;34122:17;34105:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;34070:70:0;-1:-1:-1;34170:17:0;34153:134;34189:5;;34153:134;;34238:11;34251:18;;:22;;34272:1;;34251:22;:::i;:::-;34238:37;;;;;;;;:::i;:::-;;;;;;;;;;;34216:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34216:59:0;-1:-1:-1;;;;;34216:59:0;-1:-1:-1;;;;;34216:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;34233:1;34229;:5;;;;:::i;:::-;34216:19;;;;;;;;:::i;:::-;;;;;;:59;;;;34196:3;;;;;:::i;:::-;;;;34153:134;;;-1:-1:-1;34306:12:0;33803:523;-1:-1:-1;;;33803:523:0:o;31673:330::-;23030:13;:11;:13::i;:::-;31816:46:::1;::::0;-1:-1:-1;;;31816:46:0;;31856:4:::1;31816:46;::::0;::::1;937:51:1::0;31866:7:0;;-1:-1:-1;;;;;31816:31:0;::::1;::::0;::::1;::::0;910:18:1;;31816:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;31794:137;;;::::0;-1:-1:-1;;;31794:137:0;;18627:2:1;31794:137:0::1;::::0;::::1;18609:21:1::0;18666:2;18646:18;;;18639:30;18705:32;18685:18;;;18678:60;18755:18;;31794:137:0::1;18425:354:1::0;31794:137:0::1;31944:51;::::0;-1:-1:-1;;;31944:51:0;;31975:10:::1;31944:51;::::0;::::1;17441::1::0;17508:18;;;17501:34;;;-1:-1:-1;;;;;31944:30:0;::::1;::::0;::::1;::::0;17414:18:1;;31944:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33042:529::-:0;33137:7;33166:14;;33162:402;;33221:16;;;33235:1;33221:16;;;;;;;;33197:21;;33221:16;;;;;;;;-1:-1:-1;;33281:13:0;;33262:40;;;-1:-1:-1;;;33262:40:0;;;;33197;;-1:-1:-1;;;;;;33281:13:0;;;;33262:38;;-1:-1:-1;33262:40:0;;;;;;;;;;;;;;33281:13;33262:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33252:4;33257:1;33252:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33252:50:0;;;:7;;;;;;;;;:50;33327:17;;;33317:7;;33327:17;;;33317:4;;33327:17;33317:7;;;;;;:::i;:::-;-1:-1:-1;;;;;33317:27:0;;;:7;;;;;;;;;:27;33410:13;;33391:83;;-1:-1:-1;;;33391:83:0;;33361:27;;33410:13;;;;;33391:65;;:83;;33457:10;;33469:4;;33391:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33391:83:0;;;;;;;;;;;;:::i;:::-;33361:113;;33498:10;33509:1;33498:13;;;;;;;;:::i;:::-;;;;;;;33491:20;;;;33042:529;;;:::o;33162:402::-;-1:-1:-1;33551:1:0;;33042:529;-1:-1:-1;33042:529:0:o;29632:121::-;23030:13;:11;:13::i;:::-;29711:18:::1;:34:::0;;-1:-1:-1;;;;;;29711:34:0::1;-1:-1:-1::0;;;;;29711:34:0;;;::::1;::::0;;;::::1;::::0;;29632:121::o;29416:208::-;23030:13;:11;:13::i;:::-;29574:42:::1;29603:12:::0;29574:24:::1;24798:6;29587:10:::0;29574:12:::1;:24::i;:42::-;29545:26;:71:::0;-1:-1:-1;;29416:208:0:o;36035:1144::-;28344:16;;;;:5;:16;;;;;:27;;;36160:9;;28344:27;;:35;;:27;:35;28336:69;;;;-1:-1:-1;;;28336:69:0;;;;;;;:::i;:::-;28575:16:::1;::::0;;;:5:::1;:16;::::0;;;;;;:37:::1;;::::0;28514:17:::1;::::0;28507:47;;-1:-1:-1;;;28507:47:0;;28543:10:::1;28507:47;::::0;::::1;937:51:1::0;28575:16:0;;-1:-1:-1;;;;;28514:17:0::1;::::0;28507:35:::1;::::0;910:18:1;;28507:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:105;;28485:178;;;::::0;-1:-1:-1;;;28485:178:0;;14142:2:1;28485:178:0::1;::::0;::::1;14124:21:1::0;14181:2;14161:18;;;14154:30;-1:-1:-1;;;14200:18:1;;;14193:53;14263:18;;28485:178:0::1;13940:347:1::0;28485:178:0::1;28042:9:::2;::::0;-1:-1:-1;;;28042:9:0;::::2;;;:17;;28055:4;28042:17;28034:49;;;::::0;-1:-1:-1;;;28034:49:0;;14494:2:1;28034:49:0::2;::::0;::::2;14476:21:1::0;14533:2;14513:18;;;14506:30;-1:-1:-1;;;14552:18:1;;;14545:49;14611:18;;28034:49:0::2;14292:343:1::0;28034:49:0::2;36261:14:::3;;36245:12;:30;;36237:65;;;::::0;-1:-1:-1;;;36237:65:0;;14842:2:1;36237:65:0::3;::::0;::::3;14824:21:1::0;14881:2;14861:18;;;14854:30;-1:-1:-1;;;14900:18:1;;;14893:52;14962:18;;36237:65:0::3;14640:346:1::0;36237:65:0::3;36330:10;36317:24;::::0;;;:12:::3;:24;::::0;;;;;::::3;;:33;;::::0;;36313:800:::3;;36367:19;36389:16:::0;;;:5:::3;:16;::::0;;;;:28:::3;;::::0;::::3;;:307;;36618:16;::::0;;;:5:::3;:16;::::0;;;;:29:::3;;::::0;36684:12;;36608:52:::3;::::0;36649:10:::3;36608:9;:52::i;:::-;:88;;;;:::i;:::-;36389:307;;;36487:16;::::0;;;:5:::3;:16;::::0;;;;:29:::3;;::::0;36437:151:::3;::::0;36557:12;;36477:52:::3;::::0;36518:10:::3;36477:9;:52::i;:::-;:92;;;;:::i;36437:151::-;36367:329;;36734:13;;36721:9;:26;;36713:65;;;::::0;-1:-1:-1;;;36713:65:0;;20862:2:1;36713:65:0::3;::::0;::::3;20844:21:1::0;20901:2;20881:18;;;20874:30;20940:28;20920:18;;;20913:56;20986:18;;36713:65:0::3;20660:350:1::0;36713:65:0::3;36826:17;::::0;36819:47:::3;::::0;-1:-1:-1;;;36819:47:0;;36855:10:::3;36819:47;::::0;::::3;937:51:1::0;36870:11:0;;-1:-1:-1;;;;;36826:17:0::3;::::0;36819:35:::3;::::0;910:18:1;;36819:47:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;36793:149;;;::::0;-1:-1:-1;;;36793:149:0;;21217:2:1;36793:149:0::3;::::0;::::3;21199:21:1::0;21256:2;21236:18;;;21229:30;21295:27;21275:18;;;21268:55;21340:18;;36793:149:0::3;21015:349:1::0;36793:149:0::3;36964:17;::::0;36957:144:::3;::::0;-1:-1:-1;;;36957:144:0;;37014:10:::3;36957:144;::::0;::::3;16159:34:1::0;37051:4:0::3;16209:18:1::0;;;16202:43;16261:18;;;16254:34;;;-1:-1:-1;;;;;36964:17:0;;::::3;::::0;36957:38:::3;::::0;16094:18:1;;36957:144:0::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36352:761;37123:48;37135:10;37147:9;37158:12;37123:11;:48::i;29888:118::-:0;23030:13;:11;:13::i;:::-;29968::::1;:30:::0;29888:118::o;34593:504::-;34681:16;34715:26;34758:6;34744:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;34744:21:0;;;;;;;;;;;;;;;;34715:50;;34781:9;34776:287;34800:6;34796:1;:10;34776:287;;;34843:208;;;;;;;;-1:-1:-1;34869:8:0;;;:5;:8;;;;;;;:19;;;;34843:208;;34907:8;;;;;;:20;;;34843:208;;;;;34907:20;;:129;;35015:8;;;;:5;:8;;;;;:21;;;34907:129;;;34969:8;;;;:5;:8;;;;;:21;;;34951:40;;:17;:40::i;:::-;34843:208;;;34828:9;34838:1;34828:12;;;;;;;;:::i;:::-;;;;;;:223;;;;34808:3;;;;;:::i;:::-;;;;34776:287;;28796:118;23030:13;:11;:13::i;:::-;-1:-1:-1;;;;;28877:19:0;;;::::1;;::::0;;;:12:::1;:19;::::0;;;;:29;;-1:-1:-1;;28877:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28796:118::o;32011:277::-;23030:13;:11;:13::i;:::-;32112:7:::1;32087:21;:32;;32079:71;;;::::0;-1:-1:-1;;;32079:71:0;;21571:2:1;32079:71:0::1;::::0;::::1;21553:21:1::0;21610:2;21590:18;;;21583:30;21649:28;21629:18;;;21622:56;21695:18;;32079:71:0::1;21369:350:1::0;32079:71:0::1;32180:44;::::0;32162:12:::1;::::0;32188:10:::1;::::0;32212:7;;32162:12;32180:44;32162:12;32180:44;32212:7;32188:10;32180:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32161:63;;;32245:7;32237:43;;;::::0;-1:-1:-1;;;32237:43:0;;21926:2:1;32237:43:0::1;::::0;::::1;21908:21:1::0;21965:2;21945:18;;;21938:30;22004:25;21984:18;;;21977:53;22047:18;;32237:43:0::1;21724:347:1::0;32237:43:0::1;32068:220;32011:277:::0;:::o;28691:97::-;23030:13;:11;:13::i;:::-;28761:9:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;28761:19:0::1;-1:-1:-1::0;;;;28761:19:0;;::::1;::::0;;;::::1;::::0;;28691:97::o;24050:201::-;23030:13;:11;:13::i;:::-;-1:-1:-1;;;;;24139:22:0;::::1;24131:73;;;::::0;-1:-1:-1;;;24131:73:0;;22278:2:1;24131:73:0::1;::::0;::::1;22260:21:1::0;22317:2;22297:18;;;22290:30;22356:34;22336:18;;;22329:62;-1:-1:-1;;;22407:18:1;;;22400:36;22453:19;;24131:73:0::1;22076:402:1::0;24131:73:0::1;24215:28;24234:8;24215:18;:28::i;:::-;24050:201:::0;:::o;23309:132::-;23190:7;23217:6;-1:-1:-1;;;;;23217:6:0;21775:10;23373:23;23365:68;;;;-1:-1:-1;;;23365:68:0;;22685:2:1;23365:68:0;;;22667:21:1;;;22704:18;;;22697:30;22763:34;22743:18;;;22736:62;22815:18;;23365:68:0;22483:356:1;8689:98:0;8747:7;8774:5;8778:1;8774;:5;:::i;:::-;8767:12;8689:98;-1:-1:-1;;;8689:98:0:o;9088:::-;9146:7;9173:5;9177:1;9173;:5;:::i;37187:517::-;37354:268;;;;;;;;37323:11;37383:18;;37354:268;;;;;;;;;;;;;;;;;-1:-1:-1;37354:268:0;;;;37522:10;-1:-1:-1;;;;;37354:268:0;;;;;37551:1;37354:268;;;;37571:1;37354:268;;;;37605:1;37591:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37591:16:0;-1:-1:-1;37354:268:0;;37323:310;;;;;;;;-1:-1:-1;37323:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37323:310:0;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;37323:310:0;;;;;;;;;-1:-1:-1;;;;;37323:310:0;;;;;-1:-1:-1;;;;;;37323:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;37649:47:0;;37685:10;;-1:-1:-1;37671:12:0;;37660:9;;37649:47;;;;;37187:517;;;:::o;7951:98::-;8009:7;8036:5;8040:1;8036;:5;:::i;8332:98::-;8390:7;8417:5;8421:1;8417;:5;:::i;24411:191::-;24485:16;24504:6;;-1:-1:-1;;;;;24521:17:0;;;-1:-1:-1;;;;;;24521:17:0;;;;;;24554:40;;24504:6;;;;;;;24554:40;;24485:16;24554:40;24474:128;24411:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:248:1;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;267:131::-;-1:-1:-1;;;;;342:31:1;;332:42;;322:70;;388:1;385;378:12;403:383;480:6;488;496;549:2;537:9;528:7;524:23;520:32;517:52;;;565:1;562;555:12;517:52;604:9;591:23;623:31;648:5;623:31;:::i;:::-;673:5;725:2;710:18;;697:32;;-1:-1:-1;776:2:1;761:18;;;748:32;;403:383;-1:-1:-1;;;403:383:1:o;1181:118::-;1267:5;1260:13;1253:21;1246:5;1243:32;1233:60;;1289:1;1286;1279:12;1304:382;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1485:9;1472:23;1504:31;1529:5;1504:31;:::i;:::-;1554:5;-1:-1:-1;1611:2:1;1596:18;;1583:32;1624:30;1583:32;1624:30;:::i;:::-;1673:7;1663:17;;;1304:382;;;;;:::o;1691:180::-;1750:6;1803:2;1791:9;1782:7;1778:23;1774:32;1771:52;;;1819:1;1816;1809:12;1771:52;-1:-1:-1;1842:23:1;;1691:180;-1:-1:-1;1691:180:1:o;1972:1416::-;2185:2;2237:21;;;2307:13;;2210:18;;;2329:22;;;2156:4;;2185:2;2370;;2388:18;;;;2429:15;;;2156:4;2472:890;2486:6;2483:1;2480:13;2472:890;;;2545:13;;2583:9;;2571:22;;2633:11;;;2627:18;2613:12;;;2606:40;2686:11;;;2680:18;2666:12;;;2659:40;2722:4;2780:11;;;2774:18;2767:26;2760:34;2746:12;;;2739:56;2818:4;2861:11;;;2855:18;-1:-1:-1;;;;;2949:21:1;;;2935:12;;;2928:43;;;;2904:3;3042:11;;;3036:18;3032:27;;;3018:12;;;3011:49;3083:4;3127:11;;;3121:18;3107:12;;;3100:40;3163:4;3208:11;;;3202:18;1946:13;1939:21;3265:12;;;1927:34;3307:6;3298:16;;;;3337:15;;;;2508:1;2501:9;2472:890;;;-1:-1:-1;3379:3:1;;1972:1416;-1:-1:-1;;;;;;;1972:1416:1:o;3393:247::-;3452:6;3505:2;3493:9;3484:7;3480:23;3476:32;3473:52;;;3521:1;3518;3511:12;3473:52;3560:9;3547:23;3579:31;3604:5;3579:31;:::i;3645:127::-;3706:10;3701:3;3697:20;3694:1;3687:31;3737:4;3734:1;3727:15;3761:4;3758:1;3751:15;3777:275;3848:2;3842:9;3913:2;3894:13;;-1:-1:-1;;3890:27:1;3878:40;;3948:18;3933:34;;3969:22;;;3930:62;3927:88;;;3995:18;;:::i;:::-;4031:2;4024:22;3777:275;;-1:-1:-1;3777:275:1:o;4057:183::-;4117:4;4150:18;4142:6;4139:30;4136:56;;;4172:18;;:::i;:::-;-1:-1:-1;4217:1:1;4213:14;4229:4;4209:25;;4057:183::o;4245:662::-;4299:5;4352:3;4345:4;4337:6;4333:17;4329:27;4319:55;;4370:1;4367;4360:12;4319:55;4406:6;4393:20;4432:4;4456:60;4472:43;4512:2;4472:43;:::i;:::-;4456:60;:::i;:::-;4550:15;;;4636:1;4632:10;;;;4620:23;;4616:32;;;4581:12;;;;4660:15;;;4657:35;;;4688:1;4685;4678:12;4657:35;4724:2;4716:6;4712:15;4736:142;4752:6;4747:3;4744:15;4736:142;;;4818:17;;4806:30;;4856:12;;;;4769;;4736:142;;;-1:-1:-1;4896:5:1;4245:662;-1:-1:-1;;;;;;4245:662:1:o;4912:483::-;5005:6;5013;5066:2;5054:9;5045:7;5041:23;5037:32;5034:52;;;5082:1;5079;5072:12;5034:52;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5246:2:1;5231:18;;5218:32;5273:18;5262:30;;5259:50;;;5305:1;5302;5295:12;5259:50;5328:61;5381:7;5372:6;5361:9;5357:22;5328:61;:::i;:::-;5318:71;;;4912:483;;;;;:::o;5400:553::-;5511:6;5519;5527;5535;5588:3;5576:9;5567:7;5563:23;5559:33;5556:53;;;5605:1;5602;5595:12;5556:53;5641:9;5628:23;5618:33;;5698:2;5687:9;5683:18;5670:32;5660:42;;5749:2;5738:9;5734:18;5721:32;5711:42;;5804:2;5793:9;5789:18;5776:32;5831:18;5823:6;5820:30;5817:50;;;5863:1;5860;5853:12;5817:50;5886:61;5939:7;5930:6;5919:9;5915:22;5886:61;:::i;:::-;5876:71;;;5400:553;;;;;;;:::o;6718:345::-;6807:6;6815;6868:2;6856:9;6847:7;6843:23;6839:32;6836:52;;;6884:1;6881;6874:12;6836:52;6920:9;6907:23;6897:33;;6980:2;6969:9;6965:18;6952:32;7013:1;7006:5;7003:12;6993:40;;7029:1;7026;7019:12;7068:315;7136:6;7144;7197:2;7185:9;7176:7;7172:23;7168:32;7165:52;;;7213:1;7210;7203:12;7165:52;7249:9;7236:23;7226:33;;7309:2;7298:9;7294:18;7281:32;7322:31;7347:5;7322:31;:::i;7388:935::-;7504:6;7512;7520;7528;7536;7544;7552;7560;7613:3;7601:9;7592:7;7588:23;7584:33;7581:53;;;7630:1;7627;7620:12;7581:53;7666:9;7653:23;7643:33;;7723:2;7712:9;7708:18;7695:32;7685:42;;7774:2;7763:9;7759:18;7746:32;7736:42;;7828:2;7817:9;7813:18;7800:32;7841:28;7863:5;7841:28;:::i;:::-;7888:5;-1:-1:-1;7945:3:1;7930:19;;7917:33;7959;7917;7959;:::i;:::-;8011:7;-1:-1:-1;8070:3:1;8055:19;;8042:33;8084;8042;8084;:::i;:::-;8136:7;-1:-1:-1;8190:3:1;8175:19;;8162:33;;-1:-1:-1;8247:3:1;8232:19;;8219:33;8261:30;8219:33;8261:30;:::i;:::-;8310:7;8300:17;;;7388:935;;;;;;;;;;;:::o;8520:127::-;8581:10;8576:3;8572:20;8569:1;8562:31;8612:4;8609:1;8602:15;8636:4;8633:1;8626:15;8652:244;8740:1;8733:5;8730:12;8720:143;;8785:10;8780:3;8776:20;8773:1;8766:31;8820:4;8817:1;8810:15;8848:4;8845:1;8838:15;8720:143;8872:18;;8652:244::o;8901:678::-;9235:25;;;9291:2;9276:18;;9269:34;;;9334:2;9319:18;;9312:34;;;9222:3;9207:19;;9355:60;9411:2;9396:18;;9388:6;9355:60;:::i;:::-;-1:-1:-1;;;;;9452:32:1;;;;9446:3;9431:19;;9424:61;9472:3;9501:19;;9494:35;;;;9560:3;9545:19;;;9538:35;8901:678;;-1:-1:-1;;;;8901:678:1:o;9584:2114::-;9782:4;9811:2;9851;9840:9;9836:18;9881:2;9870:9;9863:21;9904:6;9939;9933:13;9970:6;9962;9955:22;9996:2;9986:12;;10029:2;10018:9;10014:18;10007:25;;10091:2;10081:6;10078:1;10074:14;10063:9;10059:30;10055:39;10129:2;10121:6;10117:15;10150:1;10171;10181:1488;10197:6;10192:3;10189:15;10181:1488;;;10294:2;10290:7;10278:9;10270:6;10266:22;10262:36;10257:3;10250:49;10328:6;10322:13;10358:6;10403:2;10395:6;10391:15;10440:2;10434:9;10426:6;10419:25;10495:2;10491;10487:11;10481:18;10476:2;10468:6;10464:15;10457:43;10551:2;10547;10543:11;10537:18;10532:2;10524:6;10520:15;10513:43;10579:4;10630:2;10626;10622:11;10616:18;10647:63;10706:2;10698:6;10694:15;10680:12;10647:63;:::i;:::-;-1:-1:-1;;10733:4:1;10784:11;;;10778:18;-1:-1:-1;;;;;10774:44:1;10757:15;;;10750:69;10806:3;10889:11;;;10883:18;10866:15;;;10859:43;10925:4;10972:11;;;10966:18;10949:15;;;10942:43;11008:4;11053:11;;;11047:18;11085:15;;;11078:27;;;;11166:21;;11200:24;;;;11291:23;;;;11258:3;11246:16;;;11338:1;;11352:209;11368:8;11363:3;11360:17;11352:209;;;11445:15;;11431:30;;11530:17;;;;11487:14;;;;11396:1;11387:11;;;;;11352:209;;;-1:-1:-1;;11647:12:1;;;;11584:5;-1:-1:-1;;11612:15:1;;;;10223:1;10214:11;10181:1488;;;-1:-1:-1;11686:6:1;;9584:2114;-1:-1:-1;;;;;;;;;9584:2114:1:o;11703:315::-;11771:6;11779;11832:2;11820:9;11811:7;11807:23;11803:32;11800:52;;;11848:1;11845;11838:12;11800:52;11887:9;11874:23;11906:31;11931:5;11906:31;:::i;:::-;11956:5;12008:2;11993:18;;;;11980:32;;-1:-1:-1;;;11703:315:1:o;12023:788::-;12244:2;12296:21;;;12366:13;;12269:18;;;12388:22;;;12215:4;;12244:2;12429;;12447:18;;;;12488:15;;;12215:4;12531:254;12545:6;12542:1;12539:13;12531:254;;;12604:13;;12642:9;;12630:22;;12692:11;;12686:18;12672:12;;;12665:40;12725:12;;;;12760:15;;;;12567:1;12560:9;12531:254;;12816:241;12872:6;12925:2;12913:9;12904:7;12900:23;12896:32;12893:52;;;12941:1;12938;12931:12;12893:52;12980:9;12967:23;12999:28;13021:5;12999:28;:::i;13062:334::-;13264:2;13246:21;;;13303:2;13283:18;;;13276:30;-1:-1:-1;;;13337:2:1;13322:18;;13315:40;13387:2;13372:18;;13062:334::o;13401:345::-;13603:2;13585:21;;;13642:2;13622:18;;;13615:30;-1:-1:-1;;;13676:2:1;13661:18;;13654:51;13737:2;13722:18;;13401:345::o;13751:184::-;13821:6;13874:2;13862:9;13853:7;13849:23;13845:32;13842:52;;;13890:1;13887;13880:12;13842:52;-1:-1:-1;13913:16:1;;13751:184;-1:-1:-1;13751:184:1:o;14991:127::-;15052:10;15047:3;15043:20;15040:1;15033:31;15083:4;15080:1;15073:15;15107:4;15104:1;15097:15;15123:168;15196:9;;;15227;;15244:15;;;15238:22;;15224:37;15214:71;;15265:18;;:::i;15647:127::-;15708:10;15703:3;15699:20;15696:1;15689:31;15739:4;15736:1;15729:15;15763:4;15760:1;15753:15;15779:135;15818:3;15839:17;;;15836:43;;15859:18;;:::i;:::-;-1:-1:-1;15906:1:1;15895:13;;15779:135::o;17546:245::-;17613:6;17666:2;17654:9;17645:7;17641:23;17637:32;17634:52;;;17682:1;17679;17672:12;17634:52;17714:9;17708:16;17733:28;17755:5;17733:28;:::i;18151:128::-;18218:9;;;18239:11;;;18236:37;;;18253:18;;:::i;18284:136::-;18323:3;18351:5;18341:39;;18360:18;;:::i;:::-;-1:-1:-1;;;18396:18:1;;18284:136::o;18784:251::-;18854:6;18907:2;18895:9;18886:7;18882:23;18878:32;18875:52;;;18923:1;18920;18913:12;18875:52;18955:9;18949:16;18974:31;18999:5;18974:31;:::i;19040:729::-;19210:4;19258:2;19247:9;19243:18;19288:6;19277:9;19270:25;19314:2;19352;19347;19336:9;19332:18;19325:30;19375:6;19410;19404:13;19441:6;19433;19426:22;19479:2;19468:9;19464:18;19457:25;;19517:2;19509:6;19505:15;19491:29;;19538:1;19548:195;19562:6;19559:1;19556:13;19548:195;;;19627:13;;-1:-1:-1;;;;;19623:39:1;19611:52;;19718:15;;;;19683:12;;;;19659:1;19577:9;19548:195;;;-1:-1:-1;19760:3:1;;19040:729;-1:-1:-1;;;;;;;19040:729:1:o;19774:881::-;19869:6;19900:2;19943;19931:9;19922:7;19918:23;19914:32;19911:52;;;19959:1;19956;19949:12;19911:52;19992:9;19986:16;20025:18;20017:6;20014:30;20011:50;;;20057:1;20054;20047:12;20011:50;20080:22;;20133:4;20125:13;;20121:27;-1:-1:-1;20111:55:1;;20162:1;20159;20152:12;20111:55;20191:2;20185:9;20214:60;20230:43;20270:2;20230:43;:::i;20214:60::-;20308:15;;;20390:1;20386:10;;;;20378:19;;20374:28;;;20339:12;;;;20414:19;;;20411:39;;;20446:1;20443;20436:12;20411:39;20470:11;;;;20490:135;20506:6;20501:3;20498:15;20490:135;;;20572:10;;20560:23;;20523:12;;;;20603;;;;20490:135;;;20644:5;19774:881;-1:-1:-1;;;;;;;19774:881:1:o;22844:217::-;22884:1;22910;22900:132;;22954:10;22949:3;22945:20;22942:1;22935:31;22989:4;22986:1;22979:15;23017:4;23014:1;23007:15;22900:132;-1:-1:-1;23046:9:1;;22844:217::o;23066:125::-;23131:9;;;23152:10;;;23149:36;;;23165:18;;:::i

Swarm Source

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