Contract 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb 2

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xfacb0233975cee3cf78bfb07220733938ba448eafd618c465fa20dcb45054089Set Approval For...386340492023-01-28 17:53:4524 secs ago0x3a9f5fc614c81002ec5eba791cfc7945ac9c9a54 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003509338771 72.535474086
0x0057a3d63bf848b17e20db46c6379656cc9203b29172a5f25b1329be6f317106Set Approval For...386340442023-01-28 17:53:3336 secs ago0x379ed39fc3e616a33cd0a90506080d690d0b594e IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003552925214 73.436374086
0x20cc2ab6aea7d5b26cc08da095ed15e438e4437e138dc795964d2d0034d49426Set Approval For...386340322023-01-28 17:53:091 min ago0xa513122024c71719d090677ffc0b705a32e726bb IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.001405929824 49.363780218
0x5eb8a4260c91691ad6c5ebb753fa35aa576ddfaa8aa48ccb768e6ad15b373c74Set Approval For...386340292023-01-28 17:53:011 min ago0x804b18d08a8c7435e5486448cfec6e039a8d74e3 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.001375584939 48.29833713
0x88e968645752f191c0f717b1ca1e46b696c4ffa8045cae8c99b169bd65365b18Transfer From386340292023-01-28 17:53:011 min ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004260537451 49.672244774
0x112770ec8d2e2eacfeeb3654efd9f88e12eaced4f183e966b7eb3e13ad801a2cSet Approval For...386339912023-01-28 17:51:412 mins ago0x804b18d08a8c7435e5486448cfec6e039a8d74e3 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.001509616693 53.004343034
0x992e74c94b7883195b182305cd7c7b8f78d48f96eb6052de91c2fa77e415c56fSet Approval For...386339602023-01-28 17:50:353 mins ago0x804b18d08a8c7435e5486448cfec6e039a8d74e3 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.001409087258 49.474641288
0xb3fae19b4ed78e35d18aa9b9c037a5448f35370dc7ec43f4c17f73cbf1bc6af4Transfer From386339582023-01-28 17:50:313 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004327248623 50.450009014
0x7567083395eb27a47d393ed1abe681ab35925e0317c9f291e07164686924eb81Set Approval For...386339472023-01-28 17:50:074 mins ago0xcd3c358f577f105556dd30bdd5cfb3d6591d748b IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003391120725 70.091993258
0x4896318924bb9888b6d157bee05ad51e059536a82fa1c7d6113bd6b8f7c1ffc4Set Approval For...386339242023-01-28 17:49:194 mins ago0xf712f752c61821c3b4837fe6a1dc3346e7792ac9 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003533759346 73.040229558
0x8025a3500a37c45acf10cf2a072f26ff5a1ceb5b8037e4d9823e042d9ab0995cTransfer From386339032023-01-28 17:48:335 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004464195407 52.046627812
0x8fff723ab9d9befaacc6d918f3a6eb85b7405ae66bbbc8a265b3a8e531f3419fSet Approval For...386338792023-01-28 17:47:436 mins ago0x7f48498d74b00a969e570eb4fbab69b8705b3302 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.00151303482 53.124357315
0x79b0e56fff9499d1a4eb5bdafb2cc90b407ffd5ffd945bf62e4f82681ebf10d0Set Approval For...386338492023-01-28 17:46:397 mins ago0xb70ebe0b5ec01b7511794244ae318b07a467222b IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004607314124 95.229824195
0x77fdda24572708f0d57deca883190e23f847e80bd62f0e66877959f063a04d93Set Approval For...386338322023-01-28 17:46:038 mins ago0x7f48498d74b00a969e570eb4fbab69b8705b3302 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003297352099 68.153864112
0xb24677c3f11fb3880a9a35c03a0a54e65533bbbf5228e1c96faa51d9439589d8Transfer From386338202023-01-28 17:45:378 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.006348626363 74.016606194
0xd35df3c7b0540afdb6c08358ebc6e5d379ac6c77168436df659e7cd6b6162bf2Set Approval For...386338182023-01-28 17:45:338 mins ago0xa1be5e36b1312f65ad01454e2f64a90ccac26270 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004918940373 101.670911587
0x4a0a15527a8e1b28f09c12ea083726eda5d13b70432f8aa7b2d994d214e53c58Set Approval For...386337062023-01-28 17:41:3212 mins ago0x4af683e34cf74dfeb8b77fdf96ec25ab9578c96b IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.001674494989 58.793405758
0xef9a5c97373bd2e70982ed1288cfe1dc2945161605a24dc44195d6812aa1a7adTransfer From386337022023-01-28 17:41:2412 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004516917867 52.661302126
0x8645219266e299732d427f01e36658cedff2065e2932cfa216b13168316e7da2Set Approval For...386336952023-01-28 17:41:0813 mins ago0x8116ad88e10d0957ecf06f32c36c9eb42bab35b9 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003576961843 73.933193681
0x2669bdd4ec64aef2bef8908b2c838c58199d5d7ea35a7165d75c88743dfe0622Set Approval For...386336942023-01-28 17:41:0613 mins ago0x4dae11ec8790f7c87c48a58e25a7b2cd75fc6c6f IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003579356324 73.982685858
0x7f5433171689b7681db257157be099ac04ddca186f6970f20c2d9c5dd3f1fd24Transfer From386336342023-01-28 17:39:0015 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.005085405844 59.289121799
0x4d1669099b857480a003332279989041e6f32232e715e8b7c65ac33255f0f29cSet Approval For...386336002023-01-28 17:37:4816 mins ago0x2e4a35919c5a462edceb3784637c232310a34112 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.005373977141 111.076189853
0x018c2e7016edb7fd0da3f95b5329b92367ea60a0cbf9306cbf7f8c275c6cd7d7Set Approval For...386335682023-01-28 17:36:4017 mins ago0x888c79f76dbf85048e7c8dcf0643daa5f6004c29 IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.005082425645 105.050032969
0xb2b0c86b94417a1e50e361b93f047aa8c6bd971ba9caf012a09fb5cd500a02b6Transfer From386335362023-01-28 17:35:3218 mins ago0x70f50da57caf8d7aafe02251de86013960d906ae IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.004896228557 57.083564266
0xdaa44d4f57101251f778b916cde44b5129bbacf4aed8810c7f4a2fef519c2dcfSet Approval For...386334892023-01-28 17:33:5220 mins ago0xa9ebe1be2a26a21694f7a8aab459934f1d493dbb IN  0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0 MATIC0.003726879423 77.03188077
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x82b0a051d7cd3c8647c8a698ae7b39bfbbe1af1ccb4369bc2412320225ac934b301326232022-06-29 10:07:36213 days 7 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x021cb85f70a879675f76064e82273ae379956d4411,785 MATIC
0x1d4cdf82b8f6d04d1c26e746ec23a70c490171d239c8a54551b73b009ef6a7a3296102132022-06-15 19:53:51226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x53e0fde768038efacb54a26fa5f4d1e3853757464.301523180795268722 MATIC
0x7fd1078e7ad3849fc378569fee9eba54770ca587b54b76c030d5b6dd62bc3455296101952022-06-15 19:53:15226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x7d58116dcb2ccb1b95ea45fa81009c027393c26e1.419644926005039182 MATIC
0xc8989f0d9bc47f91716f8899b74bcb40fb16706be3feb061af3a372419cfe078296101902022-06-15 19:53:05226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xb46ff4d599075c688e1440fabc22c7ca7d4f20513.391394580698058596 MATIC
0x301920d83bb6f07eaf56e01552f9c61ea293d6a896e3a00581fac14e744fdec6296101722022-06-15 19:52:25226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x53e0fde768038efacb54a26fa5f4d1e3853757469.874962372567895971 MATIC
0xa3d399d2619c4402b5e3ff8ca3c473398afbd8d66577c5f823e9ecfd3b021da6296101512022-06-15 19:51:43226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x099413a9fe021659c62b74d859ce0c1442d9724c3.4344565289002957 MATIC
0x25d14b33a05c5ad778303ec1fcd9b9c7f3b6de824983d71a9709263b6a1ed738296101352022-06-15 19:51:11226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xd81ff3d426f0a7a7e0b90db96ba50ef3f710f08010.000351730732171568 MATIC
0x24ce46b7c0c945fc19b682559cbd7e92e32b2eb136360838f7ad26a21707181d296101222022-06-15 19:50:45226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xd81ff3d426f0a7a7e0b90db96ba50ef3f710f08010.202424271162768518 MATIC
0xfc24d190052f0b7d5ee727bcb2dd07fbf090fd96b727834ecf24f8803cd11e2b296101052022-06-15 19:50:07226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x0b927c6af0a42e15f648eab581ed16956ef34af710.384444281145770525 MATIC
0xe50bf94857b466244942b96fd5ac65da4a31217101580adf11b4282dd9525571296100822022-06-15 19:49:21226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x5ca2360e2c1ceeb1a4fc3aa5e1a7ae9853f17ac65.446418245017058629 MATIC
0x1df6133f8350f145fb0b8212b36d3b55a3ff830500a4ee5774f58bd4ba9feba7296100812022-06-15 19:49:19226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x5b0096c541e928554f01c0a4762130458e0eb1513.480991172612890636 MATIC
0xd852f76f2510c9975bef9023327ef1c89617906a7157c48d24a10ae0822df8f1296100552022-06-15 19:48:27226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xcca0099d8dc9dcb8573d562cce9a79b42783ebc310.135845979899827241 MATIC
0x49af8f38d4189e662cc5e64ffe8f5f1551f187a8f2730c9bdef8e19363235b24296100252022-06-15 19:47:23226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xea76c41a09d14eb65a8e574bb79e787f787bec5010.27504138741525752 MATIC
0x65c8265e38c7d2ab49ce83eaf762220686a3c2b8dc47df82ac330375f8151fb6296100052022-06-15 19:46:43226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x7fc7b5b8e7783c0b62ce61c6dad26d43533c38be10.397706530353321524 MATIC
0xa3f3a6cbc0233f4a3231ab12f2fd8488b664b909a0bd663b375c2eebef821ea2296099852022-06-15 19:46:03226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x3ca620d6cadfa6e7f39950520c796b277453b78110.504681888678086813 MATIC
0x2cd1df175638504aed889ae8389fcbd868869fa1d3adab9141834dfc0d0c398e296099572022-06-15 19:45:03226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xa5d7fbeb69a7f4e9dc603b4fc1fc9df4f55353b210.596771755524392204 MATIC
0x0a06bd8e1e3dd4992e9fb9aee24d260b4f9d7499b06c103f9c7e842607ac8c18296099442022-06-15 19:44:37226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xa5d7fbeb69a7f4e9dc603b4fc1fc9df4f55353b210.28512411706330694 MATIC
0xbe1ab0255fc55ee9ed3f6f82f6e293162a7b4155537daf039eec7e6e9a444fe0296099252022-06-15 19:43:59226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xf5d105d18e4a1c970e9e60d45a6dc587bbf34c5e10.360806297684178641 MATIC
0xd927c7a4d13f3c0cd5ec22b4ed0675c7f461a2570d55e71155643ac412a5d161296099172022-06-15 19:43:39226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xf5d105d18e4a1c970e9e60d45a6dc587bbf34c5e10.056096978865767033 MATIC
0xa16a7727a2478b63355d7ca9a06295dc1271ed03049f3b6f86cf49e989cb3087296098872022-06-15 19:42:39226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x263637b0cd913e179793ada5b89297b8bd771dcb10.116957799862726553 MATIC
0xb908694c0129fd1d753b6f074d1721a9228360adaf53b8c3a783d2472cef0053296098682022-06-15 19:42:01226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x4bf87ec6367a23327e29c9cdce1c16f315e3a0b610.165887148094708781 MATIC
0x05c0c4fbcb7361eb81ee57fcf6d95ff33ba84b4946b5983488708818f5a7ef20296098442022-06-15 19:41:09226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0x707b8c6af9c1568f5e7ca3c3f92963ee87ff37dd6.870710646893392104 MATIC
0x9b843a3df77c2784a9a77b5d9f2d682bb47f9371f2eabc7282446185ab8b7969296098372022-06-15 19:40:55226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xae3a44ebfb42830de203d2de147f45db17b80a243.367498729007720166 MATIC
0x8b89fbb03573654560e9cd03f38228f8cd0ec2ae790ca626ba7e996cdfc1de62296098122022-06-15 19:40:05226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xf289faeb9ce423b34a5d9740e0c2eccd136753aa0.606184753502578854 MATIC
0xca8ab9bde4c270bffc46bf8d9404dd7b6513a7e1fe2b2271c435d8c88375c92d296098002022-06-15 19:39:41226 days 22 hrs ago 0xfcd60b2d8acbc3869cbe1ddcda60d0a92da2d4cb0xf289faeb9ce423b34a5d9740e0c2eccd136753aa9.831288355730877531 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ELFCore

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-07-04
*/

// File: utils/ISpawnContract.sol

pragma solidity >=0.8.0 <0.9.0;

interface ISpawnContract{

    /// @dev This event should be fired whenever the address of CoinB is modified.
    event CoinBChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev This event should be fired whenever the address of CoinA is modified.
    event CoinAChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev Change CoinA contract.
    ///  Caller should always be superAdmin. _to is the address of new CoinA contract.
    function changeCoinA(address addr) external;

    /// @dev Change CoinB contract.
    ///  Caller should always be superAdmin. _to is the address of new CoinB contract.
    function changeCoinB(address addr) external;

    function setELFCore(address addr) external;

    function spawnEgg(uint256 seed, uint256 momGene, uint256 dadGene, uint256 momChildren, uint256 dadChildren, address caller, bool momFromChaos, bool dadFromChaos) external returns(uint256 gene);
}
// File: utils/IGetter.sol

pragma solidity >=0.8.0 <0.9.0;

interface IGetter {

    /// @dev Interface used by server to check who can use the _tokenId.
    function getUser(address _nftAddress,uint256 _tokenId) external view returns (address);
    
    /// @dev Interface used by server to check who can claim coin B earned by _tokenId.
    function getCoinB(address _nftAddress,uint256 _tokenId) external view returns (address);
}
// File: utils/ICapsuleContract.sol

pragma solidity >=0.8.0 <0.9.0;

interface ICapsuleContract{
    function writePriceInfo(uint256 price) external;
    function getPriceInfo() external view returns(uint256 price,uint256 time);
    function createCapsule(address caller,bool triple) external returns(uint256[] memory, uint256);
    function setELFCoreAddress(address addr) external;
}
// File: utils/Address.sol

pragma solidity >=0.8.0 <0.9.0;

/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils{

    /**
    * @dev Returns whether the target address is a contract.
    * @param _addr Address to check.
    * @return addressCheck True if _addr is a contract, false if not.
    */
    function isContract(
    address _addr
    )
    internal
    view
    returns (bool addressCheck)
    {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

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

}
// File: utils/IERC165.sol

pragma solidity >=0.8.0 <0.9.0;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: token/IERC721Metadata.sol

pragma solidity >=0.8.0 <0.9.0;

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}
// File: token/IERC721TokenReceiver.sol

pragma solidity >=0.8.0 <0.9.0;

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
// File: token/IERC721.sol

