Contract 0x3045d1A840364c3657b8Df6c6F86a4359c23472B 2

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6e0bf8b74281bd9c0e981ebee09cf9da8a6b99f3f740e1482d636b07c308edafApprove130527052021-11-29 15:08:047 mins ago0xef3177be66dcc730627c3c1ba895c558d5818bcf IN  Orica: ORI Token0 BNB0.000311157
0x9018fda4fb7a8489d422fea225e0b90fc09dd1a81acc1c2cf6c7962986b7c1c8Transfer130523522021-11-29 14:48:3926 mins ago0x66674d43226aa1c92a0a7ab6a2cc421cb9948bb3 IN  Orica: ORI Token0 BNB0.00012296
0x4a92eebaedd740c4be2fe7fed55642c072ee95ba2276b2e7be8cd293bd111734Approve130514042021-11-29 13:57:101 hr 18 mins ago0x90f479e18f76bd27446d4f6ca059c0d58826c758 IN  Orica: ORI Token0 BNB0.000222255
0x0d5d2ce6de14d486b2afd292fcd5b5efeca2a3359eac7c85afe1a74be5e48396Approve130513062021-11-29 13:51:291 hr 23 mins ago0x1a315137c32dd754c19a73694859b3234cdafe8f IN  Orica: ORI Token0 BNB0.000222255
0xce3981000dec3e7fa676c7299f86738492c26ccdff4cc25295de7193265836acTransfer130512402021-11-29 13:47:231 hr 27 mins ago0x7ab602d2e9854b050cc0c258e326ab27d47da8f2 IN  Orica: ORI Token0 BNB0.00012302
0x6ca52ff8c153a7ff7c32c5c03ae699260df6bc4eb2e5086c0dc30d0b0ee01171Transfer130511922021-11-29 13:44:271 hr 30 mins ago0x7ab602d2e9854b050cc0c258e326ab27d47da8f2 IN  Orica: ORI Token0 BNB0.00012302
0x2dbda47f46719357a2c2a5e1d28fbdcf3639bd8eafeff97a0aede046ba3494fcApprove130487612021-11-29 11:24:053 hrs 51 mins ago0x3696f337fff2aac978dee9090baf0ef7dacc2f44 IN  Orica: ORI Token0 BNB0.000222255
0x2f242f52804a6e5f8eb0aaaa446ef6bb13705bf010cac52c18bea050a52dba65Transfer130487002021-11-29 11:20:423 hrs 54 mins ago0x3696f337fff2aac978dee9090baf0ef7dacc2f44 IN  Orica: ORI Token0 BNB0.00012296
0x45a0e2162021aa6cd6242088da10408ec07ddfac6405e3b6819ac94010f8dcfcTransfer130486842021-11-29 11:19:473 hrs 55 mins ago0x3696f337fff2aac978dee9090baf0ef7dacc2f44 IN  Orica: ORI Token0 BNB0.00012296
0x1a45a852c2685aaa8326453c3889dcbffdaf46893055385fea60e53b6a1ced85Transfer130486332021-11-29 11:17:053 hrs 58 mins ago0x3696f337fff2aac978dee9090baf0ef7dacc2f44 IN  Orica: ORI Token0 BNB0.00012296
0xc8f440f97f33fffc1fb0b06f8e5ce17a59ed166748d94c01a872d268ce05c08dApprove130485302021-11-29 11:11:394 hrs 3 mins ago0xb11ece2bb1ee21debe02582db55be8e2b4712869 IN  Orica: ORI Token0 BNB0.000146535
0xfc838e9fe97ace710dec59fbbb1d7bb6dde31e47fa6e142a1d4434e74e394ad5Approve130484042021-11-29 11:04:294 hrs 10 mins ago0xb11ece2bb1ee21debe02582db55be8e2b4712869 IN  Orica: ORI Token0 BNB0.000146535
0x3aac420d87cd304beac8bd71d2f04af07ef6399e78eaf5d25d3bbc25ba2b6adbApprove130480792021-11-29 10:46:334 hrs 28 mins ago0x7d5fd7d8945836fb63232d6ca4a6c9352dfa1622 IN  Orica: ORI Token0 BNB0.000222255
0xe088922a5b7d76da479d664cf25375edcea8e0cb952fe6be8d3a24262082264bApprove130480722021-11-29 10:46:104 hrs 29 mins ago0xd7a99b289940ae21e3861d694e9e502c99621e5e IN  Orica: ORI Token0 BNB0.000222255
0xac239c357d3f3a3abe0801ce24f0bb2557c310f716cf70b1b319c06432c98dfdTransfer From130477762021-11-29 10:27:314 hrs 47 mins ago0x80cdbf7fb7a4e711e0665d4c1348accc67152fb9 IN  Orica: ORI Token0 BNB0.000124875
0x611771a5337640ecaeb021f5438c320449a4427f51b18a05cdca4f872ae3e5d0Approve130476622021-11-29 10:20:244 hrs 54 mins ago0x19de81d2eac0555889899bee2da621c4fcbc0ef0 IN  Orica: ORI Token0 BNB0.000311157
0x42d0955e76c897dedc34c13dfb0d59496cc22791ae736b6e2f5a4a88c8c56fa8Approve130468642021-11-29 9:36:085 hrs 39 mins ago0xe73ad610f283991d979a2ea8704df3f7af681749 IN  Orica: ORI Token0 BNB0.000222255
0x348584c16e91ac076dc86ba8ce7a1083f08241daad18915e5acfbe55cf53fa30Transfer130464562021-11-29 9:13:456 hrs 1 min agoOrica: Deployer IN  Orica: ORI Token0 BNB0.00018586
0x1b620681e2a7c8c14b887c476694179b3b8c738cc902c060175150df074b2079Transfer130464232021-11-29 9:12:046 hrs 3 mins ago0xd9c4f2ff5668a3836a434c29180e7366ade09663 IN  Orica: ORI Token0 BNB0.0001858
0xf29ecc8dfa37c5c11fef87710533bcf6070cd64ad138e376d7fca09002a2c445Approve130461062021-11-29 8:53:256 hrs 21 mins ago0x9b8e4ba3fb75a5b05cb051b9c11db4ea78876a56 IN  Orica: ORI Token0 BNB0.000222255
0x03cd1d133fa04febf650e6030032a2db7e97960138141884f0714264ca10d75eTransfer130460182021-11-29 8:48:496 hrs 26 mins ago0x0bdf02e3421b6434b97e12fc09cbdc8315efb070 IN  Orica: ORI Token0 BNB0.00012308
0x81d6da6bd386fec4fbe59565f0f97d1710cd0ba454fc9a07a27bcec4f0873511Approve130458942021-11-29 8:41:306 hrs 33 mins ago0x90cde80eaf92e3c669d97fcdb097c78656ddd650 IN  Orica: ORI Token0 BNB0.00007267
0x847d418a8ded3bd6782e586630e89acc4748a1b89de13a9a795cdfac6d1262f6Approve130451372021-11-29 7:56:557 hrs 18 mins ago0x8195a77470e851d9d5b684c3fec95b3ca06324eb IN  Orica: ORI Token0 BNB0.000222255
0xf94925c2f6d39421f7cb11907afb7557f92459167276f96b0e97d5515f4480c9Transfer130441662021-11-29 7:03:108 hrs 12 mins ago0x57155c7c80e5b09221f1d622b8edc0953b141b59 IN  Orica: ORI Token0 BNB0.00012302
0x0d24f8dc63599febc03cf0b0989b4f508f02480b780484aa9aec4af2b31ae642Approve130435922021-11-29 6:30:348 hrs 44 mins ago0xa54a3428e07c83dc4bd430e4b0babd51b6b68c3e IN  Orica: ORI Token0 BNB0.000311157
[ Download CSV Export 

OVERVIEW

A marketplace, creating NFT for artists.

Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OricaToken

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: OricaToken.sol
/*
    Developed specially for the Orica Token.
*/
pragma solidity ^0.5.16;
import "./BEP20Token.sol";
import"./IERC721.sol";

contract OricaToken is BEP20Token{

   /*****
    *  Description:
    *  The sale of tokens begins on the specified date (Sat Aug 14 2021 00: 00: 00 GMT+0) only for users
    *  from the whitelist list. To find out whether a user belongs to this list, you need to call this mapping.
    *
    *  Parameters:
    *  user address, type - eth address.
    *
    *  Return values:
    *  bool: true - the user is included in the whitelist
    *       false - the user is not included in the whitelist
    *
    *  Note:
    *  The call does not require spending Gas.
    *****/
    mapping (address => bool) public whitelist;

   /*****
    *  1 - Owner
    *  2 - SuperAdmin
    *  3 - Admin Seed
    *  4 - Admin Presale
    *  5 - Admin Team
    *  6 - Admin Advisors
    *  7 - Pool - only admin presale
    *****/
    mapping (address => uint) public roles;

    bool public is_presale_enable;

    mapping (address => uint) public seed_group;
    uint public seed_amount;

    mapping (address => frozen_tokens) public presale_group;

    mapping (address => frozen_tokens) public team_group;
    uint public team_amount;

    mapping (address => uint) public advisors_group;
    uint public advisors_amount;

   /*****
    *  AUXILIARY
    *  Lists of users who have bought tokens for a particular group
    *****/
    address[] seed_users;
    mapping (address => bool) internal _is_seed_user;
    address[] presale_users;
    mapping (address => bool) internal _is_presale_user;
    address[] team_users;
    mapping (address => bool) internal _is_team_user;
    address[] advisor_users;
    mapping (address => bool) internal _is_advisor_user;

    struct frozen_tokens{
        uint all_tokens;
        uint frozen_tokens;    // -> all_tokens
    }

   /*****
    *  Description:
    *  The percentage of unfrozen tokens to the total number of purchased tokens at this stage.
    *  Shows the total share of unlocked Presale tokens for all users.
    *
    *  Return values:
    *  Percentage of unlocked tokens, type-uint.
    *
    *  Note:
    *  The call does not require spending Gas.
    *****/
    uint public allowed_presale;
    uint public allowed_team;
    uint public deadline_for_whitelist;

    uint constant private Aug142021 = 1628899200;
    uint constant private Aug282021 = 1630108800;
    uint constant private Sep12021 = 1630454400;
    uint constant private Oct12021 = 1633046400;
    uint constant private Nov12021 = 1635724800;
    uint constant private Dec12021 = 1638316800;
    uint constant private Jan12022 = 1640995200;
    uint constant private Feb12022 = 1643673600;
    uint constant private Mar12022 = 1646092800;
    uint constant private Sep12022 = 1661990400;
    uint constant private Oct12022 = 1664582400;
    uint constant private Nov12022 = 1667260800;
    uint constant private Dec12022 = 1669852800;
    uint constant private Jan12023 = 1672531200;
    uint constant private Feb12023 = 1675209600;
    uint constant private Mar12023 = 1677628800;

    uint private _timetamp_last_block;

   /*****
    *  Auxiliary function
    *
    *  Prevents the contract from  overloading at the point in time
    *****/
    modifier checkTimestamp(){
        require(_timetamp_last_block < now, "Invalid block timestamp");
        _timetamp_last_block = now;
        _;
    }

   /*****
    *  Auxiliary modifiers
    *
    *  Description:
    *  Checking the role compliance
    *
    *  Requirement:
    *  Successful for the token owner, the system administrator and the administrator of the specified group
    *****/
    modifier onlySuperAdmin(){
        require(roles[msg.sender] == 2 || roles[msg.sender] == 1, "You are not SuperAdmin");
        _;
    }

    modifier onlyAdminSeed(){
        require(roles[msg.sender] == 3 || roles[msg.sender] == 2 || roles[msg.sender] == 1, "You are not Seed Admin");
        _;
    }

    modifier onlyAdminPresale(){
        require(_isAdminPresale(msg.sender), "You are not Presale Admin");
        _;
    }

    modifier onlyAdminTeam(){
        require(roles[msg.sender] == 5 || roles[msg.sender] == 2 || roles[msg.sender] == 1, "You are not Team Admin");
        _;
    }

    modifier onlyAdminAdvisors(){
        require(roles[msg.sender] == 6 || roles[msg.sender] == 2 || roles[msg.sender] == 1, "You are not Advisors Admin");
        _;
    }

    modifier nonZeroAmount(uint amount){
        require(amount > 0, "Amount must be non zero.");
        _;
    }
   /*****
    *  Description:
    *  Initializing values
    *
    *  Note:
    *  The contract owner becomes the owner of the tokens.
    *  The starting number of tokens for groups is specified
    *  Specified deadline for the closed sale of tokens in Presale group - Sun Aug 15 2021 00:00:00 GMT+0
    *****/
    constructor() public{
        seed_amount = 5000000000000000000000000;
        team_amount = 15000000000000000000000000;
        advisors_amount = 10000000000000000000000000;

        deadline_for_whitelist = Aug142021 + 1 days;

        _timetamp_last_block = now;

        roles[msg.sender] = 1;
    }

   /*****
    *  Description:
    *  Checking the role compliance
    *
    *  Parameters:
    *  addr – the address of the user, type - eth address
    *
    *  Requirement:
    *  Successful for the token owner, System Administrator, Presale Group Administrator, as well as for the pool
    *
    *  Return values:
    *  true - if the the user has necessary access,
    *  false - if hasn't
    *****/
    function _isAdminPresale(address addr) internal view returns (bool) {
        return roles[addr] == 4 || roles[addr] == 2 || roles[addr] == 1 || roles[addr] == 7;
    }

   /*****
    *  Description:
    *  A list of users of the Seed group.
    *
    *  Return values:
    *  array of addresses - an array of addresses of buyers of the Seed group.
    ******/
    function getSeedUsers() public view returns(address[] memory){
        return seed_users;
    }

   /*****
    *  Description:
    *  List of users who bought tokens during the Presale phase
    *
    *  Return values:
    *  array of addresses - an array of addresses of Presale group buyers.
    *
    *  Note:
    *  The array may contain duplicate values if the tokens were issued to the user several times.
    *  The call does not require spending Gas.
    *****/
    function getPresaleUsers() public view returns(address[] memory){
        return presale_users;
    }

   /*****
    *  Description:
    *  A list of Team Group users.
    *
    *  Return values:
    *  array of addresses - an array of addresses of buyers of the Team group.
    *
    *  Note:
    *  The array may contain duplicate values if the tokens were issued to the user several times. The call does not require spending Gas.
    *****/
    function getTeamUsers() public view returns(address[] memory){
        return team_users;
    }

   /*****
    *  Description:
    *  List of Advisors group users.
    *
    *  Return values:
    *  array of addresses - an array of addresses of the group's Advisors buyers.
    *
    *  Note:
    *  The array may contain duplicate values if the tokens were issued to the user several times.
    *  The call does not require spending Gas.
    *
    *  Return values:
    *  all_token - the total number of tokens purchased, type - uint;
    *  free_token - unfrozen number of tokens, type - uint.
    *
    *  Note:
    *  The call does not require spending Gas.
    *****/
    function getAdvisorsUsers() public view returns(address[] memory){
        return advisor_users;
    }

   /*****
    *  Description:
    *  Issues tokens to the buyer of the Seed group. Tokens are available for spending as soon as the transaction is completed.
    *
    *  Parameters:
    *  recipient - the recipient of the Seed token, type - eth address;
    *  amount - the number of tokens issued, type - uint.
    *
    *  Requirements:
    *  The number of tokens issued is greater than 0;
    *  The number of tokens issued does not exceed the number of available tokens for this group.
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The method can be called again for a specific address, the number of tokens will be added to the one already entered.
    *  The method can only be called by the token owner or the system administrator or the administrator of the Seed group.
    *  When the method is executed, the number of available tokens for issuing will be reduced.
    *****/
    function addMoneySeed(address recipient, uint amount) public onlyAdminSeed checkTimestamp nonZeroAmount(amount) returns(bool){
        require(amount <= seed_amount, "Exceeding the available number of tokens");

        if (!_is_seed_user[recipient]){
            _is_seed_user[recipient] = true;
            seed_users.push(recipient);
        }

        seed_group[recipient] += amount;
        seed_amount -= amount;
        super._transfer(owner(), recipient, amount);

        return true;
    }

   /*****
    *  Description:
    *  Issues tokens to the user and immediately freezes them.
    *
    *  Parameters:
    *  recipient – the address of the token buyer, type - eth address
    *  amount – the number of tokens sold, type-uint
    *
    *  Requirements:
    *  The number of tokens sold must be greater than zero;
    *  The Presale stage is enabled;
    *  The sale is only possible during the period from Sat Aug 14 2021 00:00:00 GMT+0 to Wed Sep 01 2021 00:00:00 GMT+0;
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The Presale tokens of the group are issued by the Pool using the transfer () function. Manually calling this method is only necessary in an emergency.
    *****/
    function addMoneyPresale(address recipient, uint amount) public onlyAdminPresale checkTimestamp nonZeroAmount(amount) returns(bool){
        require(is_presale_enable, "The sale was forcibly terminated");

        require(now >= Aug142021, "The purchase of a token for the Presale stage is not available. Too early.");

        require(now < Sep12021, "The purchase of a token for the Presale stage is not available. Too late.");

        if (now < deadline_for_whitelist){
            require(whitelist[recipient], "Free presale not yet authorized");
        }

        if (!_is_presale_user[recipient]){
            _is_presale_user[recipient] = true;
            presale_users.push(recipient);
        }

        presale_group[recipient].all_tokens += amount;
        presale_group[recipient].frozen_tokens = presale_group[recipient].all_tokens;
        super._transfer(msg.sender, owner(), amount);

        return true;
    }

   /*****
    *  Description:
    *  Opens a new Presale stage, unlocking tokens for all users for a specified percentage.
    *
    *  Parameters:
    *  increase_percentage – the number of defrosted percentages, type - uint
    *
    *  Requirements:
    *  Unblocking takes place starting from September 1, 2021, 00:00 GMT+0.
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The unlocked tokens go to the general user account available for spending.
    *****/
    function openNextPresaleStage(uint increase_percentage) public onlyAdminPresale checkTimestamp returns(bool){
        // Right time is September 1, 2021
        require(now >= Sep12021, "Not available for spending. It's too early.");
        require(allowed_presale + increase_percentage <= 100, "More then 100 percent");
        uint new_percentage = increase_percentage + allowed_presale;
        //25 = 15 + 10
        for (uint i=0; i < presale_users.length; i++) {
            int256 new_token = int256(presale_group[presale_users[i]].all_tokens * new_percentage / 100 - (presale_group[presale_users[i]].all_tokens - presale_group[presale_users[i]].frozen_tokens));
            //15 = 24 - 9
            if (new_token <= 0){
                continue;
            }
            presale_group[presale_users[i]].frozen_tokens -= uint(new_token);
            super._transfer(owner(), presale_users[i], uint(new_token));
        }
        allowed_presale += increase_percentage;
        return true;
    }

   /*****
    *  Description:
    *  Launches the sale of Presale group tokens.
    *
    *  Requirements:
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *****/
    function startPresale() public onlyAdminPresale checkTimestamp returns(bool) {
        is_presale_enable = true;
        return true;
    }

   /*****
    *  Description:
    *  Stops the sale of Presale group tokens .
    *
    *  Requirements:
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *****/
    function stopPresale() public onlyAdminPresale checkTimestamp returns(bool) {
        is_presale_enable = false;
        return true;
    }

   /*****
    *  Description:
    *  Adds users to the Whitelist.
    *
    *  Requirements:
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Parameters:
    *  u_addr - array of user addresses to adding, type - array eth addresses[].
    *****/
    function addToWhitelist(address[] memory u_addr) public onlyAdminPresale checkTimestamp {
        for (uint i = 0; i < u_addr.length; i++){
            whitelist[u_addr[i]] = true;
        }
    }

   /*****
    *  Description:
    *  Deletes users from the Whitelist.
    *
    *  Requirements:
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Parameters:
    *  u_addr - array of user addresses to delete, type - array eth addresses[].
    *****/
    function delFromWhitelist(address[] memory u_addr) public onlyAdminPresale checkTimestamp{
        for (uint i = 0; i < u_addr.length; i++){
            whitelist[u_addr[i]] = false;
        }
    }

   /*****
    *  Description:
    *  Extends the whitelist stage by a specified number of seconds.
    *
    *  Parameters:
    *  extended_seconds - the number of seconds for which sales should be extended only for users from the whitelist list, type - uint.
    *
    *  Requirements:
    *  It is not possible to extend the Whitelist after calling the allowForAll() method;
    *  The whitelist can last no longer than two weeks (Fri Aug 27 2021 23:59:59 GMT+0)
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The Whitelist deadline is specified in UNIX Time.
    *****/
    function extendWhitelistDeadline(uint extended_seconds) public onlyAdminPresale checkTimestamp returns(bool){
        require(deadline_for_whitelist != Aug142021, "Re-launching the whitelist is not available");
        // new_deadline must be less than 2 weeks from the start
        // 14 Aug (Start Presale) + new_deadline <= 28 Aug GMT+0
        require(deadline_for_whitelist +  extended_seconds <= Aug282021, "The maximum period will be exceeded");
        deadline_for_whitelist += extended_seconds;
        return true;
    }

   /*****
    *  Description:
    *  Start of open sales. Sets the Whitelist deadline to the start of sales of the Presale group.
    *
    *  Requirements:
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *****/
    function allowForAll() public onlyAdminPresale checkTimestamp returns(bool){
        deadline_for_whitelist = Aug142021;
        return true;
    }

   /*****
    *  Team Token's group
    *
    *  Description:
    *  Issues tokens to the user and immediately freezes them.
    *
    *  Parameters:
    *  recipient – the address of the token recipient, type - eth address
    *  amount – the number of assigned tokens, type - uint
    *
    *  Requirements:
    *  The number of tokens issued must be greater than zero;
    *  The pre sale stage is enabled;
    *  Distribution is only possible until Sep 1 2022 GMT+0.
    *  The number of tokens issued cannot exceed the remaining number of Team Group tokens available for issuance.
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  Team Group tokens are issued by the Owner or admin of the Team Group.
    *****/
    function addMoneyTeam(address recipient, uint amount) public onlyAdminTeam checkTimestamp nonZeroAmount(amount) returns(bool){
        require(now < Sep12022, "Too late to add money for the team.");

        require(amount <= team_amount, "Exceeding the available number of tokens");

        if (!_is_team_user[recipient]){
            _is_team_user[recipient] = true;
            team_users.push(recipient);
        }

        team_amount -= amount;
        team_group[recipient].all_tokens += amount;
        team_group[recipient].frozen_tokens = team_group[recipient].all_tokens;

        return true;
    }

   /*****
    *    Description:
    *  Opens a new Team stage, unlocking tokens for all users for a specified percentage.
    *
    *  Parameters:
    *  increase_percentage – the number of defrosted percentages, type - uint
    *
    *  Requirements:
    *  Unblocking takes place starting from Sep 1 2022 00: 00 GMT+0.
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The unlocked tokens go to the general user account available for spending.
    *****/
    function openNextTeamStage(uint increase_percentage) public onlyAdminTeam checkTimestamp returns(bool){
        // токены недоступны до Sep 1 2022 00:00:00 GMT+0
        require(now >= Sep12022, "Not available for spending. It's too early.");
        require(allowed_team + increase_percentage <= 100, "More then 100 percent");
        uint new_percentage = increase_percentage + allowed_team;
        //25 = 15 + 10
        for (uint i = 0; i < team_users.length; i++) {
            int256 new_token = int256(team_group[team_users[i]].all_tokens * new_percentage / 100 - (team_group[team_users[i]].all_tokens - team_group[team_users[i]].frozen_tokens));
            if (new_token <= 0){
                continue;
            }
            team_group[team_users[i]].frozen_tokens -= uint(new_token);
            super._transfer(owner(), team_users[i], uint(new_token));
        }
        allowed_team += increase_percentage;
        return true;
    }

   /****
    *  Description:
    *  Issues tokens to the Advisors user of the group. Tokens are available for spending as soon as the transaction is completed.
    *
    *  Parameters:
    *  recipient - the recipient of the Advisors token, type - eth address;
    *  amount - the number of tokens issued, type - uint.
    *
    *  Requirements:
    *  The number of tokens issued is greater than 0;
    *  The number of tokens issued does not exceed the number of available tokens for this group.
    *  The method can only be called by the token owner or the system administrator or the administrator of this group.
    *
    *  Return values:
    *  true - if the function was executed correctly.
    *
    *  Note:
    *  The method can be called again for a specific address, the number of tokens will be added to the one already entered.
    *  When the method is executed, the number of available tokens for issuing will be reduced.
    ****/
    function awardAdvisors(address recipient, uint amount) public onlyAdminAdvisors checkTimestamp nonZeroAmount(amount) returns(bool){
        require(advisors_amount >= amount, "Exceeding the available number of tokens");

        if(!_is_advisor_user[recipient]){
            _is_advisor_user[recipient] = true;
            advisor_users.push(recipient);
        }
        advisors_amount -= amount;
        advisors_group[recipient] += amount;
        super._transfer(owner(), recipient, amount);
        return true;
    }

   /****
    *  Description: Burns the available (unlocked) tokens from the user.
    *
    *  Parameters:
    *  amount - the number of tokens to be burned, type - uint.
    *
    *  Note:
    *  Tokens are burned from the user on whose behalf the function is called. Total Supply is reduced by the number of tokens burned.
    ****/
    function burn(uint amount) public {
        _burn(msg.sender, amount);
    }

    /*****
    *  Description: Burns the unavailable (locked) tokens from the user Presale balance.
    *
    *  Parameters:
    *  amount - the number of tokens to be burned, type - uint.
    *
    *  Note:
    *  Tokens are burned from the user on whose behalf the function is called. Total Supply is reduced by the number of tokens burned.
    */

    function burnPresaleTokens(uint amount) public {
        require(presale_group[msg.sender].frozen_tokens - amount >= 0, "Frozen_tokens must be non zero");
        presale_group[msg.sender].frozen_tokens -= amount;
        _burn(owner(), amount);
    }

   /*****
    *  Description: Burns the unavailable (locked) tokens from the user Team balance.
    *
    *  Parameters:
    *  amount - the number of tokens to be burned, type - uint.
    *
    *  Note:
    *  Tokens are burned from the user on whose behalf the function is called. Total Supply is reduced by the number of tokens burned.
    *****/

    function burnTeamTokens(uint amount) public {
        require(team_group[msg.sender].frozen_tokens - amount >= 0, "Frozen_tokens must be non zero");
        team_group[msg.sender].frozen_tokens -= amount;
        _burn(owner(), amount);
    }

   /*****
    *    Description:
    *   In order not to wait for the system administrators to unfreeze the tokens,
    *   the token owner can independently unfreeze his tokens for compliance with the temporary rules.
    *
    *   Requirements:
    *   The date of the function call must be later than the end of sales in the Pre sale group.
    *   The amount of tokens to unlock must be greater than zero.
    *
    *   Note:
    *   Tokens are unlocked only for the user who called this function. The amount of tokens to unlock
    *   is calculated by subtracting the amount of already unlocked tokens from the amount of tokens
    *   that should be unlocked by this moment.
    *****/

    function unlockPresaleTokens() public checkTimestamp {
        require(presale_group[msg.sender].all_tokens > 0, "You have no presale tokens");
        require(now >= Sep12021, "Too early");
        uint new_percent;
        if (now >= Sep12021){
            new_percent += 10;
        }
        if (now >= Oct12021){
            new_percent += 15;
        }
        if (now >= Nov12021){
            new_percent += 15;
        }
        if (now >= Dec12021){
            new_percent += 15;
        }
        if (now >= Jan12022){
            new_percent += 15;
        }
        if (now >= Feb12022){
            new_percent += 15;
        }
        if (now >= Mar12022){
            new_percent += 15;
        }

        int256 new_token = int256(presale_group[msg.sender].all_tokens * new_percent / 100 - (presale_group[msg.sender].all_tokens - presale_group[msg.sender].frozen_tokens));
        require(new_token > 0, "You have already received your tokens");
        presale_group[msg.sender].frozen_tokens -= uint(new_token);
        super._transfer(owner(), msg.sender, uint(new_token));
    }

   /*****
    *  Description:
    *  In order not to wait for the system administrators to unfreeze the tokens, the token owner can independently unfreeze his tokens,
    *  subject to the temporary rules.
    *
    *  Requirements:
    *  The date of the function call must be later than the end of the distribution in the Steam group.
    *  The amount of tokens to unlock must be greater than zero.
    *
    *  Note:
    *  Tokens are unlocked only for the user who called this function. The amount of tokens to unlock is calculated by subtracting
    *  the amount of already unlocked tokens from the amount of tokens that should be unlocked by this moment.
    *****/

    function unlockTeamTokens() public checkTimestamp {
        require(team_group[msg.sender].all_tokens > 0, "You have no presale tokens");
        require(now >= Sep12022, "Too early");
        uint new_percent;
        if (now >= Sep12022){
            new_percent += 10;
        }
        if (now >= Oct12022){
            new_percent += 15;
        }
        if (now >= Nov12022){
            new_percent += 15;
        }
        if (now >= Dec12022){
            new_percent += 15;
        }
        if (now >= Jan12023){
            new_percent += 15;
        }
        if (now >= Feb12023){
            new_percent += 15;
        }
        if (now >= Mar12023){
            new_percent += 15;
        }

        int256 new_token = int256(team_group[msg.sender].all_tokens * new_percent / 100 - (team_group[msg.sender].all_tokens - team_group[msg.sender].frozen_tokens));
        require(new_token > 0, "You have already received your tokens");
        team_group[msg.sender].frozen_tokens -= uint(new_token);
        super._transfer(owner(), msg.sender, uint(new_token));
    }

   /*****
    *  Description:
    *  Changes the user role
    *
    *  Parameters:
    *  u_addr - the user to whom the role is being changed, type - eth address;
    *  role - the code of the new role, type - uint.
    *
    *  Requirements:
    *  The role code is specified in accordance with the codes with the designation;
    *  The method can only be called by the token owner.
    *****/

    function setRole(address u_addr, uint role) public onlyOwner{
        roles[u_addr] = role;
    }

   /*****
    *   Description: Checks the roles of the sender and recipient of tokens.
    *   If the sender is a Pool (role-7), and the recipient is a user (role - 0): The addMoneyPresale () method is called,
    *   which freezes the tokens from the recipient. The number of purchased tokens is transferred  from the Pool address
    *   to the address of the Token Owner.
    *   Otherwise: Transfers tokens from one address to another, reducing their number and the sender and increasing the recipient.
    *
    *   Parameters:
    *   recipient - the address of the token recipient, type - eth address;
    *   amount - the number of tokens to be sent, type - uint.
    *
    *   Requirements:
    *   The sender and recipient addresses must not be null (0x00000000...).
    *
    *   Note:
    *   The purchase of tokens is realized by calling this function and transmitting
    *   the buyer's address on behalf of the administrator of a specific group.
    *   The function may return an execution error if an error occurred in the addMoneyPresale () function.
    *****/
    function _transfer(address sender, address recipient, uint256 amount) internal {
        if(roles[sender] == 7 && !_isAdminPresale(recipient)) {
            addMoneyPresale(recipient, amount);
        }
        else {
            super._transfer(sender, recipient, amount);
        }
    }

   /*****
    *  Description: Returns the available and frozen balance of ORI tokens.
    *  Parameters:
    *  account - the user's address, type - eth address.
    *
    *  Return values:
    *  balance – available and frozen balance of ORI tokens, type - uint.
    *
    *  Note:
    *  The balance is returned taking into account 18 decimal places. 1 ORI Token – 1 * 10^18 of the balance.
    *  The call does not require spending Gas.
    *****/
    function balanceOf(address account) public view returns (uint){
        return BEP20Token.balanceOf(account) + presale_group[account].frozen_tokens + team_group[account].frozen_tokens;
    }

    function contractBalance() external view onlyOwner returns(uint){
        return(address(this).balance);
    }

    function resetContractBalance() external onlyOwner nonZeroAmount(address(this).balance){
        owner().transfer(address(this).balance);
    }

    function externalApprove(address contractAddress, bool isNft) onlyOwner public
    {
        externalApproveTo(contractAddress, isNft, owner());
    }


    function externalApproveTo(address contractAddress, bool isNft, address spender) onlyOwner public
    {
        if(isNft) {
            IERC721(contractAddress).setApprovalForAll(spender, true);
            return;
        }
        BEP20Token(contractAddress).approve(spender, uint(-1));
    }
}

File 2 of 3: BEP20Token.sol
pragma solidity >=0.5.16;

interface IBEP20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint8);

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory);

  /**
  * @dev Returns the token name.
  */
  function name() external view returns (string memory);

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

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

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

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

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

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

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

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

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
  // Empty internal constructor, to prevent people from mistakenly deploying
  // an instance of this contract, which should be used via inheritance.
  constructor () internal { }

  function _msgSender() internal view returns (address payable) {
    return msg.sender;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

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

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

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor () internal {
    address payable msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

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

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(_owner == _msgSender(), "Ownable: caller is not the owner");
    _;
  }

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

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address payable newOwner) public onlyOwner {
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   */
  function _transferOwnership(address payable newOwner) internal {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

contract BEP20Token is Context, IBEP20, Ownable {
  using SafeMath for uint256;

  mapping (address => uint256) private _balances;

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

  uint256 private _totalSupply;
  uint8 private _decimals;
  string private _symbol;
  string private _name;

  constructor() public {
    _name = "Orica";
    _symbol = "ORI";
    _decimals = 18;
    _totalSupply = 100000000000000000000000000;
    _balances[msg.sender] = _totalSupply;

    emit Transfer(address(0), msg.sender, _totalSupply);
  }

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address) {
    return owner();
  }

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint8) {
    return _decimals;
  }

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory) {
    return _symbol;
  }

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

  /**
   * @dev See {BEP20-totalSupply}.
   */
  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

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

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

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

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

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

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

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

  /**
   * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
   * the total supply.
   *
   * Requirements
   *
   * - `msg.sender` must be the token owner
   */
  function mint(uint256 amount) public onlyOwner returns (bool) {
    _mint(_msgSender(), amount);
    return true;
  }

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

    _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance or tokens are still locked");
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

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

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

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

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

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

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

  /**
   * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
   * from the caller's allowance.
   *
   * See {_burn} and {_approve}.
   */
  function _burnFrom(address account, uint256 amount) internal {
    _burn(account, amount);
    _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance"));
  }
}