pragma solidity >=0.8.0 <0.9.0;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
// File: security/AccessControl.sol

pragma solidity >=0.8.0 <0.9.0;

contract AccessControl{

    /// @dev Error message.
    string constant NO_PERMISSION='no permission';
    string constant INVALID_ADDRESS ='invalid address';
    
    /// @dev Administrator with highest authority. Should be a multisig wallet.
    address payable superAdmin;

    /// @dev Administrator of this contract.
    address payable admin;

    /// Sets the original admin and superAdmin of the contract to the sender account.
    constructor(){
        superAdmin=payable(msg.sender);
        admin=payable(msg.sender);
    }

    /// @dev Throws if called by any account other than the superAdmin.
    modifier onlySuperAdmin{
        require(msg.sender==superAdmin,NO_PERMISSION);
        _;
    }

    /// @dev Throws if called by any account other than the admin.
    modifier onlyAdmin{
        require(msg.sender==admin,NO_PERMISSION);
        _;
    }

    /// @dev Allows the current superAdmin to change superAdmin.
    /// @param addr The address to transfer the right of superAdmin to.
    function changeSuperAdmin(address payable addr) external onlySuperAdmin{
        require(addr!=payable(address(0)),INVALID_ADDRESS);
        superAdmin=addr;
    }

    /// @dev Allows the current superAdmin to change admin.
    /// @param addr The address to transfer the right of admin to.
    function changeAdmin(address payable addr) external onlySuperAdmin{
        require(addr!=payable(address(0)),INVALID_ADDRESS);
        admin=addr;
    }

    /// @dev Called by superAdmin to withdraw balance.
    function withdrawBalance(uint256 amount) external onlySuperAdmin{
        superAdmin.transfer(amount);
    }

    fallback() external {}
}
// File: security/Pausable.sol

pragma solidity >=0.8.0 <0.9.0;


contract Pausable is AccessControl{

    /// @dev Error message.
    string constant PAUSED='paused';
    string constant NOT_PAUSED='not paused';

    /// @dev Keeps track whether the contract is paused. When this is true, most actions are blocked.
    bool public paused = false;

    /// @dev Modifier to allow actions only when the contract is not paused
    modifier whenNotPaused {
        require(!paused,PAUSED);
        _;
    }

    /// @dev Modifier to allow actions only when the contract is paused
    modifier whenPaused {
        require(paused,NOT_PAUSED);
        _;
    }

    /// @dev Called by superAdmin to pause the contract. Used when something goes wrong
    ///  and we need to limit damage.
    function pause() external onlySuperAdmin whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the superAdmin.
    function unpause() external onlySuperAdmin whenPaused {
        paused = false;
    }
}
// File: ELFCore.sol

pragma solidity >=0.8.0 <0.9.0;










contract ELFBase is Pausable, IERC721TokenReceiver, IERC165, IERC721Metadata{

    /// @dev Used for supportsInterface of ERC165.
    bytes4 constant InterfaceSignature_ERC721=0x80ac58cd;
    bytes4 constant InterfaceSignature_ERC165=0x01ffc9a7;
    bytes4 constant InterfaceSignature_ERC721TokenReceiver=0x150b7a02;
    bytes4 constant InterfaceSignature_ERC721Metadata=0x5b5e139f;
    
    /// @dev Value should be returned when we transfer NFT to a contract via safeTransferFrom.
    bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    /// @dev Error message.
    string constant NOT_VALID_NFT ='invalid NFT';

    /// @dev The data type of ELF NFT instance.
    struct ELF{
        uint256 label;
        uint256 dad;
        uint256 mom;
        uint256 gene;
        uint256 bornAt;
    }

    string url='www.roe.com/';

    /// @dev An array contains all existing ELF NFT instances.
    ///  The tokenId of each NFT is actually an index into this array.
    ELF[] ELFs;

    /// @dev Mapping from tokenId to whether it is hatched.
    mapping (uint256 => bool) tokenIdToHatched;

    /// @dev Mapping from tokenId to its children.
    mapping (uint256 => uint256[]) tokenIdToChildren;

    function setURL(string memory _url) external onlyAdmin {
        url=_url;
    }

    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure override returns (string memory _name){
        return 'ELF';
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure override returns (string memory _symbol){
        return 'ELF';
    }

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view override returns (string memory){
        require(_tokenId<ELFs.length && _tokenId!=0,NOT_VALID_NFT);
        uint256 temp = _tokenId;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (_tokenId != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(_tokenId % 10)));
            _tokenId /= 10;
        }
        return string(abi.encodePacked(url,string(buffer)));
    }

    ///  @dev Returns true for any standardized interfaces implemented by this contract. We implement
    ///  ERC-165, ERC721TokenReceiver and ERC-721.
    function supportsInterface(bytes4 _interfaceID) override external pure returns (bool){
        return ((_interfaceID == InterfaceSignature_ERC165)||(_interfaceID == InterfaceSignature_ERC721)||(_interfaceID==InterfaceSignature_ERC721TokenReceiver)||(_interfaceID == InterfaceSignature_ERC721Metadata));
    }

    /// @dev Required for ERC721TokenReceiver compliance.
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) override pure external returns(bytes4){
        return MAGIC_ON_ERC721_RECEIVED;
    }

    /// @dev Gain information of an ELF instance.
    function gainELF(uint256 _tokenId) external view returns(uint256,uint256,uint256,uint256,uint256,uint256[] memory){
        ELF memory _ELF=ELFs[_tokenId];
        uint256 gene=_ELF.gene;
        if (!tokenIdToHatched[_tokenId]){
            gene=(gene/10000000000000000000000000000000000000000000000000000000000000)%10;
        }
        return(_ELF.label,_ELF.dad,_ELF.mom,gene,_ELF.bornAt,tokenIdToChildren[_tokenId]);
    }
}

contract ELFTransfer is ELFBase, IERC721{

    using AddressUtils for address;

    /// @dev Error message.
    string constant WRONG_PARAMETER='wrong parameter';
    string constant CANT_RECEIVE_NFT='can not receive NFT';

    /// @dev Mapping from tokenId to the address that owns it. There is a valid owner
    ///  for every ELF.
    mapping (uint256 => address) tokenIdToOwner;

    /// @dev Mapping from tokenId to index of arrary storing it.
    mapping (uint256 => uint256) tokenIdToIndex;

    /// @dev Mapping from owner to list of owned tokenIds.
    mapping (address => uint256[]) ownedTokens;

    /// @dev Mapping from tokenId to an address that has been approved to transfer this NFT. 
    ///  A zero value means no approved address.
    mapping (uint256 => address) tokenIdToApproved;

    /// @dev Mapping from owner address to authorized operators of that owner.
    ///  true means authorized, false means unauthorized.
    mapping (address => mapping (address => bool)) ownerToOperators;

    /// @dev Mapping from address to tokenIds usable by the address but not owned by the address.
    mapping (address => uint256[]) ownedByContractTokens;

    /// @dev When the token is owned by smart contract, mapping from tokenId to its usable address.
    ///  Can only be set by the owned smart contract.  
    mapping (uint256 => address) tokenToUsable;

    /// @dev Mapping from tokenId to its index of ownedByContractTokens.
    mapping (uint256 => uint256) tokenToOwnedByContractTokensIndex;

    /// @dev Whether tokenId has been hatched.
    function isHatched(uint256 _tokenId) public view returns(bool res){
        ownerOf(_tokenId);
        res=tokenIdToHatched[_tokenId];
    }

    /// @dev Return owned tokenIds of an address.
    function gainOwnedTokens(address addr) external view returns(uint256[] memory){
        require(addr!=address(0),INVALID_ADDRESS);
        return(ownedTokens[addr]);
    }

    /// @dev Internal function used to add ELF NFT instance to address _to.
    /// @param _to Add token to _to.
    /// @param _tokenId ELF NFT instance we want to operate.
    function _addTo(address _to, uint256 _tokenId) internal{
        tokenIdToOwner[_tokenId]=_to;
        uint256[] storage _ownedTokens=ownedTokens[_to];
        tokenIdToIndex[_tokenId]=_ownedTokens.length;
        _ownedTokens.push(_tokenId);
    }

    /// @dev Internal function used to remove ELF NFT instance.
    /// @param _tokenId ELF NFT instance we want to operate.
    function _removeFrom(address _from,uint256 _tokenId) internal{
        uint256[] storage _ownedTokens=ownedTokens[_from];
        uint256 lastIndex=_ownedTokens.length-1;
        uint256 lastTokenId=_ownedTokens[lastIndex];
        uint256 tokenIndex=tokenIdToIndex[_tokenId];
        delete tokenIdToOwner[_tokenId];
        delete tokenIdToIndex[_tokenId];
        tokenIdToIndex[lastTokenId]=tokenIndex;
        _ownedTokens[tokenIndex]=lastTokenId;
        _ownedTokens.pop();
        if (tokenToUsable[_tokenId]!=address(0)){
            removeFromOwnedByContractTokens(_tokenId);
            tokenToUsable[_tokenId]=address(0);
        }
    }

    function setTokenToUsable(uint256 tokenId, address addr) external{
        require(msg.sender==ownerOf(tokenId) && msg.sender.isContract(),NO_PERMISSION);
        if (tokenToUsable[tokenId]!=address(0)){
            removeFromOwnedByContractTokens(tokenId);
        }
        tokenToUsable[tokenId]=addr;
        tokenToOwnedByContractTokensIndex[tokenId]=ownedByContractTokens[addr].length;
        ownedByContractTokens[addr].push(tokenId);
    }

    function removeFromOwnedByContractTokens(uint256 tokenId) internal{
        address from=tokenToUsable[tokenId];
        uint256 index=tokenToOwnedByContractTokensIndex[tokenId];
        uint256 l=ownedByContractTokens[from].length;
        uint256 lastTokenId=ownedByContractTokens[from][l-1];
        ownedByContractTokens[from][index]=lastTokenId;
        ownedByContractTokens[from].pop();
        tokenToOwnedByContractTokensIndex[lastTokenId]=index;
        delete tokenToOwnedByContractTokensIndex[tokenId];
    }

    /// @dev Return usable tokens of addr.
    function usableTokens(address addr) external view returns(uint256[] memory){
        require(addr!=address(0),INVALID_ADDRESS);
        uint256[] memory temp1=ownedTokens[addr];
        uint256[] memory temp2=ownedByContractTokens[addr];
        uint256 l1=temp1.length;
        uint256 l2=temp2.length;
        uint256[] memory cache1 = new uint256[](l1);
        uint256[] memory cache2 = new uint256[](l2);
        uint256 count1;
        uint256 count2;
        for (uint256 i=0;i<l1;i++){
            if (tokenIdToHatched[temp1[i]]){
                count1++;
                cache1[i]=temp1[i];
            }
        }
        for (uint256 i=0;i<l2;i++){
            if (tokenIdToHatched[temp2[i]]){
                IGetter contractInstance=IGetter(ownerOf(temp2[i]));
                try contractInstance.getUser(address(this),temp2[i]) returns (address tar){
                    if (tar==addr){
                        count2++;
                        cache2[i]=temp2[i];
                    }
                } catch {}
            }
        }
        uint256 index=0;
        uint256[] memory res = new uint256[](count1+count2);
        for (uint256 i=0;i<l1;i++){
            if (cache1[i]!=0){
                res[index]=cache1[i];
                index++;
            }
        }
        for (uint256 i=0;i<l2;i++){
            if (cache2[i]!=0){
                res[index]=cache2[i];
                index++;
            }
        }
        return res;
    }

    /// @dev Required for ERC-721 compliance.
    function balanceOf(address _owner) override external view returns (uint256){
        require(_owner!=address(0),INVALID_ADDRESS);
        return ownedTokens[_owner].length;
    }

    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId) override public view returns (address res){
        res=tokenIdToOwner[_tokenId];
        require(res!=address(0),NOT_VALID_NFT);
    }

    /// @dev Required for ERC-721 compliance.
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) override external payable{
        transferFrom(_from, _to, _tokenId);
        if (_to.isContract()){
            bytes4 retval=IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, data);
            require(retval == MAGIC_ON_ERC721_RECEIVED,CANT_RECEIVE_NFT);
        }
    }

    /// @dev Required for ERC-721 compliance.
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) override external payable{
        transferFrom(_from, _to, _tokenId);
        if (_to.isContract()){
            bytes4 retval=IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, '');
            require(retval == MAGIC_ON_ERC721_RECEIVED,CANT_RECEIVE_NFT);
        }
    }

    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) override public payable whenNotPaused{
        address _owner=ownerOf(_tokenId);
        require(msg.sender==_owner||ownerToOperators[_owner][msg.sender]||msg.sender==tokenIdToApproved[_tokenId],NO_PERMISSION);
        require(_from==_owner,WRONG_PARAMETER);
        require(_to!=address(0),INVALID_ADDRESS);
        _removeFrom(_from,_tokenId);
        _addTo(_to,_tokenId);
        if (tokenIdToApproved[_tokenId]!=address(0)){
            delete tokenIdToApproved[_tokenId];
            emit Approval(_from, address(0), _tokenId);
        }
        emit Transfer(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    function approve(address _approved, uint256 _tokenId) override external payable whenNotPaused{
        address _owner=ownerOf(_tokenId);
        require(msg.sender==_owner||ownerToOperators[_owner][msg.sender],NO_PERMISSION);
        tokenIdToApproved[_tokenId]=_approved;
        emit Approval(_owner,_approved,_tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    function setApprovalForAll(address _operator, bool _approved) override external whenNotPaused{
        ownerToOperators[msg.sender][_operator]=_approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @dev Required for ERC-721 compliance.
    function getApproved(uint256 _tokenId) override external view returns (address){
        ownerOf(_tokenId);
        return tokenIdToApproved[_tokenId];
    }

    /// @dev Required for ERC-721 compliance.
    function isApprovedForAll(address _owner, address _operator) override external view returns (bool){
        return ownerToOperators[_owner][_operator];
    }

    ///@dev Only res1 can use tokenId. Coin B earned by tokenId should distribute to res2.
    function userOfCoinBTo(uint256[] memory tokenIds) external view returns (address[] memory,address[] memory){
        uint256 l=tokenIds.length;
        address[] memory res1=new address[](l);
        address[] memory res2=new address[](l);
        address owner;
        uint256 tokenId;
        for (uint256 i=0;i<l;i++){
            tokenId=tokenIds[i];
            owner=ownerOf(tokenId);
            if (tokenIdToHatched[tokenId]){
                if (owner.isContract()){
                    IGetter contractInstance=IGetter(owner);
                    try contractInstance.getUser(address(this),tokenId) returns(address temp){
                        res1[i]=temp;
                    }catch{res1[i]=address(0);}
                    try contractInstance.getCoinB(address(this),tokenId) returns(address temp){
                        res2[i]=temp;
                    }catch{res2[i]=address(0);}
                }
                else{
                    res1[i]=owner;
                    res2[i]=owner;
                }
            }
            else{
                res1[i]=address(0);
                res2[i]=address(0);
            }
        }
        return (res1,res2);
    }

    /// @dev Gain all genes of ELFs in tokenIds.
    function gainGenes(uint256[] memory tokenIds) external view returns(uint256[] memory){
        uint256 l=tokenIds.length;
        uint256[] memory res = new uint256[](l);
        for (uint256 i=0;i<l;i++){
            if (isHatched(tokenIds[i])){
                ELF memory _ELF=ELFs[tokenIds[i]];
                res[i]=_ELF.gene;
            }
            else{
                res[i]=0;
            }
        }
        return res;
    }
}

contract ELFCore is ELFTransfer{

    /// @dev This is the spawan of chaos. Whether it is an ELF is still a mystery. 
    ///  No one has the ability to own it.
    constructor(){
        ELF memory _ELF=ELF({
            label:777,
            dad:0,
            mom:0,
            gene:0,
            bornAt:block.timestamp
        });
        ELFs.push(_ELF);
        tokenIdToHatched[0]=true;
    }

    /// @dev Error message.
    string constant WRONG_MONEY='money not enough';
    string constant EXCEED_MAX_SPAWN_TIMES ='exceed maximum spawan time';
    string constant CLOSE_BREEDING='close breeding';
    string constant NOT_MATURE='egg not mature';
    string constant HATCHED='egg hatched';

    /// @dev This event should be fired whenever the address of capsule contract is modified.
    event CapsuleContractChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev The address of current capsule contract.
    address public capsuleContractAddress;

    /// @dev Total capsule number. Can't bigger than 5000.
    uint256 public capsuleCount;

    /// @dev Change capsule contract.
    ///  Caller should always be administrator. addr is the address of new capsule contract.
    function changeCapsuleContract(address addr) external onlySuperAdmin{
        require(addr!=address(0),INVALID_ADDRESS);
        emit CapsuleContractChanged(capsuleContractAddress,addr,block.timestamp);
        capsuleContractAddress=addr;
    }

    /// @dev Capsule machine. Capsule contract is assigned by superAdmin, 
    ///  so we do not have to worry about reentrancy attack here.
    function capsuleMachine(bool triple) external payable whenNotPaused {
        uint256 count=1;
        if (triple){
            count=3;
        }
        capsuleCount+=count;
        require(capsuleCount<=5000,'capsule limit exceeded');
        ICapsuleContract capsuleContractInstance=ICapsuleContract(capsuleContractAddress);
        (uint256 price,)=capsuleContractInstance.getPriceInfo();
        require(msg.value>=price*count,WRONG_MONEY);
        uint256 label;
        uint256[] memory genes = new uint256[](count);
        (genes,label)=capsuleContractInstance.createCapsule(msg.sender,triple);
        for(uint256 i=0;i<count;i++){
            ELF memory _ELF=ELF({
                label:label,
                dad:0,
                mom:0,
                gene:genes[i],
                bornAt:block.timestamp+432000
            });
            _addTo(msg.sender,ELFs.length);
            emit Transfer(address(0),msg.sender,ELFs.length);
            ELFs.push(_ELF);
        }
        if (msg.value>price*count){
            payable(msg.sender).transfer(msg.value-price*count);
        }
    }

    /// @dev This event should be fired whenever the address of SpawnContract is modified.
    event SpawnContractChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev The address of SpawnContract.
    address public SpawnContractAddress;

    /// @dev Change SpawnContract address. 
    ///  Caller should always be superAdmin. addr is the address of new SpawnContract address.
    function changeSpawnContract(address addr) external onlySuperAdmin{
        require(addr!=address(0),INVALID_ADDRESS);
        emit SpawnContractChanged(SpawnContractAddress,addr,block.timestamp);
        SpawnContractAddress=addr;
    }

    /// @dev Maximun spawning time of an ELF.
    uint256 public constant maxSpawnTimes=7;
    
    /// @dev Spawn an egg of ELF. Mint NFT. Spawn contract is assigned by superAdmin, 
    ///  so we do not have to worry about reentrancy attack here.
    /// @param momTokenId tokenId of one of parent of new ELF. ELF has no gender, mom and dad is used for convinience.
    /// @param dadTokenId tokenId of one of parent of new ELF.
    function spawnEgg(uint256 momTokenId,uint256 dadTokenId) external whenNotPaused returns (uint256 tokenId){
        require(msg.sender==ownerOf(momTokenId),NO_PERMISSION);
        require(msg.sender==ownerOf(dadTokenId),NO_PERMISSION);
        uint256 dadChildrenCount=tokenIdToChildren[dadTokenId].length;
        uint256 momChildrenCount=tokenIdToChildren[momTokenId].length;
        require(momChildrenCount<maxSpawnTimes,EXCEED_MAX_SPAWN_TIMES);
        require(dadChildrenCount<maxSpawnTimes,EXCEED_MAX_SPAWN_TIMES);
        require(tokenIdToHatched[momTokenId]&&tokenIdToHatched[dadTokenId],WRONG_PARAMETER);
        require(momTokenId!=dadTokenId,WRONG_PARAMETER);
        ELF memory _mom=ELFs[momTokenId];
        ELF memory _dad=ELFs[dadTokenId];
        if (!(fromChaos(_mom) && fromChaos(_dad))){
            require(_mom.mom!=dadTokenId,CLOSE_BREEDING);
            require(_mom.dad!=dadTokenId,CLOSE_BREEDING);
            require(_dad.mom!=momTokenId,CLOSE_BREEDING);
            require(_dad.dad!=momTokenId,CLOSE_BREEDING);
        }
        if (!fromChaos(_mom) && !fromChaos(_dad)){
            require(_mom.mom!=_dad.mom,CLOSE_BREEDING);
            require(_mom.mom!=_dad.dad,CLOSE_BREEDING);
            require(_mom.dad!=_dad.mom,CLOSE_BREEDING);
            require(_mom.dad!=_dad.dad,CLOSE_BREEDING);
        } 
        uint256 seed=block.timestamp+dadChildrenCount+momChildrenCount;
        uint256 gene=ISpawnContract(SpawnContractAddress).spawnEgg(seed,_mom.gene,_dad.gene,momChildrenCount,dadChildrenCount,msg.sender,fromChaos(_mom),fromChaos(_dad));
        ELF memory _ELF=ELF({
            label:0,
            dad:dadTokenId,
            mom:momTokenId,
            gene:gene,
            bornAt:seed+432000
        });
        tokenId=ELFs.length;
        ELFs.push(_ELF);
        _addTo(msg.sender,tokenId);
        tokenIdToChildren[momTokenId].push(tokenId);
        tokenIdToChildren[dadTokenId].push(tokenId);
        emit Transfer(address(0),msg.sender,tokenId);
    }

    /// @dev Hatch an egg.
    function hatchELF(uint256 tokenId) external whenNotPaused{
        ELF memory _ELF=ELFs[tokenId];
        require(!tokenIdToHatched[tokenId],HATCHED);
        require(msg.sender==ownerOf(tokenId),NO_PERMISSION);
        require(block.timestamp>=_ELF.bornAt,NOT_MATURE);
        tokenIdToHatched[tokenId]=true;
    }

    /// @dev Whether the given ELF is from chaos.
    function fromChaos(ELF memory _ELF) internal pure returns(bool){
        return _ELF.mom==0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"}],"name":"CapsuleContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_time","type":"uint256"}],"name":"SpawnContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"SpawnContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capsuleContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capsuleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"triple","type":"bool"}],"name":"capsuleMachine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeCapsuleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeSpawnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"changeSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"gainELF","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"gainGenes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gainOwnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hatchELF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isHatched","outputs":[{"internalType":"bool","name":"res","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSpawnTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"res","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"setTokenToUsable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"momTokenId","type":"uint256"},{"internalType":"uint256","name":"dadTokenId","type":"uint256"}],"name":"spawnEgg","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"usableTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"userOfCoinBTo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6001805460ff60a01b1916905560c0604052600c60808190526b7777772e726f652e636f6d2f60a01b60a09081526200003c9160029190620001a0565b503480156200004a57600080fd5b5060008054336001600160a01b031991821681178355600180549092161781556040805160a0810182526103098152602080820185815292820185815260608301868152426080850190815260038054808901825590895294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60059096029586015594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d840155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e83015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f9091015591805260049091527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec805460ff1916909117905562000283565b828054620001ae9062000246565b90600052602060002090601f016020900481019282620001d257600085556200021d565b82601f10620001ed57805160ff19168380011785556200021d565b828001600101855582156200021d579182015b828111156200021d57825182559160200191906001019062000200565b506200022b9291506200022f565b5090565b5b808211156200022b576000815560010162000230565b600181811c908216806200025b57607f821691505b602082108114156200027d57634e487b7160e01b600052602260045260246000fd5b50919050565b6140c880620002936000396000f3fe60806040526004361061021a5760003560e01c80638456cb5911610123578063bcd193b3116100ab578063d6fe1e2f1161006f578063d6fe1e2f1461063b578063da76d5cd1461065b578063e985e9c51461067b578063ed62e452146106c4578063f8fe3714146106f65761021a565b8063bcd193b31461059b578063c87b56dd146105bb578063ccf3fbb3146105db578063ced3e3f1146105fb578063d3f673301461061b5761021a565b80639b3b6197116100f25780639b3b6197146104fa5780639bbdc8731461051a578063a22cb46514610548578063b2b783b714610568578063b88d4fde146105885761021a565b80638456cb59146104a55780638f283970146104ba57806395d89b4114610282578063962a5ff2146104da5761021a565b80633f4ba83a116101a657806351b421e21161017557806351b421e2146104115780635c975abb146104245780636352211e1461044557806370a082311461046557806377343408146104855761021a565b80633f4ba83a146103a957806341858c4b146103be57806342842e0e146103de57806346095c60146103f15761021a565b8063095ea7b3116101ed578063095ea7b3146102ef578063150b7a021461030457806323b872dd146103495780632ed7cbf91461035c57806335025eb4146103895761021a565b806301ffc9a71461022957806305dc03941461025e57806306fdde0314610282578063081812fc146102b7575b34801561022657600080fd5b50005b34801561023557600080fd5b50610249610244366004613b50565b61070b565b60405190151581526020015b60405180910390f35b34801561026a57600080fd5b50610274600f5481565b604051908152602001610255565b34801561028e57600080fd5b5060408051808201909152600381526222a62360e91b60208201525b6040516102559190613e69565b3480156102c357600080fd5b506102d76102d2366004613c14565b610778565b6040516001600160a01b039091168152602001610255565b6103026102fd3660046139da565b6107a0565b005b34801561031057600080fd5b5061033061031f36600461390d565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b6103026103573660046138cd565b6108db565b34801561036857600080fd5b5061037c610377366004613856565b610b46565b6040516102559190613e56565b34801561039557600080fd5b506103026103a4366004613856565b610c01565b3480156103b557600080fd5b50610302610d06565b3480156103ca57600080fd5b506103026103d9366004613856565b610db3565b6103026103ec3660046138cd565b610e74565b3480156103fd57600080fd5b5061030261040c366004613c44565b610f96565b61030261041f366004613b36565b611087565b34801561043057600080fd5b5060015461024990600160a01b900460ff1681565b34801561045157600080fd5b506102d7610460366004613c14565b6114f0565b34801561047157600080fd5b50610274610480366004613856565b611553565b34801561049157600080fd5b506103026104a0366004613b88565b6115c0565b3480156104b157600080fd5b50610302611628565b3480156104c657600080fd5b506103026104d5366004613856565b6116d8565b3480156104e657600080fd5b506102746104f5366004613c68565b611799565b34801561050657600080fd5b50600e546102d7906001600160a01b031681565b34801561052657600080fd5b5061053a610535366004613a05565b612052565b604051610255929190613e31565b34801561055457600080fd5b506103026105633660046139a6565b6124b3565b34801561057457600080fd5b5061037c610583366004613a05565b612569565b61030261059636600461390d565b612719565b3480156105a757600080fd5b5061037c6105b6366004613856565b612822565b3480156105c757600080fd5b506102aa6105d6366004613c14565b612e59565b3480156105e757600080fd5b506103026105f6366004613856565b612fd1565b34801561060757600080fd5b50610249610616366004613c14565b6130d6565b34801561062757600080fd5b506010546102d7906001600160a01b031681565b34801561064757600080fd5b50610302610656366004613c14565b6130f8565b34801561066757600080fd5b50610302610676366004613c14565b6132c9565b34801561068757600080fd5b50610249610696366004613895565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b3480156106d057600080fd5b506106e46106df366004613c14565b613353565b60405161025596959493929190613e9c565b34801561070257600080fd5b50610274600781565b60006001600160e01b031982166301ffc9a760e01b148061073c57506001600160e01b031982166380ac58cd60e01b145b8061075757506001600160e01b03198216630a85bd0160e11b145b8061077257506001600160e01b03198216635b5e139f60e01b145b92915050565b6000610783826114f0565b50506000908152600960205260409020546001600160a01b031690565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156107f25760405162461bcd60e51b81526004016107e99190613e69565b60405180910390fd5b5060006107fe826114f0565b9050336001600160a01b038216148061083a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b8152509061087e5760405162461bcd60e51b81526004016107e99190613e69565b5060008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156109245760405162461bcd60e51b81526004016107e99190613e69565b506000610930826114f0565b9050336001600160a01b038216148061096c57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b8061098d57506000828152600960205260409020546001600160a01b031633145b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906109d15760405162461bcd60e51b81526004016107e99190613e69565b50806001600160a01b0316846001600160a01b0316146040518060400160405280600f81526020016e3bb937b733903830b930b6b2ba32b960891b81525090610a2d5760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038416610a7b5760405162461bcd60e51b81526004016107e99190613e69565b50610a8684836134a0565b610a9083836135e6565b6000828152600960205260409020546001600160a01b031615610aff5760008281526009602052604080822080546001600160a01b0319169055518391906001600160a01b038716907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526060906001600160a01b038316610b965760405162461bcd60e51b81526004016107e99190613e69565b506001600160a01b03821660009081526008602090815260409182902080548351818402810184019094528084529091830182828015610bf557602002820191906000526020600020905b815481526020019060010190808311610be1575b50505050509050919050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610c515760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038216610c9f5760405162461bcd60e51b81526004016107e99190613e69565b50600e546040514281526001600160a01b038381169216907f2cdc7beeffb8d8d7142dab79535fb5af62a52e2a4d5ad26fbc67bf6326ae29129060200160405180910390a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610d565760405162461bcd60e51b81526004016107e99190613e69565b5060015460408051808201909152600a8152691b9bdd081c185d5cd95960b21b602082015290600160a01b900460ff16610da35760405162461bcd60e51b81526004016107e99190613e69565b506001805460ff60a01b19169055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610e035760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038216610e515760405162461bcd60e51b81526004016107e99190613e69565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b610e7f8383836108db565b610e91826001600160a01b031661363d565b15610f9157604051630a85bd0160e11b81523360048201526001600160a01b0384811660248301526044820183905260806064830152600060848301819052919084169063150b7a029060a401602060405180830381600087803b158015610ef857600080fd5b505af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613b6c565b60408051808201909152601381527218d85b881b9bdd081c9958d95a5d9948139195606a1b60208201529091506001600160e01b03198216630a85bd0160e11b14610f8e5760405162461bcd60e51b81526004016107e99190613e69565b50505b505050565b610f9f826114f0565b6001600160a01b0316336001600160a01b0316148015610fc35750610fc33361363d565b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906110075760405162461bcd60e51b81526004016107e99190613e69565b506000828152600c60205260409020546001600160a01b03161561102e5761102e82613679565b6000828152600c6020908152604080832080546001600160a01b039095166001600160a01b031990951685179055928252600b8082528383208054868552600d8452948420859055908252600184018155825290200155565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156110d05760405162461bcd60e51b81526004016107e99190613e69565b50600181156110dd575060035b80600f60008282546110ef9190613f2c565b9091555050600f5461138810156111415760405162461bcd60e51b815260206004820152601660248201527518d85c1cdd5b19481b1a5b5a5d08195e18d95959195960521b60448201526064016107e9565b600e546040805163330227bf60e01b815281516001600160a01b0390931692600092849263330227bf9260048083019392829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190613c89565b5090506111cb8382613f58565b3410156040518060400160405280601081526020016f0dadedccaf240dcdee840cadcdeeaced60831b815250906112155760405162461bcd60e51b81526004016107e99190613e69565b50600080846001600160401b0381111561123f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611268578160200160208202803683370190505b50604051630b71abb160e01b815233600482015287151560248201529091506001600160a01b03851690630b71abb190604401600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112f19190810190613a9c565b9250905060005b858110156114945760006040518060a00160405280858152602001600081526020016000815260200184848151811061134157634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001426206978061135d9190613f2c565b90526003549091506113709033906135e6565b60035460405133906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60059092029182015560208201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c82015560408201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015560608201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e8201556080909101517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f909101558061148c81613ff3565b9150506112f8565b5061149f8584613f58565b3411156114e857336108fc6114b48786613f58565b6114be9034613f77565b6040518115909202916000818181858888f193505050501580156114e6573d6000803e3d6000fd5b505b505050505050565b600081815260066020908152604091829020548251808401909352600b83526a1a5b9d985b1a590813919560aa1b918301919091526001600160a01b0316908161154d5760405162461bcd60e51b81526004016107e99190613e69565b50919050565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526000906001600160a01b0383166115a35760405162461bcd60e51b81526004016107e99190613e69565b50506001600160a01b031660009081526008602052604090205490565b60015460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146116105760405162461bcd60e51b81526004016107e99190613e69565b5080516116249060029060208401906137a8565b5050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146116785760405162461bcd60e51b81526004016107e99190613e69565b506001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156116c25760405162461bcd60e51b81526004016107e99190613e69565b506001805460ff60a01b1916600160a01b179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146117285760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b0382166117765760405162461bcd60e51b81526004016107e99190613e69565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546040805180820190915260068152651c185d5cd95960d21b6020820152600091600160a01b900460ff16156117e45760405162461bcd60e51b81526004016107e99190613e69565b506117ee836114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906118465760405162461bcd60e51b81526004016107e99190613e69565b50611850826114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906118a85760405162461bcd60e51b81526004016107e99190613e69565b5060008281526005602090815260408083205486845292819020548151808301909252601a82527f657863656564206d6178696d756d2073706177616e2074696d6500000000000092820192909252600782106119185760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152601a81527f657863656564206d6178696d756d2073706177616e2074696d6500000000000060208201526007831061196e5760405162461bcd60e51b81526004016107e99190613e69565b5060008581526004602052604090205460ff16801561199b575060008481526004602052604090205460ff165b6040518060400160405280600f81526020016e3bb937b733903830b930b6b2ba32b960891b815250906119e15760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e3bb937b733903830b930b6b2ba32b960891b602082015285851415611a295760405162461bcd60e51b81526004016107e99190613e69565b50600060038681548110611a4d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060038681548110611abd57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050611b1682604001511590565b8015611b2457506040810151155b611c59576040808301518151808301909252600e82526d636c6f7365206272656564696e6760901b6020830152871415611b715760405162461bcd60e51b81526004016107e99190613e69565b5085826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611bbf5760405162461bcd60e51b81526004016107e99190613e69565b506040808201518151808301909252600e82526d636c6f7365206272656564696e6760901b6020830152881415611c095760405162461bcd60e51b81526004016107e99190613e69565b5086816020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611c575760405162461bcd60e51b81526004016107e99190613e69565b505b604082015115158015611c6f5750604081015115155b15611db857604080820151838201518251808401909352600e83526d636c6f7365206272656564696e6760901b60208401521415611cc05760405162461bcd60e51b81526004016107e99190613e69565b508060200151826040015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611d125760405162461bcd60e51b81526004016107e99190613e69565b508060400151826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611d645760405162461bcd60e51b81526004016107e99190613e69565b508060200151826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611db65760405162461bcd60e51b81526004016107e99190613e69565b505b600083611dc58642613f2c565b611dcf9190613f2c565b601054606080860151908501519293506000926001600160a01b0390921691636ea911ce918591898b33611e058c604001511590565b60408c0151156040516001600160e01b031960e08b901b168152600481019890985260248801969096526044870194909452606486019290925260848501526001600160a01b031660a4840152151560c4830152151560e482015261010401602060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190613c2c565b905060006040518060a00160405280600081526020018a81526020018b81526020018381526020018462069780611eed9190613f2c565b9052600380546001810182556000919091528151600582027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019190915560208301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c82015560408301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015560608301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e82015560808301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f9091015598509050611fdf33896135e6565b60008a8152600560209081526040808320805460018181018355918552838520018c90558c84528184208054918201815584529183209091018a905551899133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050505092915050565b805160609081906000816001600160401b0381111561208157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120aa578160200160208202803683370190505b5090506000826001600160401b038111156120d557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120fe578160200160208202803683370190505b50905060008060005b858110156124a45788818151811061212f57634e487b7160e01b600052603260045260246000fd5b60200260200101519150612142826114f0565b60008381526004602052604090205490935060ff161561240d5761216e836001600160a01b031661363d565b1561238657604051600162d409b160e01b031981523060048201526024810183905283906001600160a01b0382169063ff2bf64f9060440160206040518083038186803b1580156121be57600080fd5b505afa9250505080156121ee575060408051601f3d908101601f191682019092526121eb91810190613879565b60015b61223957600086838151811061221457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061227c565b8087848151811061225a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050505b604051638f89451360e01b8152306004820152602481018490526001600160a01b03821690638f8945139060440160206040518083038186803b1580156122c257600080fd5b505afa9250505080156122f2575060408051601f3d908101601f191682019092526122ef91810190613879565b60015b61233d57600085838151811061231857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612380565b8086848151811061235e57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050505b50612492565b828582815181106123a757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828482815181106123e857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612492565b600085828151811061242f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050600084828151811061247157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b8061249c81613ff3565b915050612107565b50929791965090945050505050565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156124fc5760405162461bcd60e51b81526004016107e99190613e69565b50336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80516060906000816001600160401b0381111561259657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156125bf578160200160208202803683370190505b50905060005b82811015612711576125fd8582815181106125f057634e487b7160e01b600052603260045260246000fd5b60200260200101516130d6565b156126d0576000600386838151811061262657634e487b7160e01b600052603260045260246000fd5b60200260200101518154811061264c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905080606001518383815181106126be57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050506126ff565b60008282815181106126f257634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b8061270981613ff3565b9150506125c5565b509392505050565b6127248585856108db565b612736846001600160a01b031661363d565b15610f8e57604051630a85bd0160e11b81526000906001600160a01b0386169063150b7a02906127729033908a90899089908990600401613de0565b602060405180830381600087803b15801561278c57600080fd5b505af11580156127a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c49190613b6c565b60408051808201909152601381527218d85b881b9bdd081c9958d95a5d9948139195606a1b60208201529091506001600160e01b03198216630a85bd0160e11b146114e65760405162461bcd60e51b81526004016107e99190613e69565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526060906001600160a01b0383166128725760405162461bcd60e51b81526004016107e99190613e69565b506001600160a01b0382166000908152600860209081526040808320805482518185028101850190935280835291929091908301828280156128d357602002820191906000526020600020905b8154815260200190600101908083116128bf575b505050506001600160a01b0385166000908152600b60209081526040808320805482518185028101850190935280835295965092949093509083018282801561293b57602002820191906000526020600020905b815481526020019060010190808311612927575b505085518451949550939250600091508390506001600160401b0381111561297357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561299c578160200160208202803683370190505b5090506000826001600160401b038111156129c757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156129f0578160200160208202803683370190505b50905060008060005b86811015612abc57600460008a8381518110612a2557634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615612aaa5782612a5281613ff3565b935050888181518110612a7557634e487b7160e01b600052603260045260246000fd5b6020026020010151858281518110612a9d57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b80612ab481613ff3565b9150506129f9565b5060005b85811015612c8f5760046000898381518110612aec57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615612c7d576000612b41898381518110612b3457634e487b7160e01b600052603260045260246000fd5b60200260200101516114f0565b9050806001600160a01b031663ff2bf64f308b8581518110612b7357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612bac9291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015612bc457600080fd5b505afa925050508015612bf4575060408051601f3d908101601f19168201909252612bf191810190613879565b60015b612bfd57612c7b565b8c6001600160a01b0316816001600160a01b03161415612c795783612c2181613ff3565b945050898381518110612c4457634e487b7160e01b600052603260045260246000fd5b6020026020010151868481518110612c6c57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b505b505b80612c8781613ff3565b915050612ac0565b50600080612c9d8385613f2c565b6001600160401b03811115612cc257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ceb578160200160208202803683370190505b50905060005b88811015612d9b57868181518110612d1957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014612d8957868181518110612d4857634e487b7160e01b600052603260045260246000fd5b6020026020010151828481518110612d7057634e487b7160e01b600052603260045260246000fd5b602090810291909101015282612d8581613ff3565b9350505b80612d9381613ff3565b915050612cf1565b5060005b87811015612e4957858181518110612dc757634e487b7160e01b600052603260045260246000fd5b6020026020010151600014612e3757858181518110612df657634e487b7160e01b600052603260045260246000fd5b6020026020010151828481518110612e1e57634e487b7160e01b600052603260045260246000fd5b602090810291909101015282612e3381613ff3565b9350505b80612e4181613ff3565b915050612d9f565b509b9a5050505050505050505050565b60035460609082108015612e6c57508115155b6040518060400160405280600b81526020016a1a5b9d985b1a590813919560aa1b81525090612eae5760405162461bcd60e51b81526004016107e99190613e69565b508160005b8115612ed95780612ec381613ff3565b9150612ed29050600a83613f44565b9150612eb3565b6000816001600160401b03811115612f0157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f2b576020820181803683370190505b5090505b8415612fa457612f40600183613f77565b9150612f4d600a8661400e565b612f58906030613f2c565b60f81b818381518110612f7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612f9d600a86613f44565b9450612f2f565b600281604051602001612fb8929190613d3a565b6040516020818303038152906040529350505050919050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146130215760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b03821661306f5760405162461bcd60e51b81526004016107e99190613e69565b506010546040514281526001600160a01b038381169216907f20fcc83ec3de5329943007221745d246cfc2b6f97492a88cbaa0f691216c5f6c9060200160405180910390a3601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006130e1826114f0565b505060009081526004602052604090205460ff1690565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156131415760405162461bcd60e51b81526004016107e99190613e69565b5060006003828154811061316557634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160a081018252600590940290910180548452600181015484840152600281015484830152600381015460608501526004908101546080850152868552825292839020548351808501909452600b84526a1959d9c81a185d18da195960aa1b9184019190915290925060ff16156131fc5760405162461bcd60e51b81526004016107e99190613e69565b50613206826114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b8152509061325e5760405162461bcd60e51b81526004016107e99190613e69565b5080608001514210156040518060400160405280600e81526020016d656767206e6f74206d617475726560901b815250906132ac5760405162461bcd60e51b81526004016107e99190613e69565b50506000908152600460205260409020805460ff19166001179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146133195760405162461bcd60e51b81526004016107e99190613e69565b50600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015611624573d6000803e3d6000fd5b6000806000806000606060006003888154811061338057634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160a08101825260059094029091018054845260018101548484015260028101548483015260038101546060850181905260049182015460808601528d865292529092205490925060ff1661340f57600a61340279063917877cec0556b21269d695bdcbf7a87aa00000000000000083613f44565b61340c919061400e565b90505b816000015182602001518360400151838560800151600560008f81526020019081526020016000208080548060200260200160405190810160405280929190818152602001828054801561348257602002820191906000526020600020905b81548152602001906001019080831161346e575b50505050509050975097509750975097509750505091939550919395565b6001600160a01b038216600090815260086020526040812080549091906134c990600190613f77565b905060008282815481106134ed57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548683526007808352604080852080546006865282872080546001600160a01b0319169055929094529284905581845291909220819055845491925090829085908390811061355957634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055508380548061358557634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255868252600c905260409020546001600160a01b0316156114e8576135c385613679565b505050600091825250600c6020526040902080546001600160a01b031916905550565b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600881528382208054848452600783529483208590556001850181558252902090910155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136715750808214155b949350505050565b6000818152600c6020908152604080832054600d8352818420546001600160a01b03909116808552600b90935290832080549293919291906136bc600184613f77565b815481106136da57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061372c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152600b9091526040902080548061376f57634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152600d9091526040808220939093559384525082209190915550565b8280546137b490613fbe565b90600052602060002090601f0160209004810192826137d6576000855561381c565b82601f106137ef57805160ff191683800117855561381c565b8280016001018555821561381c579182015b8281111561381c578251825591602001919060010190613801565b5061382892915061382c565b5090565b5b80821115613828576000815560010161382d565b8035801515811461385157600080fd5b919050565b600060208284031215613867578081fd5b813561387281614064565b9392505050565b60006020828403121561388a578081fd5b815161387281614064565b600080604083850312156138a7578081fd5b82356138b281614064565b915060208301356138c281614064565b809150509250929050565b6000806000606084860312156138e1578081fd5b83356138ec81614064565b925060208401356138fc81614064565b929592945050506040919091013590565b600080600080600060808688031215613924578081fd5b853561392f81614064565b9450602086013561393f81614064565b93506040860135925060608601356001600160401b0380821115613961578283fd5b818801915088601f830112613974578283fd5b813581811115613982578384fd5b896020828501011115613993578384fd5b9699959850939650602001949392505050565b600080604083850312156139b8578182fd5b82356139c381614064565b91506139d160208401613841565b90509250929050565b600080604083850312156139ec578182fd5b82356139f781614064565b946020939093013593505050565b60006020808385031215613a17578182fd5b82356001600160401b03811115613a2c578283fd5b8301601f81018513613a3c578283fd5b8035613a4f613a4a82613f09565b613ed9565b80828252848201915084840188868560051b8701011115613a6e578687fd5b8694505b83851015613a90578035835260019490940193918501918501613a72565b50979650505050505050565b60008060408385031215613aae578182fd5b82516001600160401b03811115613ac3578283fd5b8301601f81018513613ad3578283fd5b80516020613ae3613a4a83613f09565b80838252828201915082850189848660051b8801011115613b02578788fd5b8795505b84861015613b24578051835260019590950194918301918301613b06565b50969091015195979596505050505050565b600060208284031215613b47578081fd5b61387282613841565b600060208284031215613b61578081fd5b81356138728161407c565b600060208284031215613b7d578081fd5b81516138728161407c565b60006020808385031215613b9a578182fd5b82356001600160401b0380821115613bb0578384fd5b818501915085601f830112613bc3578384fd5b813581811115613bd557613bd561404e565b613be7601f8201601f19168501613ed9565b91508082528684828501011115613bfc578485fd5b80848401858401378101909201929092529392505050565b600060208284031215613c25578081fd5b5035919050565b600060208284031215613c3d578081fd5b5051919050565b60008060408385031215613c56578182fd5b8235915060208301356138c281614064565b60008060408385031215613c7a578182fd5b50508035926020909101359150565b60008060408385031215613c9b578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015613ce45781516001600160a01b031687529582019590820190600101613cbf565b509495945050505050565b6000815180845260208085019450808401835b83811015613ce457815187529582019590820190600101613d02565b60008151613d30818560208601613f8e565b9290920192915050565b600080845482600182811c915080831680613d5657607f831692505b6020808410821415613d7657634e487b7160e01b87526022600452602487fd5b818015613d8a5760018114613d9b57613dc7565b60ff19861689528489019650613dc7565b60008b815260209020885b86811015613dbf5781548b820152908501908301613da6565b505084890196505b505050505050613dd78185613d1e565b95945050505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a084013781830160a090810191909152601f909201601f19160101949350505050565b604081526000613e446040830185613cac565b8281036020840152613dd78185613cac565b6020815260006138726020830184613cef565b6020815260008251806020840152613e88816040850160208701613f8e565b601f01601f19169190910160400192915050565b86815285602082015284604082015283606082015282608082015260c060a08201526000613ecd60c0830184613cef565b98975050505050505050565b604051601f8201601f191681016001600160401b0381118282101715613f0157613f0161404e565b604052919050565b60006001600160401b03821115613f2257613f2261404e565b5060051b60200190565b60008219821115613f3f57613f3f614022565b500190565b600082613f5357613f53614038565b500490565b6000816000190483118215151615613f7257613f72614022565b500290565b600082821015613f8957613f89614022565b500390565b60005b83811015613fa9578181015183820152602001613f91565b83811115613fb8576000848401525b50505050565b600181811c90821680613fd257607f821691505b6020821081141561154d57634e487b7160e01b600052602260045260246000fd5b600060001982141561400757614007614022565b5060010190565b60008261401d5761401d614038565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461407957600080fd5b50565b6001600160e01b03198116811461407957600080fdfea264697066735822122040c97a41f9a2d3ab5fe92798e5e972d8c276fd1f78c1c05961798d04e5d699d664736f6c63430008040033

Deployed ByteCode Sourcemap

29189:6457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17338:310;;;;;;;;;;-1:-1:-1;17338:310:0;;;;;:::i;:::-;;:::i;:::-;;;13432:14:1;;13425:22;13407:41;;13395:2;13380:18;17338:310:0;;;;;;;;30271:27;;;;;;;;;;;;;;;;;;;14551:25:1;;;14539:2;14524:18;30271:27:0;14506:76:1;16032:99:0;;;;;;;;;;-1:-1:-1;16111:12:0;;;;;;;;;;;;-1:-1:-1;;;16111:12:0;;;;16032:99;;;;;;;:::i;26978:160::-;;;;;;;;;;-1:-1:-1;26978:160:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10686:32:1;;;10668:51;;10656:2;10641:18;26978:160:0;10623:102:1;26310:333:0;;;;;;:::i;:::-;;:::i;:::-;;17715:188;;;;;;;;;;-1:-1:-1;17715:188:0;;;;;:::i;:::-;-1:-1:-1;;;17715:188:0;;;;;;;;;;;-1:-1:-1;;;;;;13621:33:1;;;13603:52;;13591:2;13576:18;17715:188:0;13558:103:1;25581:674:0;;;;;;:::i;:::-;;:::i;20207:174::-;;;;;;;;;;-1:-1:-1;20207:174:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30440:249::-;;;;;;;;;;-1:-1:-1;30440:249:0;;;;;:::i;:::-;;:::i;14454:87::-;;;;;;;;;;;;;:::i;12795:166::-;;;;;;;;;;-1:-1:-1;12795:166:0;;;;;:::i;:::-;;:::i;25154:372::-;;;;;;:::i;:::-;;:::i;21625:456::-;;;;;;;;;;-1:-1:-1;21625:456:0;;;;;:::i;:::-;;:::i;30840:1134::-;;;;;;:::i;:::-;;:::i;13795:26::-;;;;;;;;;;-1:-1:-1;13795:26:0;;;;-1:-1:-1;;;13795:26:0;;;;;;24476:173;;;;;;;;;;-1:-1:-1;24476:173:0;;;;;:::i;:::-;;:::i;24240:181::-;;;;;;;;;;-1:-1:-1;24240:181:0;;;;;:::i;:::-;;:::i;15864:82::-;;;;;;;;;;-1:-1:-1;15864:82:0;;;;;:::i;:::-;;:::i;14278:87::-;;;;;;;;;;;;;:::i;13098:156::-;;;;;;;;;;-1:-1:-1;13098:156:0;;;;;:::i;:::-;;:::i;33083:2044::-;;;;;;;;;;-1:-1:-1;33083:2044:0;;;;;:::i;:::-;;:::i;30165:37::-;;;;;;;;;;-1:-1:-1;30165:37:0;;;;-1:-1:-1;;;;;30165:37:0;;;27452:1220;;;;;;;;;;-1:-1:-1;27452:1220:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;26698:225::-;;;;;;;;;;-1:-1:-1;26698:225:0;;;;;:::i;:::-;;:::i;28730:452::-;;;;;;;;;;-1:-1:-1;28730:452:0;;;;;:::i;:::-;;:::i;24704:395::-;;;;;;:::i;:::-;;:::i;22670:1515::-;;;;;;;;;;-1:-1:-1;22670:1515:0;;;;;:::i;:::-;;:::i;16584:591::-;;;;;;;;;;-1:-1:-1;16584:591:0;;;;;:::i;:::-;;:::i;32396:241::-;;;;;;;;;;-1:-1:-1;32396:241:0;;;;;:::i;:::-;;:::i;20005:143::-;;;;;;;;;;-1:-1:-1;20005:143:0;;;;;:::i;:::-;;:::i;32211:35::-;;;;;;;;;;-1:-1:-1;32211:35:0;;;;-1:-1:-1;;;;;32211:35:0;;;35163:321;;;;;;;;;;-1:-1:-1;35163:321:0;;;;;:::i;:::-;;:::i;13318:110::-;;;;;;;;;;-1:-1:-1;13318:110:0;;;;;:::i;:::-;;:::i;27193:159::-;;;;;;;;;;-1:-1:-1;27193:159:0;;;;;:::i;:::-;-1:-1:-1;;;;;27309:24:0;;;27286:4;27309:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;27193:159;17962:434;;;;;;;;;;-1:-1:-1;17962:434:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;32692:39::-;;;;;;;;;;;;32730:1;32692:39;;17338:310;17418:4;-1:-1:-1;;;;;;17443:41:0;;-1:-1:-1;;;17443:41:0;;17442:88;;-1:-1:-1;;;;;;;17488:41:0;;-1:-1:-1;;;17488:41:0;17442:88;:144;;;-1:-1:-1;;;;;;;17533:52:0;;-1:-1:-1;;;17533:52:0;17442:144;:197;;;-1:-1:-1;;;;;;;17589:49:0;;-1:-1:-1;;;17589:49:0;17442:197;17434:206;17338:310;-1:-1:-1;;17338:310:0:o;26978:160::-;27049:7;27068:17;27076:8;27068:7;:17::i;:::-;-1:-1:-1;;27103:27:0;;;;:17;:27;;;;;;-1:-1:-1;;;;;27103:27:0;;26978:160::o;26310:333::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;;;;;;;;;26414:14:::1;26429:17;26437:8;26429:7;:17::i;:::-;26414:32:::0;-1:-1:-1;26465:10:0::1;-1:-1:-1::0;;;;;26465:18:0;::::1;;::::0;:56:::1;;-1:-1:-1::0;;;;;;26485:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;26510:10:::1;26485:36:::0;;;;;;;;::::1;;26465:56;26522:13;;;;;;;;;;;;;-1:-1:-1::0;;;26522:13:0::1;;::::0;26457:79:::1;;;;;-1:-1:-1::0;;;26457:79:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;26547:27:0::1;::::0;;;:17:::1;:27;::::0;;;;;:37;;-1:-1:-1;;;;;;26547:37:0::1;-1:-1:-1::0;;;;;26547:37:0;;::::1;::::0;;::::1;::::0;;;26600:35;;26547:27;;26600:35;;::::1;::::0;::::1;::::0;::::1;13975:1;26310:333:::0;;:::o;25581:674::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;25697:14:::1;25712:17;25720:8;25712:7;:17::i;:::-;25697:32:::0;-1:-1:-1;25748:10:0::1;-1:-1:-1::0;;;;;25748:18:0;::::1;;::::0;:56:::1;;-1:-1:-1::0;;;;;;25768:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;25793:10:::1;25768:36:::0;;;;;;;;::::1;;25748:56;:97;;;-1:-1:-1::0;25818:27:0::1;::::0;;;:17:::1;:27;::::0;;;;;-1:-1:-1;;;;;25818:27:0::1;25806:10;:39;25748:97;25846:13;;;;;;;;;;;;;-1:-1:-1::0;;;25846:13:0::1;;::::0;25740:120:::1;;;;;-1:-1:-1::0;;;25740:120:0::1;;;;;;;;:::i;:::-;;25886:6;-1:-1:-1::0;;;;;25879:13:0::1;:5;-1:-1:-1::0;;;;;25879:13:0::1;;25893:15;;;;;;;;;;;;;-1:-1:-1::0;;;25893:15:0::1;;::::0;25871:38:::1;;;;;-1:-1:-1::0;;;25871:38:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;25944:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;25944:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;25928:15:0;::::1;25920:40;;;;-1:-1:-1::0;;;25920:40:0::1;;;;;;;;:::i;:::-;;25971:27;25983:5;25989:8;25971:11;:27::i;:::-;26009:20;26016:3;26020:8;26009:6;:20::i;:::-;26081:1;26044:27:::0;;;:17:::1;:27;::::0;;;;;-1:-1:-1;;;;;26044:27:0::1;:39:::0;26040:162:::1;;26106:27;::::0;;;:17:::1;:27;::::0;;;;;26099:34;;-1:-1:-1;;;;;;26099:34:0::1;::::0;;26153:37;26124:8;;26106:27;-1:-1:-1;;;;;26153:37:0;::::1;::::0;::::1;::::0;26106:27;;26153:37:::1;26040:162;26238:8;26233:3;-1:-1:-1::0;;;;;26217:30:0::1;26226:5;-1:-1:-1::0;;;;;26217:30:0::1;;;;;;;;;;;13975:1;25581:674:::0;;;:::o;20207:174::-;20321:15;;;;;;;;;;;;-1:-1:-1;;;20321:15:0;;;;20268:16;;-1:-1:-1;;;;;20304:16:0;;20296:41;;;;-1:-1:-1;;;20296:41:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20355:17:0;;;;;;:11;:17;;;;;;;;;20348:25;;;;;;;;;;;;;;;;;20355:17;;20348:25;;20355:17;20348:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20207:174;;;:::o;30440:249::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;30544:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;30544:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;30527:16:0;::::1;30519:41;;;;-1:-1:-1::0;;;30519:41:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;30599:22:0::1;::::0;30576:67:::1;::::0;30627:15:::1;14551:25:1::0;;-1:-1:-1;;;;;30576:67:0;;::::1;::::0;30599:22:::1;::::0;30576:67:::1;::::0;14539:2:1;14524:18;30576:67:0::1;;;;;;;30654:22;:27:::0;;-1:-1:-1;;;;;;30654:27:0::1;-1:-1:-1::0;;;;;30654:27:0;;;::::1;::::0;;;::::1;::::0;;30440:249::o;14454:87::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;14104:6:0::1;::::0;14111:10:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;14111:10:0::1;::::0;::::1;::::0;;-1:-1:-1;;;14104:6:0;::::1;;;14096:26;;;;-1:-1:-1::0;;;14096:26:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;14519:6:0::2;:14:::0;;-1:-1:-1;;;;14519:14:0::2;::::0;;14454:87::o;12795:166::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;12911:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12911:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;12885:25:0;::::1;12877:50;;;;-1:-1:-1::0;;;12877:50:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;12938:10:0::1;:15:::0;;-1:-1:-1;;;;;;12938:15:0::1;-1:-1:-1::0;;;;;12938:15:0;;;::::1;::::0;;;::::1;::::0;;12795:166::o;25154:372::-;25262:34;25275:5;25282:3;25287:8;25262:12;:34::i;:::-;25311:16;:3;-1:-1:-1;;;;;25311:14:0;;:16::i;:::-;25307:212;;;25357:75;;-1:-1:-1;;;25357:75:0;;25400:10;25357:75;;;11705:34:1;-1:-1:-1;;;;;11775:15:1;;;11755:18;;;11748:43;11807:18;;;11800:34;;;11870:3;11850:18;;;11843:31;25343:13:0;11890:19:1;;;11883:33;;;25343:13:0;25357:42;;;;;;11933:19:1;;25357:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25490:16;;;;;;;;;;;;-1:-1:-1;;;25490:16:0;;;;25343:89;;-1:-1:-1;;;;;;;25455:34:0;;-1:-1:-1;;;25455:34:0;25447:60;;;;-1:-1:-1;;;25447:60:0;;;;;;;;:::i;:::-;;25307:212;;25154:372;;;:::o;21625:456::-;21721:16;21729:7;21721;:16::i;:::-;-1:-1:-1;;;;;21709:28:0;:10;-1:-1:-1;;;;;21709:28:0;;:55;;;;-1:-1:-1;21741:23:0;:10;:21;:23::i;:::-;21765:13;;;;;;;;;;;;;-1:-1:-1;;;21765:13:0;;;21701:78;;;;;-1:-1:-1;;;21701:78:0;;;;;;;;:::i;:::-;-1:-1:-1;21826:1:0;21794:22;;;:13;:22;;;;;;-1:-1:-1;;;;;21794:22:0;:34;21790:106;;21844:40;21876:7;21844:31;:40::i;:::-;21906:22;;;;:13;:22;;;;;;;;:27;;-1:-1:-1;;;;;21906:27:0;;;-1:-1:-1;;;;;;21906:27:0;;;;;;;21987;;;:21;:27;;;;;;:34;;21944:42;;;:33;:42;;;;;:77;;;22032:27;;;21906;22032:41;;;;;;;;;;21625:456::o;30840:1134::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;-1:-1:-1;30933:1:0::1;30945:45:::0;::::1;;;-1:-1:-1::0;30977:1:0::1;30945:45;31014:5;31000:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;31038:12:0::1;::::0;31052:4:::1;-1:-1:-1::0;31038:18:0::1;31030:52;;;::::0;-1:-1:-1;;;31030:52:0;;14256:2:1;31030:52:0::1;::::0;::::1;14238:21:1::0;14295:2;14275:18;;;14268:30;-1:-1:-1;;;14314:18:1;;;14307:52;14376:18;;31030:52:0::1;14228:172:1::0;31030:52:0::1;31151:22;::::0;31202:38:::1;::::0;;-1:-1:-1;;;31202:38:0;;;;-1:-1:-1;;;;;31151:22:0;;::::1;::::0;31093:40:::1;::::0;31151:22;;31202:36:::1;::::0;:38:::1;::::0;;::::1;::::0;;;;;;;31151:22;31202:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31185:55:0;-1:-1:-1;31270:11:0::1;31276:5:::0;31185:55;31270:11:::1;:::i;:::-;31259:9;:22;;31282:11;;;;;;;;;;;;;-1:-1:-1::0;;;31282:11:0::1;;::::0;31251:43:::1;;;;;-1:-1:-1::0;;;31251:43:0::1;;;;;;;;:::i;:::-;;31305:13;31329:22:::0;31368:5:::1;-1:-1:-1::0;;;;;31354:20:0::1;;;;;-1:-1:-1::0;;;31354:20:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;31354:20:0::1;-1:-1:-1::0;31399:56:0::1;::::0;-1:-1:-1;;;31399:56:0;;31437:10:::1;31399:56;::::0;::::1;12131:51:1::0;12225:14;;12218:22;12198:18;;;12191:50;31329:45:0;;-1:-1:-1;;;;;;31399:37:0;::::1;::::0;::::1;::::0;12104:18:1;;31399:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;31399:56:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;31385:70:::0;-1:-1:-1;31385:70:0;-1:-1:-1;31470:9:0::1;31466:387;31484:5;31482:1;:7;31466:387;;;31509:15;31525:178;;;;;;;;31554:5;31525:178;;;;31582:1;31525:178;;;;31606:1;31525:178;;;;31631:5;31637:1;31631:8;;;;;;-1:-1:-1::0;;;31631:8:0::1;;;;;;;;;;;;;;;31525:178;;;;31665:15;31681:6;31665:22;;;;:::i;:::-;31525:178:::0;;31736:4:::1;:11:::0;31509:194;;-1:-1:-1;31718:30:0::1;::::0;31725:10:::1;::::0;31718:6:::1;:30::i;:::-;31799:4;:11:::0;31768:43:::1;::::0;31788:10:::1;::::0;31785:1:::1;::::0;31768:43:::1;::::0;31785:1;;31768:43:::1;31826:4;:15:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31826:15:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;31490:3;::::1;::::0;::::1;:::i;:::-;;;;31466:387;;;-1:-1:-1::0;31877:11:0::1;31883:5:::0;31877;:11:::1;:::i;:::-;31867:9;:21;31863:104;;;31912:10;31904:51;31943:11;31949:5:::0;31943;:11:::1;:::i;:::-;31933:21;::::0;:9:::1;:21;:::i;:::-;31904:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;31863:104;13975:1;;;;;30840:1134:::0;:::o;24476:173::-;24541:11;24568:24;;;:14;:24;;;;;;;;;;24627:13;;;;;;;;;;;-1:-1:-1;;;24627:13:0;;;;;;;-1:-1:-1;;;;;24568:24:0;;24611:15;24603:38;;;;-1:-1:-1;;;24603:38:0;;;;;;;;:::i;:::-;;24476:173;;;:::o;24240:181::-;24353:15;;;;;;;;;;;;-1:-1:-1;;;24353:15:0;;;;24307:7;;-1:-1:-1;;;;;24334:18:0;;24326:43;;;;-1:-1:-1;;;24326:43:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;24387:19:0;;;;;:11;:19;;;;;:26;;24240:181::o;15864:82::-;12608:5;;12614:13;;;;;;;;;;;;-1:-1:-1;;;12614:13:0;;;;;-1:-1:-1;;;;;12608:5:0;12596:10;:17;12588:40;;;;-1:-1:-1;;;12588:40:0;;;;;;;;:::i;:::-;-1:-1:-1;15930:8:0;;::::1;::::0;:3:::1;::::0;:8:::1;::::0;::::1;::::0;::::1;:::i;:::-;;15864:82:::0;:::o;14278:87::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13950:6:0::1;::::0;13957::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13957:6:0::1;::::0;::::1;::::0;;-1:-1:-1;;;13950:6:0;::::1;;;13949:7;13941:23;;;;-1:-1:-1::0;;;13941:23:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;14353:4:0::2;14344:13:::0;;-1:-1:-1;;;;14344:13:0::2;-1:-1:-1::0;;;14344:13:0::2;::::0;;14278:87::o;13098:156::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13209:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13209:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;13183:25:0;::::1;13175:50;;;;-1:-1:-1::0;;;13175:50:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;13236:5:0::1;:10:::0;;-1:-1:-1;;;;;;13236:10:0::1;-1:-1:-1::0;;;;;13236:10:0;;;::::1;::::0;;;::::1;::::0;;13098:156::o;33083:2044::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;-1:-1:-1;;;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;33219:19:::1;33227:10;33219:7;:19::i;:::-;-1:-1:-1::0;;;;;33207:31:0::1;:10;-1:-1:-1::0;;;;;33207:31:0::1;;33239:13;;;;;;;;;;;;;-1:-1:-1::0;;;33239:13:0::1;;::::0;33199:54:::1;;;;;-1:-1:-1::0;;;33199:54:0::1;;;;;;;;:::i;:::-;;33284:19;33292:10;33284:7;:19::i;:::-;-1:-1:-1::0;;;;;33272:31:0::1;:10;-1:-1:-1::0;;;;;33272:31:0::1;;33304:13;;;;;;;;;;;;;-1:-1:-1::0;;;33304:13:0::1;;::::0;33264:54:::1;;;;;-1:-1:-1::0;;;33264:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33329:24:0::1;33354:29:::0;;;:17:::1;:29;::::0;;;;;;;:36;33426:29;;;;;;;:36;33512:22;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;32730:1:::1;33481:30:::0;::::1;33473:62;;;;-1:-1:-1::0;;;33473:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33585:22:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;32730:1:::1;33554:30:::0;::::1;33546:62;;;;-1:-1:-1::0;;;33546:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33627:28:0::1;::::0;;;:16:::1;:28;::::0;;;;;::::1;;:58:::0;::::1;;;-1:-1:-1::0;33657:28:0::1;::::0;;;:16:::1;:28;::::0;;;;;::::1;;33627:58;33686:15;;;;;;;;;;;;;-1:-1:-1::0;;;33686:15:0::1;;::::0;33619:83:::1;;;;;-1:-1:-1::0;;;33619:83:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33744:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;33744:15:0::1;::::0;::::1;::::0;33721:22;;::::1;;33713:47;;;;-1:-1:-1::0;;;33713:47:0::1;;;;;;;;:::i;:::-;;33771:15;33787:4;33792:10;33787:16;;;;;;-1:-1:-1::0;;;33787:16:0::1;;;;;;;;;;;;;;;;;;;33771:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;33814:15;33830:4;33835:10;33830:16;;;;;;-1:-1:-1::0;;;33830:16:0::1;;;;;;;;;;;;;;;;;;;33814:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;33863:15;33873:4;35624:8:::0;;;:11;;35543:100;33863:15:::1;:34;;;;-1:-1:-1::0;35624:8:0;;;;:11;33882:15:::1;33857:290;;33922:8;::::0;;::::1;::::0;33943:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;33943:14:0::1;::::0;::::1;::::0;33922:20;::::1;;33914:44;;;;-1:-1:-1::0;;;33914:44:0::1;;;;;;;;:::i;:::-;;33991:10;33981:4;:8;;;:20;;34002:14;;;;;;;;;;;;;-1:-1:-1::0;;;34002:14:0::1;;::::0;33973:44:::1;;;;;-1:-1:-1::0;;;33973:44:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;34040:8:0::1;::::0;;::::1;::::0;34061:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;34061:14:0::1;::::0;::::1;::::0;34040:20;::::1;;34032:44;;;;-1:-1:-1::0;;;34032:44:0::1;;;;;;;;:::i;:::-;;34109:10;34099:4;:8;;;:20;;34120:14;;;;;;;;;;;;;-1:-1:-1::0;;;34120:14:0::1;;::::0;34091:44:::1;;;;;-1:-1:-1::0;;;34091:44:0::1;;;;;;;;:::i;:::-;;33857:290;35624:8:::0;;;;:11;34161:16:::1;:36;;;;-1:-1:-1::0;35624:8:0;;;;:11;34181:16:::1;34161:36;34157:281;;;34231:8;::::0;;::::1;::::0;34221;;::::1;::::0;34240:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;34240:14:0::1;::::0;::::1;::::0;34221:18:::1;;34213:42;;;;-1:-1:-1::0;;;34213:42:0::1;;;;;;;;:::i;:::-;;34288:4;:8;;;34278:4;:8;;;:18;;34297:14;;;;;;;;;;;;;-1:-1:-1::0;;;34297:14:0::1;;::::0;34270:42:::1;;;;;-1:-1:-1::0;;;34270:42:0::1;;;;;;;;:::i;:::-;;34345:4;:8;;;34335:4;:8;;;:18;;34354:14;;;;;;;;;;;;;-1:-1:-1::0;;;34354:14:0::1;;::::0;34327:42:::1;;;;;-1:-1:-1::0;;;34327:42:0::1;;;;;;;;:::i;:::-;;34402:4;:8;;;34392:4;:8;;;:18;;34411:14;;;;;;;;;;;;;-1:-1:-1::0;;;34411:14:0::1;;::::0;34384:42:::1;;;;;-1:-1:-1::0;;;34384:42:0::1;;;;;;;;:::i;:::-;;34157:281;34449:12;34495:16:::0;34462:32:::1;34478:16:::0;34462:15:::1;:32;:::i;:::-;:49;;;;:::i;:::-;34550:20;::::0;34586:9:::1;::::0;;::::1;::::0;34596;;::::1;::::0;34449:62;;-1:-1:-1;34522:12:0::1;::::0;-1:-1:-1;;;;;34550:20:0;;::::1;::::0;34535:45:::1;::::0;34449:62;;34606:16;34623;34640:10:::1;34651:15;34586:4:::0;35624:8;;;:11;;35543:100;34651:15:::1;35624:8:::0;;;;:11;34535:148:::1;::::0;-1:-1:-1;;;;;;34535:148:0::1;::::0;;;;;;::::1;::::0;::::1;14918:25:1::0;;;;14959:18;;;14952:34;;;;15002:18;;;14995:34;;;;15045:18;;;15038:34;;;;15088:19;;;15081:35;-1:-1:-1;;;;;15153:32:1;15132:19;;;15125:61;15230:14;15223:22;15202:19;;;15195:51;15290:14;15283:22;15262:19;;;15255:51;14890:19;;34535:148:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34522:161;;34694:15;34710:153;;;;;;;;34735:1;34710:153;;;;34755:10;34710:153;;;;34784:10;34710:153;;;;34814:4;34710:153;;;;34840:4;34845:6;34840:11;;;;:::i;:::-;34710:153:::0;;34882:4:::1;:11:::0;;34904:15:::1;::::0;::::1;::::0;;-1:-1:-1;34904:15:0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;34882:11;-1:-1:-1;34694:169:0;-1:-1:-1;34930:26:0::1;34937:10;34882:11:::0;34930:6:::1;:26::i;:::-;34967:29;::::0;;;:17:::1;:29;::::0;;;;;;;:43;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;35021:29;;;;;;:43;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;35080:39;35002:7;;35100:10:::1;::::0;35080:39:::1;::::0;34967:29;;35080:39:::1;13975:1;;;;;;;33083:2044:::0;;;;:::o;27452:1220::-;27580:15;;27525:16;;;;27570:9;27580:15;-1:-1:-1;;;;;27628:16:0;;;;;-1:-1:-1;;;27628:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27628:16:0;;27606:38;;27655:21;27691:1;-1:-1:-1;;;;;27677:16:0;;;;;-1:-1:-1;;;27677:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27677:16:0;;27655:38;;27704:13;27728:15;27759:9;27754:882;27773:1;27771;:3;27754:882;;;27802:8;27811:1;27802:11;;;;;;-1:-1:-1;;;27802:11:0;;;;;;;;;;;;;;;27794:19;;27834:16;27842:7;27834;:16::i;:::-;27869:25;;;;:16;:25;;;;;;27828:22;;-1:-1:-1;27869:25:0;;27865:760;;;27918:18;:5;-1:-1:-1;;;;;27918:16:0;;:18::i;:::-;27914:588;;;28026:47;;-1:-1:-1;;;;;;28026:47:0;;28059:4;28026:47;;;12426:51:1;12493:18;;;12486:34;;;27993:5:0;;-1:-1:-1;;;;;28026:24:0;;;;;12399:18:1;;28026:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28026:47:0;;;;;;;;-1:-1:-1;;28026:47:0;;;;;;;;;;;;:::i;:::-;;;28022:162;;28180:1;28164:4;28169:1;28164:7;;;;;;-1:-1:-1;;;28164:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28164:18:0;;;-1:-1:-1;;;;;28164:18:0;;;;;28022:162;;;28130:4;28122;28127:1;28122:7;;;;;;-1:-1:-1;;;28122:7:0;;;;;;;;;;;;;;:12;-1:-1:-1;;;;;28122:12:0;;;-1:-1:-1;;;;;28122:12:0;;;;;28074:84;28022:162;28210:48;;-1:-1:-1;;;28210:48:0;;28244:4;28210:48;;;12426:51:1;12493:18;;;12486:34;;;-1:-1:-1;;;;;28210:25:0;;;;;12399:18:1;;28210:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28210:48:0;;;;;;;;-1:-1:-1;;28210:48:0;;;;;;;;;;;;:::i;:::-;;;28206:163;;28365:1;28349:4;28354:1;28349:7;;;;;;-1:-1:-1;;;28349:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28349:18:0;;;-1:-1:-1;;;;;28349:18:0;;;;;28206:163;;;28315:4;28307;28312:1;28307:7;;;;;;-1:-1:-1;;;28307:7:0;;;;;;;;;;;;;;:12;-1:-1:-1;;;;;28307:12:0;;;-1:-1:-1;;;;;28307:12:0;;;;;28259:84;28206:163;27914:588;27865:760;;27914:588;28441:5;28433:4;28438:1;28433:7;;;;;;-1:-1:-1;;;28433:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;28433:13:0;;;-1:-1:-1;;;;;28433:13:0;;;;;28477:5;28469:4;28474:1;28469:7;;;;;;-1:-1:-1;;;28469:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;28469:13:0;;;-1:-1:-1;;;;;28469:13:0;;;;;27865:760;;;28570:1;28554:4;28559:1;28554:7;;;;;;-1:-1:-1;;;28554:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28554:18:0;;;-1:-1:-1;;;;;28554:18:0;;;;;28607:1;28591:4;28596:1;28591:7;;;;;;-1:-1:-1;;;28591:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28591:18:0;;;-1:-1:-1;;;;;28591:18:0;;;;;27865:760;27775:3;;;;:::i;:::-;;;;27754:882;;;-1:-1:-1;28654:4:0;;28659;;-1:-1:-1;27452:1220:0;;-1:-1:-1;;;;;27452:1220:0:o;26698:225::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;-1:-1:-1;26819:10:0::1;26802:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;26802:39:0;::::1;::::0;;;;;;;;;;:49;;-1:-1:-1;;26802:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26867:48;;13407:41:1;;;26802:39:0;;26819:10;26867:48:::1;::::0;13380:18:1;26867:48:0::1;;;;;;;26698:225:::0;;:::o;28730:452::-;28836:15;;28798:16;;28826:9;28836:15;-1:-1:-1;;;;;28885:16:0;;;;;-1:-1:-1;;;28885:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28885:16:0;;28862:39;;28917:9;28912:242;28931:1;28929;:3;28912:242;;;28956:22;28966:8;28975:1;28966:11;;;;;;-1:-1:-1;;;28966:11:0;;;;;;;;;;;;;;;28956:9;:22::i;:::-;28952:191;;;28998:15;29014:4;29019:8;29028:1;29019:11;;;;;;-1:-1:-1;;;29019:11:0;;;;;;;;;;;;;;;29014:17;;;;;;-1:-1:-1;;;29014:17:0;;;;;;;;;;;;;;;;;;;28998:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29057:4;:9;;;29050:3;29054:1;29050:6;;;;;;-1:-1:-1;;;29050:6:0;;;;;;;;;;;;;;:16;;;;;28952:191;;;;29126:1;29119:3;29123:1;29119:6;;;;;;-1:-1:-1;;;29119:6:0;;;;;;;;;;;;;;:8;;;;;28952:191;28933:3;;;;:::i;:::-;;;;28912:242;;;-1:-1:-1;29171:3:0;28730:452;-1:-1:-1;;;28730:452:0:o;24704:395::-;24833:34;24846:5;24853:3;24858:8;24833:12;:34::i;:::-;24882:16;:3;-1:-1:-1;;;;;24882:14:0;;:16::i;:::-;24878:214;;;24928:77;;-1:-1:-1;;;24928:77:0;;24914:13;;-1:-1:-1;;;;;24928:42:0;;;;;:77;;24971:10;;24983:5;;24990:8;;25000:4;;;;24928:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25063:16;;;;;;;;;;;;-1:-1:-1;;;25063:16:0;;;;24914:91;;-1:-1:-1;;;;;;;25028:34:0;;-1:-1:-1;;;25028:34:0;25020:60;;;;-1:-1:-1;;;25020:60:0;;;;;;;;:::i;22670:1515::-;22781:15;;;;;;;;;;;;-1:-1:-1;;;22781:15:0;;;;22728:16;;-1:-1:-1;;;;;22764:16:0;;22756:41;;;;-1:-1:-1;;;22756:41:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22831:17:0;;22808:22;22831:17;;;:11;:17;;;;;;;;22808:40;;;;;;;;;;;;;;;;;;;22831:17;;22808:40;;;22831:17;22808:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;22882:27:0;;22859:22;22882:27;;;:21;:27;;;;;;;;22859:50;;;;;;;;;;;;;;;;;22808:40;;-1:-1:-1;22859:22:0;;:50;;-1:-1:-1;22859:50:0;;;22882:27;22859:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22931:12:0;;22965;;22859:50;;-1:-1:-1;22931:12:0;22965;-1:-1:-1;22920:10:0;;-1:-1:-1;22931:12:0;;-1:-1:-1;;;;;;23014:17:0;;;;;-1:-1:-1;;;23014:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23014:17:0;;22988:43;;23042:23;23082:2;-1:-1:-1;;;;;23068:17:0;;;;;-1:-1:-1;;;23068:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23068:17:0;;23042:43;;23096:14;23121;23151:9;23146:163;23165:2;23163:1;:4;23146:163;;;23191:16;:26;23208:5;23214:1;23208:8;;;;;;-1:-1:-1;;;23208:8:0;;;;;;;;;;;;;;;;;;;;23191:26;;;;;;;;;;-1:-1:-1;23191:26:0;;;;23187:111;;;23237:8;;;;:::i;:::-;;;;23274:5;23280:1;23274:8;;;;;;-1:-1:-1;;;23274:8:0;;;;;;;;;;;;;;;23264:6;23271:1;23264:9;;;;;;-1:-1:-1;;;23264:9:0;;;;;;;;;;;;;;:18;;;;;23187:111;23168:3;;;;:::i;:::-;;;;23146:163;;;;23324:9;23319:430;23338:2;23336:1;:4;23319:430;;;23364:16;:26;23381:5;23387:1;23381:8;;;;;;-1:-1:-1;;;23381:8:0;;;;;;;;;;;;;;;;;;;;23364:26;;;;;;;;;;-1:-1:-1;23364:26:0;;;;23360:378;;;23410:24;23443:17;23451:5;23457:1;23451:8;;;;;;-1:-1:-1;;;23451:8:0;;;;;;;;;;;;;;;23443:7;:17::i;:::-;23410:51;;23484:16;-1:-1:-1;;;;;23484:24:0;;23517:4;23523:5;23529:1;23523:8;;;;;;-1:-1:-1;;;23523:8:0;;;;;;;;;;;;;;;23484:48;;;;;;;;;;;;;;;-1:-1:-1;;;;;12444:32:1;;;;12426:51;;12508:2;12493:18;;12486:34;12414:2;12399:18;;12381:145;23484:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23484:48:0;;;;;;;;-1:-1:-1;;23484:48:0;;;;;;;;;;;;:::i;:::-;;;23480:243;;;;;23586:4;-1:-1:-1;;;;;23581:9:0;:3;-1:-1:-1;;;;;23581:9:0;;23577:118;;;23618:8;;;;:::i;:::-;;;;23663:5;23669:1;23663:8;;;;;;-1:-1:-1;;;23663:8:0;;;;;;;;;;;;;;;23653:6;23660:1;23653:9;;;;;;-1:-1:-1;;;23653:9:0;;;;;;;;;;;;;;:18;;;;;23577:118;23533:181;23480:243;23360:378;;23341:3;;;;:::i;:::-;;;;23319:430;;;-1:-1:-1;23759:13:0;;23822;23829:6;23822;:13;:::i;:::-;-1:-1:-1;;;;;23808:28:0;;;;;-1:-1:-1;;;23808:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23808:28:0;;23785:51;;23852:9;23847:150;23866:2;23864:1;:4;23847:150;;;23892:6;23899:1;23892:9;;;;;;-1:-1:-1;;;23892:9:0;;;;;;;;;;;;;;;23903:1;23892:12;23888:98;;23935:6;23942:1;23935:9;;;;;;-1:-1:-1;;;23935:9:0;;;;;;;;;;;;;;;23924:3;23928:5;23924:10;;;;;;-1:-1:-1;;;23924:10:0;;;;;;;;;;;;;;;;;;:20;23963:7;;;;:::i;:::-;;;;23888:98;23869:3;;;;:::i;:::-;;;;23847:150;;;;24012:9;24007:150;24026:2;24024:1;:4;24007:150;;;24052:6;24059:1;24052:9;;;;;;-1:-1:-1;;;24052:9:0;;;;;;;;;;;;;;;24063:1;24052:12;24048:98;;24095:6;24102:1;24095:9;;;;;;-1:-1:-1;;;24095:9:0;;;;;;;;;;;;;;;24084:3;24088:5;24084:10;;;;;;-1:-1:-1;;;24084:10:0;;;;;;;;;;;;;;;;;;:20;24123:7;;;;:::i;:::-;;;;24048:98;24029:3;;;;:::i;:::-;;;;24007:150;;;-1:-1:-1;24174:3:0;22670:1515;-1:-1:-1;;;;;;;;;;;22670:1515:0:o;16584:591::-;16694:4;:11;16652:13;;16685:20;;:35;;;;-1:-1:-1;16709:11:0;;;16685:35;16721:13;;;;;;;;;;;;;-1:-1:-1;;;16721:13:0;;;16677:58;;;;;-1:-1:-1;;;16677:58:0;;;;;;;;:::i;:::-;-1:-1:-1;16761:8:0;16746:12;16805:78;16812:9;;16805:78;;16838:8;;;;:::i;:::-;;-1:-1:-1;16861:10:0;;-1:-1:-1;16869:2:0;16861:10;;:::i;:::-;;;16805:78;;;16893:19;16925:6;-1:-1:-1;;;;;16915:17:0;;;;;-1:-1:-1;;;16915:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16915:17:0;;16893:39;;16943:163;16950:13;;16943:163;;16980:11;16990:1;16980:11;;:::i;:::-;;-1:-1:-1;17049:13:0;17060:2;17049:8;:13;:::i;:::-;17036:27;;:2;:27;:::i;:::-;17023:42;;17006:6;17013;17006:14;;;;;;-1:-1:-1;;;17006:14:0;;;;;;;;;;;;:59;-1:-1:-1;;;;;17006:59:0;;;;;;;;-1:-1:-1;17080:14:0;17092:2;17080:14;;:::i;:::-;;;16943:163;;;17147:3;17158:6;17130:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17116:51;;;;;16584:591;;;:::o;32396:241::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;32498:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;32498:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;32481:16:0;::::1;32473:41;;;;-1:-1:-1::0;;;32473:41:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;32551:20:0::1;::::0;32530:63:::1;::::0;32577:15:::1;14551:25:1::0;;-1:-1:-1;;;;;32530:63:0;;::::1;::::0;32551:20:::1;::::0;32530:63:::1;::::0;14539:2:1;14524:18;32530:63:0::1;;;;;;;32604:20;:25:::0;;-1:-1:-1;;;;;;32604:25:0::1;-1:-1:-1::0;;;;;32604:25:0;;;::::1;::::0;;;::::1;::::0;;32396:241::o;20005:143::-;20062:8;20082:17;20090:8;20082:7;:17::i;:::-;-1:-1:-1;;20114:26:0;;;;:16;:26;;;;;;;;;20005:143::o;35163:321::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;35231:15:::1;35247:4;35252:7;35247:13;;;;;;-1:-1:-1::0;;;35247:13:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;35231:29:::1;::::0;;::::1;::::0;::::1;::::0;;35247:13:::1;::::0;;::::1;::::0;;::::1;35231:29:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;35280:25;;;;;;;;;;35306:7;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;35306:7:0;;::::1;::::0;;;;35231:29;;-1:-1:-1;35280:25:0::1;;35279:26;35271:43;;;;-1:-1:-1::0;;;35271:43:0::1;;;;;;;;:::i;:::-;;35345:16;35353:7;35345;:16::i;:::-;-1:-1:-1::0;;;;;35333:28:0::1;:10;-1:-1:-1::0;;;;;35333:28:0::1;;35362:13;;;;;;;;;;;;;-1:-1:-1::0;;;35362:13:0::1;;::::0;35325:51:::1;;;;;-1:-1:-1::0;;;35325:51:0::1;;;;;;;;:::i;:::-;;35412:4;:11;;;35395:15;:28;;35424:10;;;;;;;;;;;;;-1:-1:-1::0;;;35424:10:0::1;;::::0;35387:48:::1;;;;;-1:-1:-1::0;;;35387:48:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;35446:25:0::1;::::0;;;:16:::1;:25;::::0;;;;:30;;-1:-1:-1;;35446:30:0::1;35472:4;35446:30;::::0;;35163:321::o;13318:110::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13393:10:0::1;::::0;;:27:::1;::::0;-1:-1:-1;;;;;13393:10:0;;::::1;::::0;:27;::::1;;;::::0;13413:6;;13393:27;:10;:27;13413:6;13393:10;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;17962:434:::0;18019:7;18027;18035;18043;18051;18059:16;18087:15;18103:4;18108:8;18103:14;;;;;;-1:-1:-1;;;18103:14:0;;;;;;;;;;;;;;;;;18087:30;;;;;;;;18103:14;;;;;;;18087:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18166:26;;;;;;;;;18087:30;;-1:-1:-1;18166:26:0;;18161:136;;18283:2;18214:67;18219:62;18214:4;:67;:::i;:::-;18213:72;;;;:::i;:::-;18208:77;;18161:136;18314:4;:10;;;18325:4;:8;;;18334:4;:8;;;18343:4;18348;:11;;;18360:17;:27;18378:8;18360:27;;;;;;;;;;;18307:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17962:434;;;;;;;:::o;20954:663::-;-1:-1:-1;;;;;21057:18:0;;21026:30;21057:18;;;:11;:18;;;;;21104:19;;21057:18;;21026:30;21104:21;;21124:1;;21104:21;:::i;:::-;21086:39;;21136:19;21156:12;21169:9;21156:23;;;;;;-1:-1:-1;;;21156:23:0;;;;;;;;;;;;;;;;;;;;;21209:24;;;:14;:24;;;;;;;;;21251:14;:24;;;;;21244:31;;-1:-1:-1;;;;;;21244:31:0;;;21293:24;;;;21286:31;;;;21328:27;;;;;;;:38;;;21377:24;;21156:23;;-1:-1:-1;21209:24:0;21156:23;;21377:12;;21209:24;;21377;;;;-1:-1:-1;;;21377:24:0;;;;;;;;;;;;;;;;:36;;;;21424:12;:18;;;;;-1:-1:-1;;;21424:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21424:18:0;;;;;;;;;;;;21457:23;;;:13;:23;;;;;;-1:-1:-1;;;;;21457:23:0;:35;21453:157;;21508:41;21540:8;21508:31;:41::i;:::-;-1:-1:-1;;;21596:1:0;21564:23;;;-1:-1:-1;21564:13:0;:23;;;;;:34;;-1:-1:-1;;;;;;21564:34:0;;;-1:-1:-1;20954:663:0:o;20566:253::-;20632:24;;;;:14;:24;;;;;;;;:28;;-1:-1:-1;;;;;20632:28:0;;;-1:-1:-1;;;;;;20632:28:0;;;;;;;20702:16;;;:11;:16;;;;;20754:19;;20729:24;;;:14;:24;;;;;:44;;;20632:28;20784:27;;;;;;;;;;;;20566:253::o;2385:786::-;2470:17;3054:18;;2958:66;3120:15;;;;;:42;;;3151:11;3139:8;:23;;3120:42;3104:59;2385:786;-1:-1:-1;;;;2385:786:0:o;22089:529::-;22166:12;22179:22;;;:13;:22;;;;;;;;;22226:33;:42;;;;;;-1:-1:-1;;;;;22179:22:0;;;22289:27;;;:21;:27;;;;;;:34;;22179:22;;22226:42;;22289:34;22166:12;22382:3;22179:22;22289:34;22382:3;:::i;:::-;22354:32;;;;;;-1:-1:-1;;;22354:32:0;;;;;;;;;;;;;;;;;22334:52;;22432:11;22397:21;:27;22419:4;-1:-1:-1;;;;;22397:27:0;-1:-1:-1;;;;;22397:27:0;;;;;;;;;;;;22425:5;22397:34;;;;;;-1:-1:-1;;;22397:34:0;;;;;;;;;;;;;;;;;;;;:46;;;;-1:-1:-1;;;;;22454:27:0;;;;:21;:27;;;;;;:33;;;;;-1:-1:-1;;;22454:33:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22454:33:0;;;;;;;;;;;;22498:46;;;:33;:46;;;;;;;:52;;;;22568:42;;;-1:-1:-1;22568:42:0;;22561:49;;;;-1:-1:-1;22089:529:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:1;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;:::-;425:5;249:187;-1:-1:-1;;;249:187:1:o;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;977:398::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;1064:311;;;;;:::o;1380:466::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;1547:6;1539;1532:22;1494:2;1591:9;1578:23;1610:31;1635:5;1610:31;:::i;:::-;1660:5;-1:-1:-1;1717:2:1;1702:18;;1689:32;1730:33;1689:32;1730:33;:::i;:::-;1484:362;;1782:7;;-1:-1:-1;;;1836:2:1;1821:18;;;;1808:32;;1484:362::o;1851:986::-;1948:6;1956;1964;1972;1980;2033:3;2021:9;2012:7;2008:23;2004:33;2001:2;;;2055:6;2047;2040:22;2001:2;2099:9;2086:23;2118:31;2143:5;2118:31;:::i;:::-;2168:5;-1:-1:-1;2225:2:1;2210:18;;2197:32;2238:33;2197:32;2238:33;:::i;:::-;2290:7;-1:-1:-1;2344:2:1;2329:18;;2316:32;;-1:-1:-1;2399:2:1;2384:18;;2371:32;-1:-1:-1;;;;;2452:14:1;;;2449:2;;;2484:6;2476;2469:22;2449:2;2527:6;2516:9;2512:22;2502:32;;2572:7;2565:4;2561:2;2557:13;2553:27;2543:2;;2599:6;2591;2584:22;2543:2;2644;2631:16;2670:2;2662:6;2659:14;2656:2;;;2691:6;2683;2676:22;2656:2;2741:7;2736:2;2727:6;2723:2;2719:15;2715:24;2712:37;2709:2;;;2767:6;2759;2752:22;2709:2;1991:846;;;;-1:-1:-1;1991:846:1;;-1:-1:-1;2803:2:1;2795:11;;2825:6;1991:846;-1:-1:-1;;;1991:846:1:o;2842:325::-;2907:6;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:2;;;2989:6;2981;2974:22;2936:2;3033:9;3020:23;3052:31;3077:5;3052:31;:::i;:::-;3102:5;-1:-1:-1;3126:35:1;3157:2;3142:18;;3126:35;:::i;:::-;3116:45;;2926:241;;;;;:::o;3172:325::-;3240:6;3248;3301:2;3289:9;3280:7;3276:23;3272:32;3269:2;;;3322:6;3314;3307:22;3269:2;3366:9;3353:23;3385:31;3410:5;3385:31;:::i;:::-;3435:5;3487:2;3472:18;;;;3459:32;;-1:-1:-1;;;3259:238:1:o;3502:947::-;3586:6;3617:2;3660;3648:9;3639:7;3635:23;3631:32;3628:2;;;3681:6;3673;3666:22;3628:2;3726:9;3713:23;-1:-1:-1;;;;;3751:6:1;3748:30;3745:2;;;3796:6;3788;3781:22;3745:2;3824:22;;3877:4;3869:13;;3865:27;-1:-1:-1;3855:2:1;;3911:6;3903;3896:22;3855:2;3952;3939:16;3975:60;3991:43;4031:2;3991:43;:::i;:::-;3975:60;:::i;:::-;4057:3;4081:2;4076:3;4069:15;4109:2;4104:3;4100:12;4093:19;;4140:2;4136;4132:11;4188:7;4183:2;4177;4174:1;4170:10;4166:2;4162:19;4158:28;4155:41;4152:2;;;4214:6;4206;4199:22;4152:2;4241:6;4232:15;;4256:163;4270:2;4267:1;4264:9;4256:163;;;4327:17;;4315:30;;4288:1;4281:9;;;;;4365:12;;;;4397;;4256:163;;;-1:-1:-1;4438:5:1;3597:852;-1:-1:-1;;;;;;;3597:852:1:o;4454:1000::-;4558:6;4566;4619:2;4607:9;4598:7;4594:23;4590:32;4587:2;;;4640:6;4632;4625:22;4587:2;4678:9;4672:16;-1:-1:-1;;;;;4703:6:1;4700:30;4697:2;;;4748:6;4740;4733:22;4697:2;4776:22;;4829:4;4821:13;;4817:27;-1:-1:-1;4807:2:1;;4863:6;4855;4848:22;4807:2;4897;4891:9;4919:4;4943:60;4959:43;4999:2;4959:43;:::i;4943:60::-;5025:3;5049:2;5044:3;5037:15;5077:2;5072:3;5068:12;5061:19;;5108:2;5104;5100:11;5156:7;5151:2;5145;5142:1;5138:10;5134:2;5130:19;5126:28;5123:41;5120:2;;;5182:6;5174;5167:22;5120:2;5209:6;5200:15;;5224:156;5238:2;5235:1;5232:9;5224:156;;;5295:10;;5283:23;;5256:1;5249:9;;;;;5326:12;;;;5358;;5224:156;;;-1:-1:-1;5429:18:1;;;;5423:25;5399:5;;5423:25;;-1:-1:-1;;;;;;4577:877:1:o;5459:190::-;5515:6;5568:2;5556:9;5547:7;5543:23;5539:32;5536:2;;;5589:6;5581;5574:22;5536:2;5617:26;5633:9;5617:26;:::i;5654:255::-;5712:6;5765:2;5753:9;5744:7;5740:23;5736:32;5733:2;;;5786:6;5778;5771:22;5733:2;5830:9;5817:23;5849:30;5873:5;5849:30;:::i;5914:259::-;5983:6;6036:2;6024:9;6015:7;6011:23;6007:32;6004:2;;;6057:6;6049;6042:22;6004:2;6094:9;6088:16;6113:30;6137:5;6113:30;:::i;6178:809::-;6247:6;6278:2;6321;6309:9;6300:7;6296:23;6292:32;6289:2;;;6342:6;6334;6327:22;6289:2;6387:9;6374:23;-1:-1:-1;;;;;6457:2:1;6449:6;6446:14;6443:2;;;6478:6;6470;6463:22;6443:2;6521:6;6510:9;6506:22;6496:32;;6566:7;6559:4;6555:2;6551:13;6547:27;6537:2;;6593:6;6585;6578:22;6537:2;6634;6621:16;6656:2;6652;6649:10;6646:2;;;6662:18;;:::i;:::-;6704:53;6747:2;6728:13;;-1:-1:-1;;6724:27:1;6720:36;;6704:53;:::i;:::-;6691:66;;6780:2;6773:5;6766:17;6820:7;6815:2;6810;6806;6802:11;6798:20;6795:33;6792:2;;;6846:6;6838;6831:22;6792:2;6906;6901;6897;6893:11;6888:2;6881:5;6877:14;6864:45;6929:14;;6925:23;;;6918:39;;;;6933:5;6258:729;-1:-1:-1;;;6258:729:1:o;6992:190::-;7051:6;7104:2;7092:9;7083:7;7079:23;7075:32;7072:2;;;7125:6;7117;7110:22;7072:2;-1:-1:-1;7153:23:1;;7062:120;-1:-1:-1;7062:120:1:o;7187:194::-;7257:6;7310:2;7298:9;7289:7;7285:23;7281:32;7278:2;;;7331:6;7323;7316:22;7278:2;-1:-1:-1;7359:16:1;;7268:113;-1:-1:-1;7268:113:1:o;7386:325::-;7454:6;7462;7515:2;7503:9;7494:7;7490:23;7486:32;7483:2;;;7536:6;7528;7521:22;7483:2;7577:9;7564:23;7554:33;;7637:2;7626:9;7622:18;7609:32;7650:31;7675:5;7650:31;:::i;7716:258::-;7784:6;7792;7845:2;7833:9;7824:7;7820:23;7816:32;7813:2;;;7866:6;7858;7851:22;7813:2;-1:-1:-1;;7894:23:1;;;7964:2;7949:18;;;7936:32;;-1:-1:-1;7803:171:1:o;7979:255::-;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:2;;;8140:6;8132;8125:22;8087:2;-1:-1:-1;;8168:16:1;;8224:2;8209:18;;;8203:25;8168:16;;8203:25;;-1:-1:-1;8077:157:1:o;8239:463::-;8292:3;8330:5;8324:12;8357:6;8352:3;8345:19;8383:4;8412:2;8407:3;8403:12;8396:19;;8449:2;8442:5;8438:14;8470:3;8482:195;8496:6;8493:1;8490:13;8482:195;;;8561:13;;-1:-1:-1;;;;;8557:39:1;8545:52;;8617:12;;;;8652:15;;;;8593:1;8511:9;8482:195;;;-1:-1:-1;8693:3:1;;8300:402;-1:-1:-1;;;;;8300:402:1:o;8707:437::-;8760:3;8798:5;8792:12;8825:6;8820:3;8813:19;8851:4;8880:2;8875:3;8871:12;8864:19;;8917:2;8910:5;8906:14;8938:3;8950:169;8964:6;8961:1;8958:13;8950:169;;;9025:13;;9013:26;;9059:12;;;;9094:15;;;;8986:1;8979:9;8950:169;;9149:185;9191:3;9229:5;9223:12;9244:52;9289:6;9284:3;9277:4;9270:5;9266:16;9244:52;:::i;:::-;9312:16;;;;;9199:135;-1:-1:-1;;9199:135:1:o;9339:1178::-;9515:3;9544;9579:6;9573:13;9609:3;9631:1;9659:9;9655:2;9651:18;9641:28;;9719:2;9708:9;9704:18;9741;9731:2;;9785:4;9777:6;9773:17;9763:27;;9731:2;9811;9859;9851:6;9848:14;9828:18;9825:38;9822:2;;;-1:-1:-1;;;9886:33:1;;9942:4;9939:1;9932:15;9972:4;9893:3;9960:17;9822:2;10003:18;10030:104;;;;10148:1;10143:322;;;;9996:469;;10030:104;-1:-1:-1;;10063:24:1;;10051:37;;10108:16;;;;-1:-1:-1;10030:104:1;;10143:322;16457:4;16476:17;;;16526:4;16510:21;;10238:3;10254:165;10268:6;10265:1;10262:13;10254:165;;;10346:14;;10333:11;;;10326:35;10389:16;;;;10283:10;;10254:165;;;10258:3;;10448:6;10443:3;10439:16;10432:23;;9996:469;;;;;;;10481:30;10507:3;10499:6;10481:30;:::i;:::-;10474:37;9523:994;-1:-1:-1;;;;;9523:994:1:o;10730:665::-;-1:-1:-1;;;;;11009:15:1;;;10991:34;;11061:15;;11056:2;11041:18;;11034:43;11108:2;11093:18;;11086:34;;;11156:3;11151:2;11136:18;;11129:31;;;11176:19;;11169:35;;;10934:4;11197:6;11247;10971:3;11226:19;;11213:49;11282:22;;;11306:3;11278:32;;;11271:46;;;;11378:2;11357:15;;;-1:-1:-1;;11353:29:1;11338:45;11334:55;;10943:452;-1:-1:-1;;;;10943:452:1:o;12531:465::-;12788:2;12777:9;12770:21;12751:4;12814:56;12866:2;12855:9;12851:18;12843:6;12814:56;:::i;:::-;12918:9;12910:6;12906:22;12901:2;12890:9;12886:18;12879:50;12946:44;12983:6;12975;12946:44;:::i;13001:261::-;13180:2;13169:9;13162:21;13143:4;13200:56;13252:2;13241:9;13237:18;13229:6;13200:56;:::i;13666:383::-;13815:2;13804:9;13797:21;13778:4;13847:6;13841:13;13890:6;13885:2;13874:9;13870:18;13863:34;13906:66;13965:6;13960:2;13949:9;13945:18;13940:2;13932:6;13928:15;13906:66;:::i;:::-;14033:2;14012:15;-1:-1:-1;;14008:29:1;13993:45;;;;14040:2;13989:54;;13787:262;-1:-1:-1;;13787:262:1:o;15317:620::-;15636:6;15625:9;15618:25;15679:6;15674:2;15663:9;15659:18;15652:34;15722:6;15717:2;15706:9;15702:18;15695:34;15765:6;15760:2;15749:9;15745:18;15738:34;15809:6;15803:3;15792:9;15788:19;15781:35;15853:3;15847;15836:9;15832:19;15825:32;15599:4;15874:57;15926:3;15915:9;15911:19;15903:6;15874:57;:::i;:::-;15866:65;15608:329;-1:-1:-1;;;;;;;;15608:329:1:o;15942:275::-;16013:2;16007:9;16078:2;16059:13;;-1:-1:-1;;16055:27:1;16043:40;;-1:-1:-1;;;;;16098:34:1;;16134:22;;;16095:62;16092:2;;;16160:18;;:::i;:::-;16196:2;16189:22;15987:230;;-1:-1:-1;15987:230:1:o;16222:183::-;16282:4;-1:-1:-1;;;;;16307:6:1;16304:30;16301:2;;;16337:18;;:::i;:::-;-1:-1:-1;16382:1:1;16378:14;16394:4;16374:25;;16291:114::o;16542:128::-;16582:3;16613:1;16609:6;16606:1;16603:13;16600:2;;;16619:18;;:::i;:::-;-1:-1:-1;16655:9:1;;16590:80::o;16675:120::-;16715:1;16741;16731:2;;16746:18;;:::i;:::-;-1:-1:-1;16780:9:1;;16721:74::o;16800:168::-;16840:7;16906:1;16902;16898:6;16894:14;16891:1;16888:21;16883:1;16876:9;16869:17;16865:45;16862:2;;;16913:18;;:::i;:::-;-1:-1:-1;16953:9:1;;16852:116::o;16973:125::-;17013:4;17041:1;17038;17035:8;17032:2;;;17046:18;;:::i;:::-;-1:-1:-1;17083:9:1;;17022:76::o;17103:258::-;17175:1;17185:113;17199:6;17196:1;17193:13;17185:113;;;17275:11;;;17269:18;17256:11;;;17249:39;17221:2;17214:10;17185:113;;;17316:6;17313:1;17310:13;17307:2;;;17351:1;17342:6;17337:3;17333:16;17326:27;17307:2;;17156:205;;;:::o;17366:380::-;17445:1;17441:12;;;;17488;;;17509:2;;17563:4;17555:6;17551:17;17541:27;;17509:2;17616;17608:6;17605:14;17585:18;17582:38;17579:2;;;17662:10;17657:3;17653:20;17650:1;17643:31;17697:4;17694:1;17687:15;17725:4;17722:1;17715:15;17751:135;17790:3;-1:-1:-1;;17811:17:1;;17808:2;;;17831:18;;:::i;:::-;-1:-1:-1;17878:1:1;17867:13;;17798:88::o;17891:112::-;17923:1;17949;17939:2;;17954:18;;:::i;:::-;-1:-1:-1;17988:9:1;;17929:74::o;18008:127::-;18069:10;18064:3;18060:20;18057:1;18050:31;18100:4;18097:1;18090:15;18124:4;18121:1;18114:15;18140:127;18201:10;18196:3;18192:20;18189:1;18182:31;18232:4;18229:1;18222:15;18256:4;18253:1;18246:15;18272:127;18333:10;18328:3;18324:20;18321:1;18314:31;18364:4;18361:1;18354:15;18388:4;18385:1;18378:15;18404:131;-1:-1:-1;;;;;18479:31:1;;18469:42;;18459:2;;18525:1;18522;18515:12;18459:2;18449:86;:::o;18540:131::-;-1:-1:-1;;;;;;18614:32:1;;18604:43;;18594:2;;18661:1;18658;18651:12

Swarm Source

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