File 3 of 3: IERC721.sol
pragma solidity ^0.5.0;

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addMoneyPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addMoneySeed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addMoneyTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"u_addr","type":"address[]"}],"name":"addToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"advisors_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"advisors_group","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"allowForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allowed_presale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allowed_team","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"awardAdvisors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnPresaleTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTeamTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deadline_for_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"u_addr","type":"address[]"}],"name":"delFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"extended_seconds","type":"uint256"}],"name":"extendWhitelistDeadline","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"isNft","type":"bool"}],"name":"externalApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"isNft","type":"bool"},{"internalType":"address","name":"spender","type":"address"}],"name":"externalApproveTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAdvisorsUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPresaleUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSeedUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTeamUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"is_presale_enable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"increase_percentage","type":"uint256"}],"name":"openNextPresaleStage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"increase_percentage","type":"uint256"}],"name":"openNextTeamStage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presale_group","outputs":[{"internalType":"uint256","name":"all_tokens","type":"uint256"},{"internalType":"uint256","name":"frozen_tokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"resetContractBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"roles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"seed_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"seed_group","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"u_addr","type":"address"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"setRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"startPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stopPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"team_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"team_group","outputs":[{"internalType":"uint256","name":"all_tokens","type":"uint256"},{"internalType":"uint256","name":"frozen_tokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockPresaleTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockTeamTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506000620000276001600160e01b036200018616565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604080518082019091526005808252644f7269636160d81b60209092019182526200009f916006916200018b565b50604080518082019091526003808252624f524960e81b6020909201918252620000cc916005916200018b565b506004805460ff191660121790556a52b7d2dcc80cd2e40000006003819055336000818152600160209081526040808320859055805194855251929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a36a0422ca8b0a00a425000000600b556a0c685fa11e01ec6f000000600e556a084595161401484a0000006010556361185900601b5542601c55336000908152600860205260409020600190556200022d565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001ce57805160ff1916838001178555620001fe565b82800160010185558215620001fe579182015b82811115620001fe578251825591602001919060010190620001e1565b506200020c92915062000210565b5090565b6200018891905b808211156200020c576000815560010162000217565b6137d5806200023d6000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c80638b7afe2e116101d3578063b70caee811610104578063dd62ed3e116100a2578063ee4c36431161007c578063ee4c364314610a53578063ef81cc4314610a81578063f2fde38b14610aad578063f638ef1314610ad35761035d565b8063dd62ed3e14610a15578063e2130d1e14610a43578063e27a66ce14610a4b5761035d565b8063ca5b16f6116100de578063ca5b16f614610970578063cfacf51a146109af578063d1bcdaad146109b7578063d3940d0c146109ef5761035d565b8063b70caee814610925578063b94e2b6f1461094b578063c963f3a4146109535761035d565b8063a0712d6811610171578063a54bb5121161014b578063a54bb512146108cc578063a9059cbb146108d4578063aafb6c6414610900578063ae5ce92a146109085761035d565b8063a0712d681461087b578063a0ad6ce414610898578063a457c2d7146108a05761035d565b806395d89b41116101ad57806395d89b411461080a57806399374642146108125780639b19251a146108385780639bb8a8051461085e5761035d565b80638b7afe2e146107f25780638da5cb5b146107fa57806392b3000f146108025761035d565b806339509351116102ad578063715018a61161024b5780637e379ecc116102255780637e379ecc146106e25780637f649783146106ff578063839fca1c146107a2578063893d20e8146107ce5761035d565b8063715018a6146106a657806372dfb6c3146106ae57806374277a63146106b65761035d565b806343a9ed1c1161028757806343a9ed1c146105b8578063547a66f7146105c05780636a016ea5146105dd57806370a08231146106805761035d565b806339509351146105175780633b1a99881461054357806342966c681461059b5761035d565b80631ad2ad1a1161031a578063313ce567116102f4578063313ce567146104bd5780633156a354146104db5780633790a2bc1461050757806337f969cd1461050f5761035d565b80631ad2ad1a1461047557806323b872dd1461047d578063241ede01146104b35761035d565b806304c98b2b1461036257806306fdde031461037e578063095ea7b3146103fb5780630d3c4678146104275780631177c63f1461045357806318160ddd1461045b575b600080fd5b61036a610af9565b604080519115158252519081900360200190f35b610386610b9f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c05781810151838201526020016103a8565b50505050905090810190601f1680156103ed5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036a6004803603604081101561041157600080fd5b506001600160a01b038135169060200135610c35565b61036a6004803603604081101561043d57600080fd5b506001600160a01b038135169060200135610c52565b61036a610eab565b610463610eb4565b60408051918252519081900360200190f35b61036a610eba565b61036a6004803603606081101561049357600080fd5b506001600160a01b03813581169160208101359091169060400135610f5c565b6104bb610fe9565b005b6104c56111d3565b6040805160ff9092168252519081900360200190f35b61036a600480360360408110156104f157600080fd5b506001600160a01b0381351690602001356111dc565b6104bb6114bf565b61046361159b565b61036a6004803603604081101561052d57600080fd5b506001600160a01b0381351690602001356115a1565b61054b6115f5565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561058757818101518382015260200161056f565b505050509050019250505060405180910390f35b6104bb600480360360208110156105b157600080fd5b5035611656565b610463611663565b61036a600480360360208110156105d657600080fd5b5035611669565b6104bb600480360360208110156105f357600080fd5b81019060208101813564010000000081111561060e57600080fd5b82018360208201111561062057600080fd5b8035906020019184602083028401116401000000008311171561064257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061195f945050505050565b6104636004803603602081101561069657600080fd5b50356001600160a01b0316611a47565b6104bb611a83565b610463611b25565b6104bb600480360360408110156106cc57600080fd5b506001600160a01b038135169060200135611b2b565b6104bb600480360360208110156106f857600080fd5b5035611b9f565b6104bb6004803603602081101561071557600080fd5b81019060208101813564010000000081111561073057600080fd5b82018360208201111561074257600080fd5b8035906020019184602083028401116401000000008311171561076457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611bc9945050505050565b61036a600480360360408110156107b857600080fd5b506001600160a01b038135169060200135611cb1565b6107d6611ecb565b604080516001600160a01b039092168252519081900360200190f35b610463611eda565b6107d6611f39565b610463611f48565b610386611f4e565b6104636004803603602081101561082857600080fd5b50356001600160a01b0316611faf565b61036a6004803603602081101561084e57600080fd5b50356001600160a01b0316611fc1565b6104bb6004803603602081101561087457600080fd5b5035611fd6565b61036a6004803603602081101561089157600080fd5b5035611ffa565b61046361206d565b61036a600480360360408110156108b657600080fd5b506001600160a01b038135169060200135612073565b61036a6120e1565b61036a600480360360408110156108ea57600080fd5b506001600160a01b038135169060200135612181565b61054b612195565b61036a6004803603602081101561091e57600080fd5b50356121f5565b6104636004803603602081101561093b57600080fd5b50356001600160a01b0316612323565b61054b612335565b61036a6004803603602081101561096957600080fd5b5035612395565b6109966004803603602081101561098657600080fd5b50356001600160a01b0316612629565b6040805192835260208301919091528051918290030190f35b61054b612642565b6104bb600480360360608110156109cd57600080fd5b506001600160a01b0381358116916020810135151591604090910135166126a2565b61099660048036036020811015610a0557600080fd5b50356001600160a01b03166127f5565b61046360048036036040811015610a2b57600080fd5b506001600160a01b038135811691602001351661280e565b6104bb612839565b610463612a18565b6104bb60048036036040811015610a6957600080fd5b506001600160a01b0381351690602001351515612a1e565b61036a60048036036040811015610a9757600080fd5b506001600160a01b038135169060200135612a88565b6104bb60048036036020811015610ac357600080fd5b50356001600160a01b0316612ca2565b61046360048036036020811015610ae957600080fd5b50356001600160a01b0316612d03565b6000610b0433612d15565b610b43576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c5410610b87576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b5042601c556009805460ff1916600190811790915590565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b5050505050905090565b6000610c49610c42612da0565b8484612da4565b50600192915050565b3360009081526008602052604081205460051480610c7f5750336000908152600860205260409020546002145b80610c995750336000908152600860205260409020546001145b610ce3576040805162461bcd60e51b81526020600482015260166024820152752cb7ba9030b932903737ba102a32b0b69020b236b4b760511b604482015290519081900360640190fd5b42601c5410610d27576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c558180610d6c576040805162461bcd60e51b81526020600482015260186024820152600080516020613420833981519152604482015290519081900360640190fd5b63630ff6004210610dae5760405162461bcd60e51b81526004018080602001828103825260238152602001806137096023913960400191505060405180910390fd5b600e54831115610def5760405162461bcd60e51b81526004018080602001828103825260288152602001806136546028913960400191505060405180910390fd5b6001600160a01b03841660009081526016602052604090205460ff16610e75576001600160a01b0384166000818152601660205260408120805460ff191660019081179091556015805491820181559091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b03191690911790555b5050600e805482900390556001600160a01b03919091166000908152600d60205260409020805490910180825560019182015590565b60095460ff1681565b60035490565b6000610ec533612d15565b610f04576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c5410610f48576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b5042601c556009805460ff19169055600190565b6000610f69848484612e90565b610fdf84610f75612da0565b610fda85604051806060016040528060288152602001613510602891396001600160a01b038a16600090815260026020526040812090610fb3612da0565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612ede16565b612da4565b5060019392505050565b42601c541061102d576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c55336000908152600c6020526040902054611092576040805162461bcd60e51b815260206004820152601a60248201527f596f752068617665206e6f2070726573616c6520746f6b656e73000000000000604482015290519081900360640190fd5b63612ec2804210156110d7576040805162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b604482015290519081900360640190fd5b600063612ec28042106110e857600a015b6361564f8042106110f757600f015b63617f2e00421061110657600f015b6361a6bb00421061111557600f015b6361cf9980421061112457600f015b6361f87800421061113357600f015b63621d6200421061114257600f015b336000908152600c602052604081206001810154905490810390606490840204039050600081136111a45760405162461bcd60e51b81526004018080602001828103825260258152602001806136046025913960400191505060405180910390fd5b336000908152600c60205260409020600101805482900390556111cf6111c8611f39565b3383612f75565b5050565b60045460ff1690565b60006111e733612d15565b611226576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c541061126a576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c5581806112af576040805162461bcd60e51b81526020600482015260186024820152600080516020613420833981519152604482015290519081900360640190fd5b60095460ff16611306576040805162461bcd60e51b815260206004820181905260248201527f5468652073616c652077617320666f726369626c79207465726d696e61746564604482015290519081900360640190fd5b63611707804210156113495760405162461bcd60e51b815260040180806020018281038252604a815260200180613757604a913960600191505060405180910390fd5b63612ec280421061138b5760405162461bcd60e51b815260040180806020018281038252604981526020018061367c6049913960600191505060405180910390fd5b601b54421015611402576001600160a01b03841660009081526007602052604090205460ff16611402576040805162461bcd60e51b815260206004820152601f60248201527f467265652070726573616c65206e6f742079657420617574686f72697a656400604482015290519081900360640190fd5b6001600160a01b03841660009081526014602052604090205460ff16611488576001600160a01b0384166000818152601460205260408120805460ff191660019081179091556013805491820181559091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b03191690911790555b6001600160a01b0384166000908152600c6020526040902080548401808255600190910155610fdf336114b9611f39565b85612f75565b6114c7612da0565b6000546001600160a01b03908116911614611517576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b476000811161155b576040805162461bcd60e51b81526020600482015260186024820152600080516020613420833981519152604482015290519081900360640190fd5b611563611f39565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156111cf573d6000803e3d6000fd5b600e5481565b6000610c496115ae612da0565b84610fda85600260006115bf612da0565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6130d316565b60606017805480602002602001604051908101604052809291908181526020018280548015610c2b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161162f575050505050905090565b6116603382613134565b50565b601b5481565b33600090815260086020526040812054600514806116965750336000908152600860205260409020546002145b806116b05750336000908152600860205260409020546001145b6116fa576040805162461bcd60e51b81526020600482015260166024820152752cb7ba9030b932903737ba102a32b0b69020b236b4b760511b604482015290519081900360640190fd5b42601c541061173e576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c81905563630ff60011156117865760405162461bcd60e51b815260040180806020018281038252602b81526020018061372c602b913960400191505060405180910390fd5b606482601a540111156117d8576040805162461bcd60e51b8152602060048201526015602482015274135bdc99481d1a195b880c4c0c081c195c98d95b9d605a1b604482015290519081900360640190fd5b601a54820160005b60155481101561194d576000600d6000601584815481106117fd57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010154600d60006015858154811061185057fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120546015805493909103926064928792600d928890811061189057fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205402816118bd57fe5b04039050600081136118cf5750611945565b80600d6000601585815481106118e157fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600101805491909103905561194361191b611f39565b6015848154811061192857fe5b6000918252602090912001546001600160a01b031683612f75565b505b6001016117e0565b5050601a805483019055506001919050565b61196833612d15565b6119a7576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c54106119eb576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c5560005b81518110156111cf57600060076000848481518110611a0d57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016119f2565b6001600160a01b0381166000908152600d60209081526040808320600190810154600c9093529083200154611a7b84613230565b010192915050565b611a8b612da0565b6000546001600160a01b03908116911614611adb576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600b5481565b611b33612da0565b6000546001600160a01b03908116911614611b83576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b6001600160a01b03909116600090815260086020526040902055565b336000908152600c6020526040902060010180548290039055611660611bc3611f39565b82613134565b611bd233612d15565b611c11576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c5410611c55576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c5560005b81518110156111cf57600160076000848481518110611c7757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611c5c565b3360009081526008602052604081205460031480611cde5750336000908152600860205260409020546002145b80611cf85750336000908152600860205260409020546001145b611d42576040805162461bcd60e51b81526020600482015260166024820152752cb7ba9030b932903737ba1029b2b2b21020b236b4b760511b604482015290519081900360640190fd5b42601c5410611d86576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c558180611dcb576040805162461bcd60e51b81526020600482015260186024820152600080516020613420833981519152604482015290519081900360640190fd5b600b54831115611e0c5760405162461bcd60e51b81526004018080602001828103825260288152602001806136546028913960400191505060405180910390fd5b6001600160a01b03841660009081526012602052604090205460ff16611e92576001600160a01b0384166000818152601260205260408120805460ff191660019081179091556011805491820181559091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b03191690911790555b6001600160a01b0384166000908152600a60205260409020805484019055600b80548490039055610fdf611ec4611f39565b8585612f75565b6000611ed5611f39565b905090565b6000611ee4612da0565b6000546001600160a01b03908116911614611f34576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b504790565b6000546001600160a01b031690565b601a5481565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b60086020526000908152604090205481565b60076020526000908152604090205460ff1681565b336000908152600d6020526040902060010180548290039055611660611bc3611f39565b6000612004612da0565b6000546001600160a01b03908116911614612054576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b61206561205f612da0565b8361324b565b506001919050565b60195481565b6000610c49612080612da0565b84610fda8560405180606001604052806025815260200161359e60259139600260006120aa612da0565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612ede16565b60006120ec33612d15565b61212b576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c541061216f576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b5042601c556361170780601b55600190565b6000610c4961218e612da0565b8484612e90565b60606015805480602002602001604051908101604052809291908181526020018280548015610c2b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161162f575050505050905090565b600061220033612d15565b61223f576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c5410612283576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c55601b54636117078014156122cc5760405162461bcd60e51b815260040180806020018281038252602b815260200180613629602b913960400191505060405180910390fd5b6361297c8082601b540111156123135760405162461bcd60e51b81526004018080602001828103825260238152602001806135386023913960400191505060405180910390fd5b50601b8054820190556001919050565b600a6020526000908152604090205481565b60606013805480602002602001604051908101604052809291908181526020018280548015610c2b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161162f575050505050905090565b60006123a033612d15565b6123df576040805162461bcd60e51b81526020600482015260196024820152600080516020613489833981519152604482015290519081900360640190fd5b42601c5410612423576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c81905563612ec280111561246b5760405162461bcd60e51b815260040180806020018281038252602b81526020018061372c602b913960400191505060405180910390fd5b6064826019540111156124bd576040805162461bcd60e51b8152602060048201526015602482015274135bdc99481d1a195b880c4c0c081c195c98d95b9d605a1b604482015290519081900360640190fd5b601954820160005b601354811015612617576000600c6000601384815481106124e257fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010154600c60006013858154811061253557fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120546013805493909103926064928792600c928890811061257557fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205402816125a257fe5b04039050600081136125b4575061260f565b80600c6000601385815481106125c657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020600101805491909103905561260d612600611f39565b6013848154811061192857fe5b505b6001016124c5565b50506019805483019055506001919050565b600d602052600090815260409020805460019091015482565b60606011805480602002602001604051908101604052809291908181526020018280548015610c2b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161162f575050505050905090565b6126aa612da0565b6000546001600160a01b039081169116146126fa576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b811561276f576040805163a22cb46560e01b81526001600160a01b0383811660048301526001602483015291519185169163a22cb4659160448082019260009290919082900301818387803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506127f0565b6040805163095ea7b360e01b81526001600160a01b038381166004830152600019602483015291519185169163095ea7b3916044808201926020929091908290030181600087803b1580156127c357600080fd5b505af11580156127d7573d6000803e3d6000fd5b505050506040513d60208110156127ed57600080fd5b50505b505050565b600c602052600090815260409020805460019091015482565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b42601c541061287d576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c55336000908152600d60205260409020546128e2576040805162461bcd60e51b815260206004820152601a60248201527f596f752068617665206e6f2070726573616c6520746f6b656e73000000000000604482015290519081900360640190fd5b63630ff600421015612927576040805162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b604482015290519081900360640190fd5b600063630ff600421061293857600a015b6363378300421061294757600f015b6363606180421061295657600f015b636387ee80421061296557600f015b6363b0cd00421061297457600f015b6363d9ab80421061298357600f015b6363fe9580421061299257600f015b336000908152600d602052604081206001810154905490810390606490840204039050600081136129f45760405162461bcd60e51b81526004018080602001828103825260258152602001806136046025913960400191505060405180910390fd5b336000908152600d60205260409020600101805482900390556111cf6111c8611f39565b60105481565b612a26612da0565b6000546001600160a01b03908116911614612a76576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b6111cf8282612a83611f39565b6126a2565b3360009081526008602052604081205460061480612ab55750336000908152600860205260409020546002145b80612acf5750336000908152600860205260409020546001145b612b20576040805162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742041647669736f72732041646d696e000000000000604482015290519081900360640190fd5b42601c5410612b64576040805162461bcd60e51b815260206004820152601760248201526000805160206135e4833981519152604482015290519081900360640190fd5b42601c558180612ba9576040805162461bcd60e51b81526020600482015260186024820152600080516020613420833981519152604482015290519081900360640190fd5b826010541015612bea5760405162461bcd60e51b81526004018080602001828103825260288152602001806136546028913960400191505060405180910390fd5b6001600160a01b03841660009081526018602052604090205460ff16612c70576001600160a01b0384166000818152601860205260408120805460ff191660019081179091556017805491820181559091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b03191690911790555b6010805484900390556001600160a01b0384166000908152600f60205260409020805484019055610fdf611ec4611f39565b612caa612da0565b6000546001600160a01b03908116911614612cfa576040805162461bcd60e51b8152602060048201819052602482015260008051602061355b833981519152604482015290519081900360640190fd5b6116608161333d565b600f6020526000908152604090205481565b6001600160a01b03811660009081526008602052604081205460041480612d5457506001600160a01b0382166000908152600860205260409020546002145b80612d7757506001600160a01b0382166000908152600860205260409020546001145b80612d9a57506001600160a01b0382166000908152600860205260409020546007145b92915050565b3390565b6001600160a01b038316612de95760405162461bcd60e51b81526004018080602001828103825260248152602001806134656024913960400191505060405180910390fd5b6001600160a01b038216612e2e5760405162461bcd60e51b81526004018080602001828103825260228152602001806136e76022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166000908152600860205260409020546007148015612ebe5750612ebc82612d15565b155b15612ed357612ecd82826111dc565b506127f0565b6127f0838383612f75565b60008184841115612f6d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f32578181015183820152602001612f1a565b50505050905090810190601f168015612f5f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038316612fba5760405162461bcd60e51b81526004018080602001828103825260258152602001806134406025913960400191505060405180910390fd5b6001600160a01b038216612fff5760405162461bcd60e51b815260040180806020018281038252602381526020018061357b6023913960400191505060405180910390fd5b613042816040518060800160405280604181526020016134cf604191396001600160a01b038616600090815260016020526040902054919063ffffffff612ede16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054613077908263ffffffff6130d316565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282018381101561312d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b0382166131795760405162461bcd60e51b81526004018080602001828103825260218152602001806135c36021913960400191505060405180910390fd5b6131bc816040518060600160405280602281526020016136c5602291396001600160a01b038516600090815260016020526040902054919063ffffffff612ede16565b6001600160a01b0383166000908152600160205260409020556003546131e8908263ffffffff6133dd16565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b031660009081526001602052604090205490565b6001600160a01b0382166132a6576040805162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6003546132b9908263ffffffff6130d316565b6003556001600160a01b0382166000908152600160205260409020546132e5908263ffffffff6130d316565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0381166133825760405162461bcd60e51b81526004018080602001828103825260268152602001806134a96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061312d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ede56fe416d6f756e74206d757374206265206e6f6e207a65726f2e000000000000000042455032303a207472616e736665722066726f6d20746865207a65726f206164647265737342455032303a20617070726f76652066726f6d20746865207a65726f2061646472657373596f7520617265206e6f742050726573616c652041646d696e000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365206f7220746f6b656e7320617265207374696c6c206c6f636b656442455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365546865206d6178696d756d20706572696f642077696c6c2062652065786365656465644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242455032303a207472616e7366657220746f20746865207a65726f206164647265737342455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e2066726f6d20746865207a65726f2061646472657373496e76616c696420626c6f636b2074696d657374616d70000000000000000000596f75206861766520616c726561647920726563656976656420796f757220746f6b656e7352652d6c61756e6368696e67207468652077686974656c697374206973206e6f7420617661696c61626c65457863656564696e672074686520617661696c61626c65206e756d626572206f6620746f6b656e73546865207075726368617365206f66206120746f6b656e20666f72207468652050726573616c65207374616765206973206e6f7420617661696c61626c652e20546f6f206c6174652e42455032303a206275726e20616d6f756e7420657863656564732062616c616e636542455032303a20617070726f766520746f20746865207a65726f2061646472657373546f6f206c61746520746f20616464206d6f6e657920666f7220746865207465616d2e4e6f7420617661696c61626c6520666f72207370656e64696e672e204974277320746f6f206561726c792e546865207075726368617365206f66206120746f6b656e20666f72207468652050726573616c65207374616765206973206e6f7420617661696c61626c652e20546f6f206561726c792ea265627a7a72315820f74c37e284c2e9d988f6263b269d7d5f1ae8ea10caa5089ddb98902ed46599af64736f6c63430005100032

Deployed ByteCode Sourcemap

127:29461:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:29461:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13055:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;12008:77:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12008:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13001:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13001:141:0;;;;;;;;:::i;17448:611:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17448:611:2;;;;;;;;:::i;991:29::-;;;:::i;12136:85:0:-;;;:::i;:::-;;;;;;;;;;;;;;;;13518:139:2;;;:::i;13573:288:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13573:288:0;;;;;;;;;;;;;;;;;:::i;23473:1100:2:-;;;:::i;:::-;;11750:77:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10143:930:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10143:930:2;;;;;;;;:::i;28986:143::-;;;:::i;1226:23::-;;;:::i;14229:197:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14229:197:0;;;;;;;;:::i;7579:102:2:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7579:102:2;;;;;;;;;;;;;;;;;21491:76;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21491:76:2;;:::i;2302:34::-;;;:::i;18702:969::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18702:969:2;;:::i;14530:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14530:198:2;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;14530:198:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14530:198:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;14530:198:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14530:198:2;;-1:-1:-1;14530:198:2;;-1:-1:-1;;;;;14530:198:2:i;28674:190::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28674:190:2;-1:-1:-1;;;;;28674:190:2;;:::i;10319:127:0:-;;;:::i;1076:23:2:-;;;:::i;26740:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26740:97:2;;;;;;;;:::i;21924:251::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21924:251:2;;:::i;13993:196::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13993:196:2;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13993:196:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13993:196:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;13993:196:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;13993:196:2;;-1:-1:-1;13993:196:2;;-1:-1:-1;;;;;13993:196:2:i;8756:500::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8756:500:2;;;;;;;;:::i;11619:77:0:-;;;:::i;:::-;;;;-1:-1:-1;;;;;11619:77:0;;;;;;;;;;;;;;28870:110:2;;;:::i;9728:79:0:-;;;:::i;2272:24:2:-;;;:::i;11879:81:0:-;;;:::i;946:38:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;946:38:2;-1:-1:-1;;;;;946:38:2;;:::i;705:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;705:42:2;-1:-1:-1;;;;;705:42:2;;:::i;22532:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22532:242:2;;:::i;15320:117:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15320:117:0;;:::i;2239:27:2:-;;;:::i;14882:248:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14882:248:0;;;;;;;;:::i;16396:147:2:-;;;:::i;12556::0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12556:147:0;;;;;;;;:::i;6901:95:2:-;;;:::i;15488:532::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15488:532:2;;:::i;1027:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1027:43:2;-1:-1:-1;;;;;1027:43:2;;:::i;6453:101::-;;;:::i;11724:1005::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11724:1005:2;;:::i;1168:52::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1168:52:2;-1:-1:-1;;;;;1168:52:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5979:95;;;:::i;29292:294::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29292:294:2;;;;;;;;;;;;;;;;;;;:::i;1106:55::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1106:55:2;-1:-1:-1;;;;;1106:55:2;;:::i;12752:128:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12752:128:0;;;;;;;;;;:::i;25254:1082:2:-;;;:::i;1309:27::-;;;:::i;29135:150::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29135:150:2;;;;;;;;;;:::i;20627:523::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20627:523:2;;;;;;;;:::i;10585:109:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10585:109:0;-1:-1:-1;;;;;10585:109:0;;:::i;1256:47:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1256:47:2;-1:-1:-1;;;;;1256:47:2;;:::i;13055:139::-;13126:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;-1:-1:-1;3421:3:2;3398:20;:26;13142:17;:24;;-1:-1:-1;;13142:24:2;13162:4;13142:24;;;;;;13055:139;:::o;12008:77:0:-;12075:5;12068:12;;;;;;;;-1:-1:-1;;12068:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12047:13;;12068:12;;12075:5;;12068:12;;12075:5;12068:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12008:77;:::o;13001:141::-;13069:4;13081:39;13090:12;:10;:12::i;:::-;13104:7;13113:6;13081:8;:39::i;:::-;-1:-1:-1;13133:4:0;13001:141;;;;:::o;17448:611:2:-;4176:10;17568:4;4170:17;;;:5;:17;;;;;;4191:1;4170:22;;:48;;-1:-1:-1;4202:10:2;4196:17;;;;:5;:17;;;;;;4217:1;4196:22;4170:48;:74;;;-1:-1:-1;4228:10:2;4222:17;;;;:5;:17;;;;;;4243:1;4222:22;4170:74;4162:109;;;;;-1:-1:-1;;;4162:109:2;;;;;;;;;;;;-1:-1:-1;;;4162:109:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;17552:6;4523:10;4515:47;;;;;-1:-1:-1;;;4515:47:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4515:47:2;;;;;;;;;;;;;;;2819:10;17591:3;:14;17583:62;;;;-1:-1:-1;;;17583:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17674:11;;17664:6;:21;;17656:74;;;;-1:-1:-1;;;17656:74:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17746:24:2;;;;;;:13;:24;;;;;;;;17741:126;;-1:-1:-1;;;;;17785:24:2;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;17785:31:2;17812:4;17785:31;;;;;;17830:10;27::-1;;23:18;;;45:23;;17830:26:2;;;;;;;-1:-1:-1;;;;;;17830:26:2;;;;;;17741:126;-1:-1:-1;;17877:11:2;:21;;;;;;;-1:-1:-1;;;;;17908:21:2;;;;-1:-1:-1;17908:21:2;;;:10;:21;;;;;:42;;;;;;;;-1:-1:-1;17960:35:2;;;:70;-1:-1:-1;17448:611:2:o;991:29::-;;;;;;:::o;12136:85:0:-;12204:12;;12136:85;:::o;13518:139:2:-;13588:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;-1:-1:-1;3421:3:2;3398:20;:26;13604:17;:25;;-1:-1:-1;;13604:25:2;;;;13518:139;:::o;13573:288:0:-;13664:4;13676:36;13686:6;13694:9;13705:6;13676:9;:36::i;:::-;13718:121;13727:6;13735:12;:10;:12::i;:::-;13749:89;13787:6;13749:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13749:19:0;;;;;;:11;:19;;;;;;13769:12;:10;:12::i;:::-;-1:-1:-1;;;;;13749:33:0;;;;;;;;;;;;-1:-1:-1;13749:33:0;;;:89;;:37;:89;:::i;:::-;13718:8;:121::i;:::-;-1:-1:-1;13852:4:0;13573:288;;;;;:::o;23473:1100:2:-;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;23558:10;23583:1;23544:25;;;:13;:25;;;;;:36;23536:79;;;;;-1:-1:-1;;;23536:79:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;2476:10;23633:3;:15;;23625:37;;;;;-1:-1:-1;;;23625:37:2;;;;;;;;;;;;-1:-1:-1;;;23625:37:2;;;;;;;;;;;;;;;23672:16;2476:10;23702:3;:15;23698:62;;23747:2;23732:17;23698:62;2525:10;23773:3;:15;23769:62;;23818:2;23803:17;23769:62;2574:10;23844:3;:15;23840:62;;23889:2;23874:17;23840:62;2623:10;23915:3;:15;23911:62;;23960:2;23945:17;23911:62;2672:10;23986:3;:15;23982:62;;24031:2;24016:17;23982:62;2721:10;24057:3;:15;24053:62;;24102:2;24087:17;24053:62;2770:10;24128:3;:15;24124:62;;24173:2;24158:17;24124:62;24335:10;24196:16;24321:25;;;:13;:25;;;;;:39;;;;24282:36;;:78;;;;24275:3;;24222:50;;:56;:139;24196:166;;24392:1;24380:9;:13;24372:63;;;;-1:-1:-1;;;24372:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24459:10;24445:25;;;;:13;:25;;;;;:39;;:58;;;;;;;24513:53;24529:7;:5;:7::i;:::-;24538:10;24555:9;24513:15;:53::i;:::-;3434:1;;23473:1100::o;11750:77:0:-;11813:9;;;;11750:77;:::o;10143:930:2:-;10269:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;10253:6;4523:10;4515:47;;;;;-1:-1:-1;;;4515:47:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4515:47:2;;;;;;;;;;;;;;;10292:17;;;;10284:62;;;;;-1:-1:-1;;;10284:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:10;10365:3;:16;;10357:103;;;;-1:-1:-1;;;10357:103:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2476:10;10479:3;:14;10471:100;;;;-1:-1:-1;;;10471:100:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10592:22;;10586:3;:28;10582:122;;;-1:-1:-1;;;;;10637:20:2;;;;;;:9;:20;;;;;;;;10629:64;;;;;-1:-1:-1;;;10629:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10719:27:2;;;;;;:16;:27;;;;;;;;10714:135;;-1:-1:-1;;;;;10761:27:2;;;;;;:16;:27;;;;;:34;;-1:-1:-1;;10761:34:2;10791:4;10761:34;;;;;;10809:13;27:10:-1;;23:18;;;45:23;;10809:29:2;;;;;;;-1:-1:-1;;;;;;10809:29:2;;;;;;10714:135;-1:-1:-1;;;;;10859:24:2;;;;;;:13;:24;;;;;:45;;;;;;;-1:-1:-1;10914:38:2;;;:76;11000:44;11016:10;11028:7;:5;:7::i;:::-;11037:6;11000:15;:44::i;28986:143::-;9932:12:0;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;29051:21:2;4532:1;4523:6;:10;4515:47;;;;;-1:-1:-1;;;4515:47:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4515:47:2;;;;;;;;;;;;;;;29083:7;:5;:7::i;:::-;-1:-1:-1;;;;;29083:16:2;:39;29100:21;29083:39;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;1226:23:2;;;;:::o;14229:197:0:-;14309:4;14321:83;14330:12;:10;:12::i;:::-;14344:7;14353:50;14392:10;14353:11;:25;14365:12;:10;:12::i;:::-;-1:-1:-1;;;;;14353:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14353:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;7579:102:2:-;7627:16;7661:13;7654:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7654:20:2;;;;;;;;;;;;;;;;;;;;;;7579:102;:::o;21491:76::-;21535:25;21541:10;21553:6;21535:5;:25::i;:::-;21491:76;:::o;2302:34::-;;;;:::o;18702:969::-;4176:10;18799:4;4170:17;;;:5;:17;;;;;;4191:1;4170:22;;:48;;-1:-1:-1;4202:10:2;4196:17;;;;:5;:17;;;;;;4217:1;4196:22;4170:48;:74;;;-1:-1:-1;4228:10:2;4222:17;;;;:5;:17;;;;;;4243:1;4222:22;4170:74;4162:109;;;;;-1:-1:-1;;;4162:109:2;;;;;;;;;;;;-1:-1:-1;;;4162:109:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;;;2819:10;-1:-1:-1;18898:15:2;18890:71;;;;-1:-1:-1;;;18890:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19017:3;18994:19;18979:12;;:34;:41;;18971:75;;;;;-1:-1:-1;;;18971:75:2;;;;;;;;;;;;-1:-1:-1;;;18971:75:2;;;;;;;;;;;;;;;19100:12;;19078:34;;19056:19;19145:454;19166:10;:17;19162:21;;19145:454;;;19204:16;19332:10;:25;19343:10;19354:1;19343:13;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19343:13:2;-1:-1:-1;;;;;19332:25:2;-1:-1:-1;;;;;19332:25:2;;;;;;;;;;;;:39;;;19293:10;:25;19304:10;19315:1;19304:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19304:13:2;19293:25;;;;;;;;;;;;:36;19241:10;:13;;19293:78;;;;;19286:3;;19269:14;;19230:10;;19252:1;;19241:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19241:13:2;19230:25;;;;;;;;;;;;:36;:53;:59;;;;;;:142;19204:169;;19404:1;19391:9;:14;19387:60;;19424:8;;;19387:60;19508:9;19460:10;:25;19471:10;19482:1;19471:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19471:13:2;19460:25;;;;;;;;;;;;19471:13;19460:39;:58;;;;;;;;19532:56;19548:7;:5;:7::i;:::-;19557:10;19568:1;19557:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19557:13:2;19577:9;19532:15;:56::i;:::-;19145:454;;19185:3;;19145:454;;;-1:-1:-1;;19608:12:2;:35;;;;;;-1:-1:-1;;18702:969:2;;;:::o;14530:198::-;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;14634:6;14629:93;14650:6;:13;14646:1;:17;14629:93;;;14706:5;14683:9;:20;14693:6;14700:1;14693:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14683:20:2;;;;;;;;;;;-1:-1:-1;14683:20:2;:28;;-1:-1:-1;;14683:28:2;;;;;;;;;;-1:-1:-1;14665:3:2;14629:93;;28674:190;-1:-1:-1;;;;;28824:19:2;;28731:4;28824:19;;;:10;:19;;;;;;;;:33;;;;;28785:13;:22;;;;;;:36;;28753:29;28835:7;28753:20;:29::i;:::-;:68;:104;;28674:190;-1:-1:-1;;28674:190:2:o;10319:127:0:-;9932:12;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;10413:1;10397:6;;10376:40;;-1:-1:-1;;;;;10397:6:0;;;;10376:40;;10413:1;;10376:40;10439:1;10422:19;;-1:-1:-1;;;;;;10422:19:0;;;10319:127::o;1076:23:2:-;;;;:::o;26740:97::-;9932:12:0;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26810:13:2;;;;;;;:5;:13;;;;;:20;26740:97::o;21924:251::-;22003:10;22041:1;21989:25;;;:13;:25;;22087;;;:39;;:49;;;;;;;22146:22;22152:7;:5;:7::i;:::-;22161:6;22146:5;:22::i;13993:196::-;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;14096:6;14091:92;14112:6;:13;14108:1;:17;14091:92;;;14168:4;14145:9;:20;14155:6;14162:1;14155:9;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14145:20:2;;;;;;;;;;;-1:-1:-1;14145:20:2;:27;;-1:-1:-1;;14145:27:2;;;;;;;;;;-1:-1:-1;14127:3:2;14091:92;;8756:500;3883:10;8876:4;3877:17;;;:5;:17;;;;;;3898:1;3877:22;;:48;;-1:-1:-1;3909:10:2;3903:17;;;;:5;:17;;;;;;3924:1;3903:22;3877:48;:74;;;-1:-1:-1;3935:10:2;3929:17;;;;:5;:17;;;;;;3950:1;3929:22;3877:74;3869:109;;;;;-1:-1:-1;;;3869:109:2;;;;;;;;;;;;-1:-1:-1;;;3869:109:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;8860:6;4523:10;4515:47;;;;;-1:-1:-1;;;4515:47:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4515:47:2;;;;;;;;;;;;;;;8909:11;;8899:6;:21;;8891:74;;;;-1:-1:-1;;;8891:74:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8981:24:2;;;;;;:13;:24;;;;;;;;8976:126;;-1:-1:-1;;;;;9020:24:2;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;9020:31:2;9047:4;9020:31;;;;;;9065:10;27::-1;;23:18;;;45:23;;9065:26:2;;;;;;;-1:-1:-1;;;;;;9065:26:2;;;;;;8976:126;-1:-1:-1;;;;;9112:21:2;;;;;;:10;:21;;;;;:31;;;;;;9153:11;:21;;;;;;;9184:43;9200:7;:5;:7::i;:::-;9209:9;9220:6;9184:15;:43::i;11619:77:0:-;11662:7;11684;:5;:7::i;:::-;11677:14;;11619:77;:::o;28870:110:2:-;28929:4;9932:12:0;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;-1:-1:-1;28951:21:2;28870:110;:::o;9728:79:0:-;9766:15;9796:6;-1:-1:-1;;;;;9796:6:0;9728:79;:::o;2272:24:2:-;;;;:::o;11879:81:0:-;11948:7;11941:14;;;;;;;;-1:-1:-1;;11941:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11920:13;;11941:14;;11948:7;;11941:14;;11948:7;11941:14;;;;;;;;;;;;;;;;;;;;;;;;946:38:2;;;;;;;;;;;;;:::o;705:42::-;;;;;;;;;;;;;;;:::o;22532:242::-;22605:10;22643:1;22594:22;;;:10;:22;;22689;;;:36;;:46;;;;;;;22745:22;22751:7;:5;:7::i;15320:117:0:-;15376:4;9932:12;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;15388:27;15394:12;:10;:12::i;:::-;15408:6;15388:5;:27::i;:::-;-1:-1:-1;15428:4:0;15320:117;;;:::o;2239:27:2:-;;;;:::o;14882:248:0:-;14967:4;14979:129;14988:12;:10;:12::i;:::-;15002:7;15011:96;15050:15;15011:96;;;;;;;;;;;;;;;;;:11;:25;15023:12;:10;:12::i;:::-;-1:-1:-1;;;;;15011:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15011:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;16396:147:2:-;16466:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;-1:-1:-1;3421:3:2;3398:20;:26;2377:10;16481:22;:34;-1:-1:-1;16396:147:2;:::o;12556::0:-;12627:4;12639:42;12649:12;:10;:12::i;:::-;12663:9;12674:6;12639:9;:42::i;6901:95:2:-;6945:16;6979:10;6972:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6972:17:2;;;;;;;;;;;;;;;;;;;;;;6901:95;:::o;15488:532::-;15591:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;15614:22;;2377:10;15614:35;;15606:91;;;;-1:-1:-1;;;15606:91:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2427:10;15871:16;15845:22;;:42;:55;;15837:103;;;;-1:-1:-1;;;15837:103:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15950:22:2;:42;;;;;;-1:-1:-1;15488:532:2;;;:::o;1027:43::-;;;;;;;;;;;;;:::o;6453:101::-;6500:16;6534:13;6527:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6527:20:2;;;;;;;;;;;;;;;;;;;;;;6453:101;:::o;11724:1005::-;11827:4;4047:27;4063:10;4047:15;:27::i;:::-;4039:65;;;;;-1:-1:-1;;;4039:65:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4039:65:2;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;;;2476:10;-1:-1:-1;11893:15:2;11885:71;;;;-1:-1:-1;;;11885:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12015:3;11992:19;11974:15;;:37;:44;;11966:78;;;;;-1:-1:-1;;;11966:78:2;;;;;;;;;;;;-1:-1:-1;;;11966:78:2;;;;;;;;;;;;;;;12098:15;;12076:37;;12054:19;12146:508;12165:13;:20;12161:24;;12146:508;;;12206:16;12346:13;:31;12360:13;12374:1;12360:16;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12360:16:2;-1:-1:-1;;;;;12346:31:2;-1:-1:-1;;;;;12346:31:2;;;;;;;;;;;;:45;;;12301:13;:31;12315:13;12329:1;12315:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12315:16:2;12301:31;;;;;;;;;;;;:42;12246:13;:16;;12301:90;;;;;12294:3;;12277:14;;12232:13;;12260:1;;12246:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12246:16:2;12232:31;;;;;;;;;;;;:42;:59;:65;;;;;;:160;12206:187;;12450:1;12437:9;:14;12433:60;;12470:8;;;12433:60;12560:9;12506:13;:31;12520:13;12534:1;12520:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12520:16:2;12506:31;;;;;;;;;;;;12520:16;12506:45;:64;;;;;;;;12584:59;12600:7;:5;:7::i;:::-;12609:13;12623:1;12609:16;;;;;;;12584:59;12146:508;;12187:3;;12146:508;;;-1:-1:-1;;12663:15:2;:38;;;;;;-1:-1:-1;;11724:1005:2;;;:::o;1168:52::-;;;;;;;;;;;;;;;;;;;:::o;5979:95::-;6023:16;6057:10;6050:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6050:17:2;;;;;;;;;;;;;;;;;;;;;;5979:95;:::o;29292:294::-;9932:12:0;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;29407:5:2;29404:112;;;29428:57;;;-1:-1:-1;;;29428:57:2;;-1:-1:-1;;;;;29428:57:2;;;;;;;29480:4;29428:57;;;;;;:42;;;;;;:57;;;;;-1:-1:-1;;29428:57:2;;;;;;;;-1:-1:-1;29428:42:2;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;29428:57:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29428:57:2;;;;29499:7;;29404:112;29525:54;;;-1:-1:-1;;;29525:54:2;;-1:-1:-1;;;;;29525:54:2;;;;;;;-1:-1:-1;;29525:54:2;;;;;;:35;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;29525:35:2;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;29525:54:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29525:54:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;9987:1:0;29292:294:2;;;:::o;1106:55::-;;;;;;;;;;;;;;;;;;;:::o;12752:128:0:-;-1:-1:-1;;;;;12848:18:0;;;12826:7;12848:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12752:128::o;25254:1082:2:-;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;25333:10;25358:1;25322:22;;;:10;:22;;;;;:33;25314:76;;;;;-1:-1:-1;;;25314:76:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;2819:10;25408:3;:15;;25400:37;;;;;-1:-1:-1;;;25400:37:2;;;;;;;;;;;;-1:-1:-1;;;25400:37:2;;;;;;;;;;;;;;;25447:16;2819:10;25477:3;:15;25473:62;;25522:2;25507:17;25473:62;2868:10;25548:3;:15;25544:62;;25593:2;25578:17;25544:62;2917:10;25619:3;:15;25615:62;;25664:2;25649:17;25615:62;2966:10;25690:3;:15;25686:62;;25735:2;25720:17;25686:62;3015:10;25761:3;:15;25757:62;;25806:2;25791:17;25757:62;3064:10;25832:3;:15;25828:62;;25877:2;25862:17;25828:62;3113:10;25903:3;:15;25899:62;;25948:2;25933:17;25899:62;26101:10;25971:16;26090:22;;;:10;:22;;;;;:36;;;;26054:33;;:72;;;;26047:3;;25997:47;;:53;:130;25971:157;;26158:1;26146:9;:13;26138:63;;;;-1:-1:-1;;;26138:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26222:10;26211:22;;;;:10;:22;;;;;:36;;:55;;;;;;;26276:53;26292:7;:5;:7::i;1309:27::-;;;;:::o;29135:150::-;9932:12:0;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;29228:50:2;29246:15;29263:5;29270:7;:5;:7::i;:::-;29228:17;:50::i;20627:523::-;4347:10;20752:4;4341:17;;;:5;:17;;;;;;4362:1;4341:22;;:48;;-1:-1:-1;4373:10:2;4367:17;;;;:5;:17;;;;;;4388:1;4367:22;4341:48;:74;;;-1:-1:-1;4399:10:2;4393:17;;;;:5;:17;;;;;;4414:1;4393:22;4341:74;4333:113;;;;;-1:-1:-1;;;4333:113:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;3357:3;3334:20;;:26;3326:62;;;;;-1:-1:-1;;;3326:62:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3326:62:2;;;;;;;;;;;;;;;3421:3;3398:20;:26;20736:6;4523:10;4515:47;;;;;-1:-1:-1;;;4515:47:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4515:47:2;;;;;;;;;;;;;;;20794:6;20775:15;;:25;;20767:78;;;;-1:-1:-1;;;20767:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20860:27:2;;;;;;:16;:27;;;;;;;;20856:134;;-1:-1:-1;;;;;20902:27:2;;;;;;:16;:27;;;;;:34;;-1:-1:-1;;20902:34:2;20932:4;20902:34;;;;;;20950:13;27:10:-1;;23:18;;;45:23;;20950:29:2;;;;;;;-1:-1:-1;;;;;;20950:29:2;;;;;;20856:134;20999:15;:25;;;;;;;-1:-1:-1;;;;;21034:25:2;;20999:15;21034:25;;;:14;:25;;;;;:35;;;;;;21079:43;21095:7;:5;:7::i;10585:109:0:-;9932:12;:10;:12::i;:::-;9922:6;;-1:-1:-1;;;;;9922:6:0;;;:22;;;9914:67;;;;;-1:-1:-1;;;9914:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9914:67:0;;;;;;;;;;;;;;;10661:28;10680:8;10661:18;:28::i;1256:47:2:-;;;;;;;;;;;;;:::o;5614:168::-;-1:-1:-1;;;;;5699:11:2;;5676:4;5699:11;;;:5;:11;;;;;;5714:1;5699:16;;:36;;-1:-1:-1;;;;;;5719:11:2;;;;;;:5;:11;;;;;;5734:1;5719:16;5699:36;:56;;;-1:-1:-1;;;;;;5739:11:2;;;;;;:5;:11;;;;;;5754:1;5739:16;5699:56;:76;;;-1:-1:-1;;;;;;5759:11:2;;;;;;:5;:11;;;;;;5774:1;5759:16;5699:76;5692:83;5614:168;-1:-1:-1;;5614:168:2:o;3597:90:0:-;3672:10;3597:90;:::o;17900:314::-;-1:-1:-1;;;;;17989:19:0;;17981:68;;;;-1:-1:-1;;;17981:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18063:21:0;;18055:68;;;;-1:-1:-1;;;18055:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18130:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18177:32;;;;;;;;;;;;;;;;;17900:314;;;:::o;27924:289:2:-;-1:-1:-1;;;;;28016:13:2;;;;;;:5;:13;;;;;;28033:1;28016:18;:49;;;;;28039:26;28055:9;28039:15;:26::i;:::-;28038:27;28016:49;28013:194;;;28081:34;28097:9;28108:6;28081:15;:34::i;:::-;;28013:194;;;28154:42;28170:6;28178:9;28189:6;28154:15;:42::i;5494:173:0:-;5580:7;5611:12;5603:6;;;;5595:29;;;;-1:-1:-1;;;5595:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5595:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5642:5:0;;;5494:173::o;15881:469::-;-1:-1:-1;;;;;15974:20:0;;15966:70;;;;-1:-1:-1;;;15966:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16050:23:0;;16042:71;;;;-1:-1:-1;;;16042:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16140:98;16162:6;16140:98;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16140:17:0;;;;;;:9;:17;;;;;;;:98;;:21;:98;:::i;:::-;-1:-1:-1;;;;;16120:17:0;;;;;;;:9;:17;;;;;;:118;;;;16267:20;;;;;;;:32;;16292:6;16267:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;16244:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;16310:35;;;;;;;16244:20;;16310:35;;;;;;;;;;;;;15881:469;;;:::o;4696:162::-;4754:7;4781:5;;;4800:6;;;;4792:46;;;;;-1:-1:-1;;;4792:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4852:1;4696:162;-1:-1:-1;;;4696:162:0:o;17179:324::-;-1:-1:-1;;;;;17250:21:0;;17242:67;;;;-1:-1:-1;;;17242:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17337:68;17360:6;17337:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17337:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;17316:18:0;;;;;;:9;:18;;;;;:89;17426:12;;:24;;17443:6;17426:24;:16;:24;:::i;:::-;17411:12;:39;17461:37;;;;;;;;17487:1;;-1:-1:-1;;;;;17461:37:0;;;;;;;;;;;;17179:324;;:::o;12270:102::-;-1:-1:-1;;;;;12349:18:0;12327:7;12349:18;;;:9;:18;;;;;;;12270:102::o;16600:284::-;-1:-1:-1;;;;;16671:21:0;;16663:65;;;;;-1:-1:-1;;;16663:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16750:12;;:24;;16767:6;16750:24;:16;:24;:::i;:::-;16735:12;:39;-1:-1:-1;;;;;16801:18:0;;;;;;:9;:18;;;;;;:30;;16824:6;16801:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;16780:18:0;;;;;;:9;:18;;;;;;;;:51;;;;16842:37;;;;;;;16780:18;;;;16842:37;;;;;;;;;;16600:284;;:::o;10787:219::-;-1:-1:-1;;;;;10864:22:0;;10856:73;;;;-1:-1:-1;;;10856:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10961:6;;;10940:38;;-1:-1:-1;;;;;10940:38:0;;;;10961:6;;;10940:38;;;10984:6;:17;;-1:-1:-1;;;;;;10984:17:0;-1:-1:-1;;;;;10984:17:0;;;;;;;;;;10787:219::o;5102:128::-;5160:7;5182:43;5186:1;5189;5182:43;;;;;;;;;;;;;;;;;:3;:43::i

Swarm Source

bzzr://f74c37e284c2e9d988f6263b269d7d5f1ae8ea10caa5089ddb98902ed46599af
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.