Contract 0xa57944a04f975e297912986980d2f29b5145a7ff 3

Contract Overview

Balance:
0 AVAX

AVAX Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9fb56ecae98efa53b2e17df9ab15ad21bf88419dfee6db6195826fbca6c05d98Set Approval For...201963972022-09-24 0:24:072 days 15 hrs ago0x91d5691a5058ae7526f384e9a13586a91cd99c12 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.00126923527.5
0xef29132ee1e9f919e4556d3794de2f733a1be7686acec35bd5be1bcac09588a5Set Approval For...201864892022-09-23 18:38:452 days 21 hrs ago0x9d2898f0a6531b9850caf73f5a0370f25a808eb1 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0x7bf831f6799634cde7ecd2f6af010a7c5afaee47fdc2e76ac995cc24ed9caaecSet Approval For...201680942022-09-23 7:49:213 days 7 hrs ago0xb47ef33046cda7adf769607b7ab1baa234c5e076 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000695731 26.5
0xa54c85035822ee9b99c1f5e55dd8d08deccc3be8a9257456ea6623bfbc60b4ccSet Approval For...201680902022-09-23 7:49:133 days 7 hrs ago0xb47ef33046cda7adf769607b7ab1baa234c5e076 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xa3b099d0da3db3f330709aa9692f22303fef83e4b54c2228a6da784c9865a7ceSet Approval For...201077302022-09-21 17:43:474 days 22 hrs ago0x319721340a8984560b94ca544c7e93376f6c7da7 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.0013846230
0x753d27b59e5b9ef6f5e90806f96b3d48e2d07f8ab0ced96dfd925fce00b6e879Set Approval For...200770652022-09-20 19:32:105 days 20 hrs ago0xb514465fb603b3da683310c4013d362eb45dbc55 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0x183aea8ba75a54d201e34555ca09403ba2d4fab65b6b08a643cc8969963e4c52Set Approval For...200741252022-09-20 17:25:315 days 22 hrs ago0x959f13d202d7a9eae9da40fe8821927f7711bd5d IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xedcadcf4ba83d7016857d43cdf476bdcf78b489288d721998e95c267b14cf2d1Set Approval For...200659892022-09-20 11:41:316 days 4 hrs ago0x37851e710165b165b0f3284ef528325286f8cfcb IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000716253292 27.2816825
0x198a75d48db65dff6d99bf22b96e8256e1701e7254492cf0f60cbd671eddd4a7Set Approval For...200659882022-09-20 11:41:276 days 4 hrs ago0x37851e710165b165b0f3284ef528325286f8cfcb IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000718105971 27.35225
0xe4ac5e2aea5516ac02cbe840b4a9146e3788480935e928e064256c0728cd3983Set Approval For...200659872022-09-20 11:41:256 days 4 hrs ago0x37851e710165b165b0f3284ef528325286f8cfcb IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001262415746 27.35225
0x414c117484c736a35fe2ee3a6e68863afafcf870f4a5da6845f084478f28d295Set Approval For...200483802022-09-19 23:14:386 days 16 hrs ago0xc1ac86a8407c58738cc944ef5b216af7c3e3ab42 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xff68869dc6547d82053814dda24eb6585c76261c9536241d03d6c725a1a86292Set Approval For...200376892022-09-19 15:45:367 days ago0x3b64d1d599e815a29c4f886c3280a28885bae324 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001226195781 26.567486718
0xa1edd3779162330a1ba4f33335c20b037448415601c925df32fe1b6e994fe6daSet Approval For...199997072022-09-18 12:57:098 days 2 hrs ago0x738512644257bd9269369322d18a0d92b0a64a2c IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xfa7a7dc85b66bd223e06ce1d96d7eaf53558977d40eb00b9d8b99a3af04ef49eSet Approval For...199904542022-09-18 6:12:458 days 9 hrs ago0xae7688d98fc120f2d0922772e00a5d16f721d2b4 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001269235 27.5
0x23f3ca6f93d68b49f2e39026df813adaab661aac0a2700368eaf3b7892407b30Set Approval For...199528012022-09-17 2:51:029 days 12 hrs ago0x698c004bafa4ebeaf5b77402b16074a6b0160789 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xb0537700230c0e9205483e095ad02df35e0b4b7a3b5a8767b41f028e9bb45e3bSet Approval For...199382932022-09-16 16:24:239 days 23 hrs ago0x969328938db3fbad82e2a0d1bb95bcace4fb47d7 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.00121892714 26.41
0x075035adb56003fc8d739287574ebea68a7b61d3d4fb3b248d07420918781284Set Approval For...199310832022-09-16 11:20:2310 days 4 hrs ago0xebd61a828f41ec9d882e943cded33a5fbdd6de7c IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000695731 26.5
0x238c7e569575851b7559905dd564f946631d6dbc4bc6fc4716311b4401e288caSet Approval For...199310762022-09-16 11:20:0210 days 4 hrs ago0xebd61a828f41ec9d882e943cded33a5fbdd6de7c IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xcdb8ec790d532c76b0a7cafa059fb0c30f2d51ee35735a5fec8115fa554a75fdSet Approval For...199114972022-09-15 21:25:4310 days 18 hrs ago0x7e65bab5de764426bfaa8422950e5cb2839d8304 IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.00126577345 27.425
0x38de4835a0350f636a8549cc4435a5bf0ff56688aef7dc5d2e29c088eb6780dbSet Approval For...198971972022-09-15 11:21:2111 days 4 hrs ago0x7e7980a20d253cafb388ddaacc4f7a1d59d3046c IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0x9745570b84d14cab84673bd7c2851579a8184ffb5221dbe123137435c58bf59bSet Approval For...198803602022-09-14 23:36:3111 days 16 hrs ago0xe78bf84affb246f0cb7a710cef31cb54482b085f IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001262415746 27.35225
0x5d5d818ef2ac2ecf6c2e1b38ab05d2145452cf42b4c243e71443ea36df362c0fSet Approval For...198749112022-09-14 19:47:2911 days 19 hrs ago0x8776e81a4ad670662384a36116c819d4226b29db IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000695731 26.5
0x806edf410bc77f296ab3f0f41c45bc3612c4cb0b8c7c9c2fa7573da4f7668a0cSet Approval For...198749092022-09-14 19:47:2511 days 19 hrs ago0x8776e81a4ad670662384a36116c819d4226b29db IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.000695731 26.5
0x3824d753f68663a5d175f539be26f5ba5b71119085a2e45d7e3092a2486f7ab6Set Approval For...198749072022-09-14 19:47:1911 days 19 hrs ago0x8776e81a4ad670662384a36116c819d4226b29db IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
0xff2b84f0d2af800222316eeacab4d8c7ae98922ea41756fe9a34504bb34a4822Set Approval For...198652882022-09-14 13:03:4812 days 2 hrs ago0xd454ce15fa0dd8a5b04f2555a019acc4ff27d8be IN  0xa57944a04f975e297912986980d2f29b5145a7ff0 AVAX0.001223081 26.5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UGNFTs

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2022-07-23
*/

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: contracts/interfaces/IUGNFTs.sol


pragma solidity 0.8.13;

interface IUGNFTs {
 
    struct FighterYakuza {
        bool isFighter;
        uint8 Gen;
        uint8 level;
        uint8 rank;
        uint8 courage;
        uint8 cunning;
        uint8 brutality;
        uint8 knuckles;
        uint8 chains;
        uint8 butterfly;
        uint8 machete;
        uint8 katana;
        uint16 scars;
        uint16 imageId;
        uint32 lastLevelUpgradeTime;
        uint32 lastRankUpgradeTime;
        uint32 lastRaidTime;
    }  
    //weapons scores used to identify "metal"
    // steel = 10, bronze = 20, gold = 30, platinum = 50 , titanium = 80, diamond = 100
    struct RaidStats {
        uint8 knuckles;
        uint8 chains;
        uint8 butterfly;
        uint8 machete;
        uint8 katana;
        uint16 scars;
        uint32 fighterId;
    }

    struct ForgeFightClub {
        uint8 size;
        uint8 level;
        uint16 id;
        uint32 lastLevelUpgradeTime;
        uint32 lastUnstakeTime;
        address owner;
    }

    struct RingAmulet {
        uint8 level;
        uint32 lastLevelUpgradeTime;
    }

    function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external;
    function getPackedFighters(uint256[] calldata tokenIds) external view returns (uint256[] memory);
    function setBaseURI(string calldata uri) external;//onlyOwner
    function tokenURIs(uint256[] calldata tokenId) external view returns (string[] memory) ;
    function mintRingAmulet(address, uint256, bool ) external;//onlyAdmin  
    function mintFightClubForge(address _to, bytes memory _data, uint256 _size, uint256 _level, bool isFightClub) external;//onlyAdmin
    function batchMigrateFYakuza(address _to, uint256[] calldata v1TokenIds, FighterYakuza[] calldata oldFighters) external;//onlyAdmin 
    function checkUserBatchBalance(address user, uint256[] calldata tokenIds) external view returns (bool);
    function getNftIDsForUser(address , uint) external view returns (uint256[] memory);
    function getRingAmulet(uint256 ) external view returns (RingAmulet memory);
    function getFighter(uint256 tokenId) external view returns (FighterYakuza memory);
    function getFighters(uint256[] calldata) external view returns (FighterYakuza[] memory);
    function getForgeFightClub(uint256 tokenId) external view returns (ForgeFightClub memory);
    function getForgeFightClubs(uint256[] calldata tokenIds) external view returns (ForgeFightClub[] memory); 
    function levelUpFighters(uint256[] calldata, uint256[] calldata) external; // onlyAdmin
    function levelUpRingAmulets(uint256, uint256 ) external;
    function levelUpFightClubsForges(uint256[] calldata tokenIds, uint256[] calldata newSizes, uint256[] calldata newLevels) external returns (ForgeFightClub[] memory); // onlyAdmin
    function addAdmin(address) external; // onlyOwner 
    function removeAdmin(address) external; // onlyOwner
    function ttlFYakuzas() external view returns (uint256);
    function ttlFightClubs() external view returns (uint256);
    function ttlRings() external view returns (uint256);
    function ttlAmulets() external view returns (uint256);
    function ttlForges() external view returns (uint256);
    function setFightClubUnstakeTime (uint256 , bool) external;
    function setRaidTraitsFromPacked( uint256[] calldata raidStats) external;    
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
}
// File: contracts/interfaces/IUGRaid.sol



pragma solidity 0.8.13;


interface IUGRaid {

  struct Raid {
    uint8 levelTier;
    uint8 sizeTier;
    uint16 fightClubId;
    uint16 maxScars;
    uint32 maxSweat;
    uint32 id;
    uint32 revenue;
    uint32 timestamp;
  }

  struct RaiderEntry{
      uint8 size;
      uint8 yakFamily;
      uint32 sweat;
  }

  struct RaidEntryTicket {
    uint8 sizeTier;
    uint8 fighterLevel;
    uint8 yakuzaFamily;
    uint8 courage;
    uint8 brutality;
    uint8 cunning;
    uint8 knuckles;
    uint8 chains;
    uint8 butterfly;
    uint8 machete;
    uint8 katana;
    uint16 scars;
    uint32 sweat;
    uint32 fighterId;
    uint32 entryFee;
    uint32 winnings;
  }
  
  function referee() external;
  function enterRaid(uint256[] calldata, RaiderEntry[] calldata) external  returns(uint256 ttlBloodEntryFee);
  function stakeFightclubs(uint256[] calldata) external;
  function unstakeFightclubs(uint256[] calldata) external;
  function claimRaiderBloodRewards() external;
  function claimFightClubBloodRewards() external ;
  function addFightClubToQueueAfterLevelSizeUp(uint256, uint8, uint8, IUGNFTs.ForgeFightClub calldata ) external;
  function getStakedFightClubIDsForUser(address) external view returns (uint256[] memory);
  //function getRaidCost(uint256, uint256) external view returns(uint256);
  function getRaiderQueueLength(uint8, uint8) external view returns(uint8);
  //function getFightClubIdInQueuePosition(uint8, uint8, uint) external view returns (uint256);
  //function getRaiderIdInQueuePosition(uint8, uint8, uint) external view returns (uint256);
  //function setUnstakeCoolDownPeriod(uint256) external;//onlyOwner
  function getValueInBin(uint256 , uint256 , uint256 )external pure returns (uint256);
  function viewIfRaiderIsInQueue( uint256 tokenId) external view returns(bool);
  function setWeaponsRound(bool) external;//onlyOwner
  function setYakuzaRound(bool) external;//onlyOwner
  function setSweatRound(bool) external;//onlyOwner
  function setBaseRaidFee(uint256 newBaseFee) external; //onlyOwner
  function setRefereeBasePct(uint256 pct) external; //onlyOwner
  function setDevWallet(address) external;//onlyOwner
  function setDevFightClubId(uint256) external;//onlyOwner
  function addAdmin(address) external;//onlyOwner
  function removeAdmin(address) external;//onlyOwner
//   function viewRaiderOwnerBloodRewards(address) external view returns (uint256);
//   function viewFightClubOwnerBloodRewards(address) external view returns (uint256);
}
// File: contracts/ERC1155/utils/Ownable.sol


pragma solidity ^0.8.0;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address private _owner_;

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

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor () {
    _owner_ = msg.sender;
    emit OwnershipTransferred(address(0), _owner_);
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == _owner_, "Ownable#onlyOwner: SENDER_IS_NOT_OWNER");
    _;
  }

  /**
   * @notice Transfers the ownership of the contract to new address
   * @param _newOwner Address of the new owner
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    require(_newOwner != address(0), "Ownable#transferOwnership: INVALID_ADDRESS");
    emit OwnershipTransferred(_owner_, _newOwner);
    _owner_ = _newOwner;
  }

  /**
   * @notice Returns the address of the owner.
   */
  function owner() public view returns (address) {
    return _owner_;
  }
}
// File: contracts/utils/Address.sol


pragma solidity ^0.8.0;


/**
 * Utility library of inline functions on addresses
 */
library Address {

  // Default hash for EOA accounts returned by extcodehash
  bytes32 constant internal ACCOUNT_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract.
   * @param _address address of the account to check
   * @return Whether the target address is a contract
   */
  function isContract(address _address) internal view returns (bool) {
    bytes32 codehash;

    // Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address or if it has a non-zero code hash or account hash
    assembly { codehash := extcodehash(_address) }
    return (codehash != 0x0 && codehash != ACCOUNT_HASH);
  }
}
// File: contracts/interfaces/IERC165.sol


pragma solidity ^0.8.0;


/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {

    /**
     * @notice Query if a contract implements an interface
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas
     * @param _interfaceId The interface identifier, as specified in ERC-165
     */
    function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

// File: contracts/utils/ERC165.sol


pragma solidity ^0.8.0;


abstract contract ERC165 is IERC165 {
  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID`
   */
  function supportsInterface(bytes4 _interfaceID) virtual override public pure returns (bool) {
    return _interfaceID == this.supportsInterface.selector;
  }
}
// File: contracts/interfaces/IERC1155.sol


pragma solidity ^0.8.0;



interface IERC1155 is IERC165 {

  /****************************************|
  |                 Events                 |
  |_______________________________________*/

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);

  /**
   * @dev MUST emit when an approval is updated
   */
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

  /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);


  /****************************************|
  |                Functions               |
  |_______________________________________*/

  /**
    * @notice Transfers amount of an _id from the _from address to the _to address specified
    * @dev MUST emit TransferSingle event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    * @param _from    Source address
    * @param _to      Target address
    * @param _id      ID of the token type
    * @param _amount  Transfered amount
    * @param _data    Additional data with no specified format, sent in call to `_to`
    */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external;

  /**
    * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
    * @dev MUST emit TransferBatch event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if length of `_ids` is not the same as length of `_amounts`
    * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc)
    * @param _from     Source addresses
    * @param _to       Target addresses
    * @param _ids      IDs of each token type
    * @param _amounts  Transfer amounts per token type
    * @param _data     Additional data with no specified format, sent in call to `_to`
  */
  function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external;

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return        The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id) external view returns (uint256);

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders
   * @param _ids    ID of the Tokens
   * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
   */
  function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @dev MUST emit the ApprovalForAll event on success
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved) external;

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator);
}

// File: contracts/interfaces/IERC1155TokenReceiver.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC-1155 interface for accepting safe transfers.
 */
interface IERC1155TokenReceiver {

  /**
   * @notice Handle the receipt of a single ERC1155 token type
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value MUST result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _id        The id of the token being transferred
   * @param _amount    The amount of tokens being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
   */
  function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4);

  /**
   * @notice Handle the receipt of multiple ERC1155 token types
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value WILL result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeBatchTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _ids       An array containing ids of each token being transferred
   * @param _amounts   An array containing amounts of each token being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
   */
  function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4);
}

// File: contracts/ERC1155/tokens/UGPackedBalance/UGPackedBalance.sol


pragma solidity ^0.8.0;

//import "../../utils/SafeMath.sol";






/**
 * @dev Implementation of Multi-Token Standard contract. This implementation of the ERC-1155 standard
 *      utilizes the fact that balances of different token ids can be concatenated within individual
 *      uint256 storage slots. This allows the contract to batch transfer tokens more efficiently at
 *      the cost of limiting the maximum token balance each address can hold. This limit is
 *      2^IDS_BITS_SIZE, which can be adjusted below. In practice, using IDS_BITS_SIZE smaller than 16
 *      did not lead to major efficiency gains.
 */
contract UGPackedBalance is IERC1155, ERC165 {
  //using SafeMath for uint256;
  using Address for address;

  /***********************************|
  |        Variables and Events       |
  |__________________________________*/

  // onReceive function signatures
  bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61;
  bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81;

  // Constants regarding bin sizes for balance packing
  // IDS_BITS_SIZE **MUST** be a power of 2 (e.g. 2, 4, 8, 16, 32, 64, 128)
  //using 1 bit for UG nfts
  uint256 internal constant IDS_BITS_SIZE   = 1;                  // Max balance amount in bits per token ID
  uint256 internal constant IDS_PER_UINT256 = 256 / IDS_BITS_SIZE; // Number of ids per uint256
  
  uint256 internal constant USER_TOTAL_BALANCES_BITS_SIZE   = 32;

  error InvalidOperator();
  error InvalidRecipient();
  error InvalidOnReceiveMsg();
  error MismatchArrays();
 
  

  // Operations for _updateIDBalance
  enum Operations { Add, Sub }

  // Token IDs balances ; balances[address][id] => balance (using array instead of mapping for efficiency)
  mapping (address => mapping(uint256 => uint256)) internal balances;
  //map user address to packed uint256
  mapping (address => uint256) internal userTotalBalances;
  //map users to bin => Token IDs balances ; 

  // Operators
  mapping (address => mapping(address => bool)) internal operators;


  /***********************************|
  |     Public Transfer Functions     |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   * @param _data    Additional data with no specified format, sent in call to `_to`
   */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data)
    public virtual override
  {
    // Requirements
    if((msg.sender != _from) && !isApprovedForAll(_from, msg.sender)) revert InvalidOperator();
    if(_to == address(0)) revert InvalidRecipient();
    // require(_amount <= balances);  Not necessary since checked with _viewUpdateBinValue() checks

    _safeTransferFrom(_from, _to, _id, _amount);
    _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   * @param _data     Additional data with no specified format, sent in call to `_to`
   */
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    public virtual
  {
    // Requirements
    if((msg.sender != _from) && !isApprovedForAll(_from, msg.sender)) revert InvalidOperator();
    if(_to == address(0)) revert InvalidRecipient();

    _safeBatchTransferFrom(_from, _to, _ids, _amounts);
    _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data);
  }


  /***********************************|
  |    Internal Transfer Functions    |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   */
  function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount)
    internal
  {
    //Update balances
    _updateIDBalance(_from, _id, _amount, Operations.Sub); // Subtract amount from sender
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

    // Emit event
    emit TransferSingle(msg.sender, _from, _to, _id, _amount);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...)
   */
  function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Check if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received{gas:_gasLimit}(msg.sender, _from, _id, _amount, _data);
      if(retval != ERC1155_RECEIVED_VALUE) revert InvalidOnReceiveMsg();
    }
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   */
  function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    uint256 nTransfer = _ids.length; // Number of transfer to execute
    if(nTransfer != _amounts.length) revert MismatchArrays();

    if (_from != _to && nTransfer > 0) {

      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balFrom = _viewUpdateBinValue(balances[_from][bin],IDS_BITS_SIZE, index, _amounts[0], Operations.Sub);
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin], IDS_BITS_SIZE,index, _amounts[0], Operations.Add);

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_from][lastBin] = balFrom;
          balances[_to][lastBin] = balTo;

          balFrom = balances[_from][bin];
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balFrom = _viewUpdateBinValue(balFrom,IDS_BITS_SIZE, index, _amounts[i], Operations.Sub);
        balTo = _viewUpdateBinValue(balTo,IDS_BITS_SIZE, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_from][bin] = balFrom;
      balances[_to][bin] = balTo;

    // If transfer to self, just make sure all amounts are valid
    } else {
      for (uint256 i = 0; i < nTransfer; i++) {
        require(balanceOf(_from, _ids[i]) >= _amounts[i], " UNDERFLOW");
      }
    }
    //update type balances

    // Emit event
    emit TransferBatch(msg.sender, _from, _to, _ids, _amounts);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...)
   */
  function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived{gas: _gasLimit}(msg.sender, _from, _ids, _amounts, _data);
      if(retval != ERC1155_BATCH_RECEIVED_VALUE) revert InvalidOnReceiveMsg();
    }
  }


  /***********************************|
  |         Operator Functions        |
  |__________________________________*/

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved)
    external override
  {
    // Update operator status
    operators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator)
    public override view returns (bool isOperator)
  {
    return operators[_owner][_operator];
  }


  /***********************************|
  |     Public Balance Functions      |
  |__________________________________*/

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id)
    public virtual override view returns (uint256)
  {
    uint256 bin;
    uint256 index;

    //Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);
    return getValueInBin(balances[_owner][bin], IDS_BITS_SIZE, index);
  }

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders (sorted owners will lead to less gas usage)
   * @param _ids    ID of the Tokens (sorted ids will lead to less gas usage
   * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
    */
  function balanceOfBatch(address[] memory _owners, uint256[] memory _ids)
    public override virtual view returns (uint256[] memory)
  {
    uint256 n_owners = _owners.length;
    if(n_owners != _ids.length) revert MismatchArrays();

    // First values
    (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);
    uint256 balance_bin = balances[_owners[0]][bin];
    uint256 last_bin = bin;

    // Initialization
    uint256[] memory batchBalances = new uint256[](n_owners);
    batchBalances[0] = getValueInBin(balance_bin, IDS_BITS_SIZE, index);

    // Iterate over each owner and token ID
    for (uint256 i = 1; i < n_owners; i++) {
      (bin, index) = getIDBinIndex(_ids[i]);

      // SLOAD if bin changed for the same owner or if owner changed
      if (bin != last_bin || _owners[i-1] != _owners[i]) {
        balance_bin = balances[_owners[i]][bin];
        last_bin = bin;
      }

      batchBalances[i] = getValueInBin(balance_bin, IDS_BITS_SIZE, index);
    }

    return batchBalances;
  }


  /***********************************|
  |      Packed Balance Functions     |
  |__________________________________*/

  /**
   * @notice Update the balance of a id for a given address
   * @param _address    Address to update id balance
   * @param _id         Id to update balance of
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to id balance
   *   Operations.Sub: Substract _amount from id balance
   */
  function _updateIDBalance(address _address, uint256 _id, uint256 _amount, Operations _operation)
    internal
  {
    uint256 bin;
    uint256 index;

    // Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);

    // Update balance
    balances[_address][bin] = _viewUpdateBinValue(balances[_address][bin], IDS_BITS_SIZE, index, _amount, _operation);
  }

  function _updateIDUserTotalBalance(address _address, uint256 _index, uint256 _amount, Operations _operation)
    internal
  {
    // Update balance
    userTotalBalances[_address] = _viewUpdateBinValue(userTotalBalances[_address], USER_TOTAL_BALANCES_BITS_SIZE, _index, _amount, _operation);
  }

  /**
   * @notice Update a value in _binValues
   * @param _binValues  Uint256 containing values of size IDS_BITS_SIZE (the token balances)
   * @param _index      Index of the value in the provided bin
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to value in _binValues at _index
   *   Operations.Sub: Substract _amount from value in _binValues at _index
   */
  function _viewUpdateBinValue(uint256 _binValues, uint256 bitsize, uint256 _index, uint256 _amount, Operations _operation)
    internal pure returns (uint256 newBinValues)
  {
    uint256 shift = bitsize * _index;
    uint256 mask = (uint256(1) << bitsize) - 1;

    if (_operation == Operations.Add) {
      newBinValues = _binValues + (_amount << shift);
      require(newBinValues >= _binValues, " OVERFLOW2");
      require(
        ((_binValues >> shift) & mask) + _amount < 2**bitsize, // Checks that no other id changed
        "OVERFLOW1"
      );

    } else if (_operation == Operations.Sub) {
      newBinValues = _binValues - (_amount << shift);
      require(newBinValues <= _binValues, " UNDERFLOW");
      require(
        ((_binValues >> shift) & mask) >= _amount, // Checks that no other id changed
        "viewUpdtBinVal: UNDERFLOW"
      );

    } else {
      revert("viewUpdtBV: INVALID_WRITE"); // Bad operation
    }

    return newBinValues;
  }

  /**
  * @notice Return the bin number and index within that bin where ID is
  * @param _id  Token id
  * @return bin index (Bin number, ID"s index within that bin)
  */
  function getIDBinIndex(uint256 _id)
    public pure returns (uint256 bin, uint256 index)
  {
    bin = _id / IDS_PER_UINT256;
    index = _id % IDS_PER_UINT256;
    return (bin, index);
  }

  /**
   * @notice Return amount in _binValues at position _index
   * @param _binValues  uint256 containing the balances of IDS_PER_UINT256 ids
   * @param _index      Index at which to retrieve amount
   * @return amount at given _index in _bin
   */
  function getValueInBin(uint256 _binValues, uint256 bitsize, uint256 _index)
    public pure returns (uint256)
  {
    // require(_index < IDS_PER_UINT256) is not required since getIDBinIndex ensures `_index < IDS_PER_UINT256`

    // Mask to retrieve data for a given binData
    uint256 mask = (uint256(1) << bitsize) - 1;

    // Shift amount
    uint256 rightShift = bitsize * _index;
    return (_binValues >> rightShift) & mask;
  }


  /***********************************|
  |          ERC165 Functions         |
  |__________________________________*/

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override(ERC165, IERC165) virtual pure returns (bool) {
    if (_interfaceID == type(IERC1155).interfaceId) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }
}

// File: contracts/ERC1155/tokens/UGPackedBalance/UGMintBurnPackedBalance.sol


pragma solidity ^0.8.0;



/**
 * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume
 *      a parent contract to be executed as they are `internal` functions.
 */
contract UGMintBurnPackedBalance is UGPackedBalance {

  /****************************************|
  |            Minting Functions           |
  |_______________________________________*/

  /**
   * @notice Mint _amount of tokens of a given id
   * @param _to      The address to mint tokens to
   * @param _id      Token id to mint
   * @param _amount  The amount to be minted
   * @param _data    Data to pass if receiver is contract
   */
  function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data)
    internal
  {
    //Add _amount
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

    // Emit event
    emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount);

    // Calling onReceive method if recipient is contract
    _callonERC1155Received(address(0x0), _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Mint tokens for each (_ids[i], _amounts[i]) pair
   * @param _to       The address to mint tokens to
   * @param _ids      Array of ids to mint
   * @param _amounts  Array of amount of tokens to mint per id
   * @param _data    Data to pass if receiver is contract
   */
  function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    internal
  {
    if(_ids.length != _amounts.length) revert MismatchArrays();

    if (_ids.length > 0) {
      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin],IDS_BITS_SIZE, index, _amounts[0], Operations.Add);

      // Number of transfer to execute
      uint256 nTransfer = _ids.length;

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_to][lastBin] = balTo;
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balTo = _viewUpdateBinValue(balTo, IDS_BITS_SIZE, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_to][bin] = balTo;
    }

    // //Emit event
    emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts);

    // Calling onReceive method if recipient is contract
    _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, gasleft(), _data);
  }


  /****************************************|
  |            Burning Functions           |
  |_______________________________________*/

  /**
   * @notice Burn _amount of tokens of a given token id
   * @param _from    The address to burn tokens from
   * @param _id      Token id to burn
   * @param _amount  The amount to be burned
   */
  function _burn(address _from, uint256 _id, uint256 _amount)
    internal
  {
    // Substract _amount
    _updateIDBalance(_from, _id, _amount, Operations.Sub);

    // Emit event
    emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount);
  }

  /**
   * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair
   * @dev This batchBurn method does not implement the most efficient way of updating
   *      balances to reduce the potential bug surface as this function is expected to
   *      be less common than transfers. EIP-2200 makes this method significantly
   *      more efficient already for packed balances.
   * @param _from     The address to burn tokens from
   * @param _ids      Array of token ids to burn
   * @param _amounts  Array of the amount to be burned
   */
  function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    // Number of burning to execute
    uint256 nBurn = _ids.length;
    if(nBurn != _amounts.length) revert MismatchArrays();

    // Executing all burning
    for (uint256 i = 0; i < nBurn; i++) {
      // Update storage balance
      _updateIDBalance(_from,   _ids[i], _amounts[i], Operations.Sub); // Add amount to recipient
    }

    // Emit batch burn event
    emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts);
  }
}

// File: contracts/UGNFTs.sol


pragma solidity 0.8.13;






contract UGNFTs is UGMintBurnPackedBalance, IUGNFTs, Ownable {

  /*///////////////////////////////////////////////////////////////
                              TOKEN BASE  IDS
  //////////////////////////////////////////////////////////////*/

  uint16 constant RING = 5000;
  uint16 constant AMULET = 10000;
  uint16 constant FORGE = 15000;
  uint16 constant FIGHT_CLUB = 20000;
  uint32 constant FIGHTER = 100000;

  uint128 constant RING_MAX_SUPPLY = 4000;
  uint128 constant AMULET_MAX_SUPPLY = 4000;
  uint128 constant FORGE_MAX_SUPPLY = 2000;
  uint128 constant FIGHT_CLUB_MAX_SUPPLY = 2000;

  /*///////////////////////////////////////////////////////////////
                                 FIGHTERS
  //////////////////////////////////////////////////////////////*/  

   //user total balances bit indexes
  uint256 internal constant FIGHTER_INDEX  = 1;
  uint256 internal constant RING_INDEX  = 2;
  uint256 internal constant AMULET_INDEX  = 3;
  uint256 internal constant FORGE_INDEX  = 4;
  uint256 internal constant FIGHT_CLUB_INDEX  = 5;

  //maps id to packed fighter
  mapping(uint256 => uint256) public idToFYakuza;
  mapping(uint256 => ForgeFightClub) public idToForgeFightClub;
  mapping(uint256 => RingAmulet) public idToRingAmulet;

  uint256 public ttlRings;
  uint256 public ttlAmulets;
  uint256 public ttlFYakuzas;
  uint256 public ttlFightClubs;
  uint256 public ttlForges;

  /*///////////////////////////////////////////////////////////////
                              PRIVATE VARIABLES
  //////////////////////////////////////////////////////////////*/
  mapping(address => bool) private _admins;
  string public baseURI;

  /*///////////////////////////////////////////////////////////////
                                EVENTS
   //////////////////////////////////////////////////////////////*/
  event LevelUpFighter(uint256 indexed tokenId , uint256 indexed level, uint256 timestamp);
  event LevelUpRingAmulet(uint256 indexed tokenId , uint256 indexed level, uint256 timestamp);
  event LevelUpForgeFightClub(uint256 indexed tokenId , uint256 timestamp, uint256 indexed level, uint256 indexed size);
  event FighterYakuzaMigrated(uint256 indexed id, address indexed to, FighterYakuza fighter);
  event RingAmuletMinted(uint256 indexed id, address indexed to, RingAmulet ringAmulet);
  event ForgeFightClubMinted(uint256 indexed id, address indexed to, ForgeFightClub ffc);
  event RaidTraitsUpdated(uint256 indexed fighterId, FighterYakuza fighter);
  event FighterUpdated(uint256 indexed tokenId, FighterYakuza fighter);
  event FightClubUnstakeTimeUpdated(uint256 tokenId, uint256 timestamp);


  /*///////////////////////////////////////////////////////////////
                                ERRORS
  //////////////////////////////////////////////////////////////*/
  error Unauthorized();
  error InvalidTokenID(uint256 tokenId);
  error MaxSupplyReached();

  // set the base URI
  constructor(string memory uri, string memory __name, string memory __symbol)  {
    baseURI = uri;
    _name = __name;
    _symbol = __symbol;
  }

  /*///////////////////////////////////////////////////////////////
                    CONTRACT MANAGEMENT OPERATIONS
  //////////////////////////////////////////////////////////////*/


  modifier onlyAdmin() {
    if(!_admins[msg.sender]) revert Unauthorized();
    _;
  }

   function addAdmin(address addr) external onlyOwner {
    _admins[addr] = true;
  }

  function removeAdmin(address addr) external onlyOwner {
    delete _admins[addr];
  }

  function setBaseURI(string calldata uri) external onlyOwner {
    baseURI = uri;
  }

  /*///////////////////////////////////////////////////////////////
                    FIGHTER MIGRATION
  //////////////////////////////////////////////////////////////*/
  function batchMigrateFYakuza(
    address _to, 
    uint256[] calldata v1TokenIds,
    FighterYakuza[] calldata oldFighters
  ) external onlyAdmin {     
    if(v1TokenIds.length != oldFighters.length) revert MismatchArrays();

    uint256[] memory _ids = new uint256[](oldFighters.length);
    uint256[] memory _amounts = new uint256[](oldFighters.length);
    uint256 firstMintId = ttlFYakuzas + 1;
    // vars for packing
    uint256 newFighter;
    uint256 nextVal;
    for(uint i; i<oldFighters.length;i++){
      _ids[i] =  FIGHTER  + firstMintId++ ;
      _amounts[i] = 1;
        
      newFighter = oldFighters[i].isFighter ? 1 : 0;
      nextVal = 0;//setting all gen variables to 0
      newFighter |= nextVal<<1;
      nextVal = oldFighters[i].level;
      newFighter |= nextVal<<2;
      nextVal = oldFighters[i].isFighter ? 0 : oldFighters[i].rank;
      newFighter |= nextVal<<10;
      nextVal = oldFighters[i].courage;
      newFighter |= nextVal<<18;
      nextVal =  oldFighters[i].cunning;
      newFighter |= nextVal<<26;
      nextVal =  oldFighters[i].brutality;
      newFighter |= nextVal<<34;
      nextVal =  oldFighters[i].knuckles;
      newFighter |= nextVal<<42;
      nextVal =  oldFighters[i].chains;
      newFighter |= nextVal<<50;
      nextVal =  oldFighters[i].butterfly;
      newFighter |= nextVal<<58;
      nextVal =  oldFighters[i].machete;
      newFighter |= nextVal<<66;
      nextVal =  oldFighters[i].katana;
      newFighter |= nextVal<<74;
      nextVal =  oldFighters[i].Gen == 1 ? 0 : 100;
      newFighter |= nextVal<<90;
      //image id
      nextVal = v1TokenIds[i];
      newFighter |= nextVal<<106;
      //lastLevelUpgrade
      nextVal = block.timestamp;
      newFighter |= nextVal<<138;
      //lastRankUpgrade
      nextVal = block.timestamp;
      newFighter |= nextVal<<170;
      //lastRaidTime
      nextVal = block.timestamp;
      newFighter |= nextVal<<202;

      //add to array for first time (derived imageId from original v1 fighter)
      idToFYakuza[_ids[i]] = newFighter;

      emit FighterYakuzaMigrated(_ids[i], _to, unPackFighter(newFighter));
    }
    //update total fighter yakuzas
    ttlFYakuzas += oldFighters.length;
    //update fighter balance for user
    _updateIDUserTotalBalance(_to, FIGHTER_INDEX, v1TokenIds.length, Operations.Add); // Add amount to recipient
    _batchMint( _to,  _ids, _amounts, "");
  } 

  function mintRingAmulet(
    address _to, 
    uint256 _level, 
    bool isRing
  ) external onlyAdmin {
    
    uint256 _id;
    if(isRing){
      if(ttlRings >= RING_MAX_SUPPLY) revert MaxSupplyReached();
      _id = ++ttlRings + RING;

      //update ring balance for user
      _updateIDUserTotalBalance(_to, RING_INDEX, 1, Operations.Add);
    } else {
      if(ttlAmulets >= AMULET_MAX_SUPPLY) revert MaxSupplyReached();
      _id = ++ttlAmulets + AMULET;

      //update amulet balance for user
      _updateIDUserTotalBalance(_to, AMULET_INDEX, 1, Operations.Add);
    }

    RingAmulet memory traits;
    traits.level = uint8(_level);
    traits.lastLevelUpgradeTime = uint32(block.timestamp);
    idToRingAmulet[_id] = traits;

    _mint( _to,  _id, 1,  "");
    emit RingAmuletMinted(_id, _to, traits);
  }

  function mintFightClubForge(
    address _to, 
    bytes memory _data, 
    uint256 _size, 
    uint256 _level, 
    bool isFightClub
  ) external onlyAdmin {

    uint256 _id;
    if(isFightClub){
      if(ttlFightClubs >= FIGHT_CLUB_MAX_SUPPLY) revert MaxSupplyReached();
      _id = ++ttlFightClubs + FIGHT_CLUB;
      //update fight club balance for user
      _updateIDUserTotalBalance(_to, FIGHT_CLUB_INDEX, 1, Operations.Add);

    } else {
      if(ttlForges >= FORGE_MAX_SUPPLY) revert MaxSupplyReached();
      _id = ++ttlForges + FORGE;
      //update forge balance for user
      _updateIDUserTotalBalance(_to, FORGE_INDEX, 1, Operations.Add);
    }

    ForgeFightClub memory traits;
    traits.size = uint8(_size);
    traits.level = uint8(_level);
    traits.id = uint16(_id);
    traits.lastLevelUpgradeTime = uint32(block.timestamp);
    traits.owner = _to;
    idToForgeFightClub[_id] = traits;

    _mint( _to,  _id, 1,  _data);
    emit ForgeFightClubMinted(_id, _to, traits);
  }

  function levelUpFightClubsForges(
    uint256[] calldata tokenIds, 
    uint256[] calldata newSizes, 
    uint256[] calldata newLevels
  ) external onlyAdmin returns (ForgeFightClub[] memory) {
    if(tokenIds.length != newLevels.length) revert MismatchArrays();
    if(tokenIds.length != newSizes.length) revert MismatchArrays();
    ForgeFightClub[] memory traits = new ForgeFightClub[](tokenIds.length);

    for(uint i =0; i<tokenIds.length;i++){
      traits[i] = idToForgeFightClub[tokenIds[i]];
      //0 means no change to trait     
      traits[i].size = (newSizes[i] != 0) ? uint8(newSizes[i]) : traits[i].size;       
      traits[i].level = (newLevels[i] != 0) ? uint8(newLevels[i]) : traits[i].level;
      traits[i].lastLevelUpgradeTime = uint32(block.timestamp);      
      
      idToForgeFightClub[tokenIds[i]] = traits[i];  
    
      emit LevelUpForgeFightClub(tokenIds[i], block.timestamp, traits[i].level, traits[i].size);
    }
    return traits;
  }

  function levelUpRingAmulets(
    uint256 tokenId, 
    uint256 newLevel
  ) external onlyAdmin {
    
    RingAmulet memory traits ;
    traits.level = uint8(newLevel);
    traits.lastLevelUpgradeTime = uint32(block.timestamp);
    idToRingAmulet[tokenId] = traits;
    
    emit LevelUpRingAmulet(tokenId, traits.level, block.timestamp);
  }

  function levelUpFighters(uint256[] calldata tokenIds, uint256[] calldata levels) external onlyAdmin {
    if(tokenIds.length != levels.length) revert MismatchArrays();

    FighterYakuza memory fy;
    for(uint i =0; i<tokenIds.length;i++){
      fy = unPackFighter(idToFYakuza[tokenIds[i]]);
      if(fy.isFighter){
        fy.level = uint8(levels[i]);
        fy.lastLevelUpgradeTime = uint32(block.timestamp);
        idToFYakuza[tokenIds[i]] = packFighter(fy);
        emit LevelUpFighter(tokenIds[i], fy.level, block.timestamp);
      }
    }
  }

  function setRaidTraitsFromPacked(uint256[] memory packedTickets) external onlyAdmin {
    IUGRaid.RaidEntryTicket memory ticket;
    FighterYakuza memory FY;
    for(uint i =0; i<packedTickets.length;i++){
      ticket = unpackTicket(packedTickets[i]);
      
      if(ticket.fighterId > FIGHTER + ttlFYakuzas ||
        ticket.fighterId <= FIGHTER) revert InvalidTokenID({tokenId: ticket.fighterId});

      FY = unPackFighter(idToFYakuza[ticket.fighterId]);
      FY.brutality = ticket.brutality;
      FY.courage = ticket.courage;
      FY.cunning = ticket.cunning;
      FY.scars = ticket.scars;
      FY.knuckles = ticket.knuckles;
      FY.chains = ticket.chains;
      FY.butterfly = ticket.butterfly;
      FY.machete = ticket.machete;
      FY.katana = ticket.katana;
      FY.lastRaidTime = uint32(block.timestamp);
      //broken weapons scores will have modulo 10 (%10) = 1
      idToFYakuza[ticket.fighterId] = packFighter(FY);

      emit RaidTraitsUpdated(ticket.fighterId, FY);
    }
  }

  function getNftIDsForUser(address user, uint nftIndex) external view returns (uint256[] memory){
    //which nft?
    uint prefix;
    uint ttlNfts;
    if(nftIndex == FIGHTER_INDEX){
      prefix = FIGHTER;
      ttlNfts = ttlFYakuzas;
    }
    if(nftIndex == RING_INDEX){
      prefix = RING;
      ttlNfts = ttlRings;
    }
    if(nftIndex == AMULET_INDEX){
      prefix = AMULET;
      ttlNfts = ttlAmulets;
    }
    if(nftIndex == FIGHT_CLUB_INDEX){
      prefix = FIGHT_CLUB;
      ttlNfts = ttlFightClubs;
    }
    if(nftIndex == FORGE_INDEX){
      prefix = FORGE;
      ttlNfts = ttlForges;
    }
    //get balance of nfts
    uint256 num = getValueInBin(userTotalBalances[user], USER_TOTAL_BALANCES_BITS_SIZE, nftIndex);
    uint256[] memory _tokenIds = new uint256[](num);
    //loop through user balances until we find all the rings
    uint count;
    for(uint i=1; count<num && i <= ttlNfts; i++){
      if(balanceOf(user, prefix + i) ==1){
        _tokenIds[count] = prefix + i;
        count++;
      }
    }
    return _tokenIds;
  }

  function getForgeFightClubs(uint256[] calldata tokenIds) external view returns (ForgeFightClub[] memory){
    ForgeFightClub[] memory ffc = new ForgeFightClub[](tokenIds.length);
    for (uint i = 0; i < tokenIds.length; i++) {
      ffc[i] = idToForgeFightClub[tokenIds[i]];
    }
    return ffc;
  }

  function getForgeFightClub(uint256 tokenId) external view returns (ForgeFightClub memory){
    return idToForgeFightClub[tokenId];
  }

  function setFighter( uint256 tokenId, FighterYakuza memory FY) external onlyAdmin {
    idToFYakuza[tokenId] = packFighter(FY);
    emit FighterUpdated(tokenId, FY);
  }

  function setFightClubUnstakeTime (uint256 tokenId, bool isUnstaking) external onlyAdmin {
    idToForgeFightClub[tokenId].lastUnstakeTime = isUnstaking ? uint32(block.timestamp) : 0;
    emit FightClubUnstakeTimeUpdated(tokenId, block.timestamp);
  }

  function getFighters(uint256[] calldata tokenIds) external view returns (FighterYakuza[] memory){
    FighterYakuza[] memory FY = new FighterYakuza[](tokenIds.length);
    for (uint i = 0; i < tokenIds.length; i++) {
      FY[i] = unPackFighter(idToFYakuza[tokenIds[i]]);
    }
    return FY;
  }

  function getFighter(uint256 tokenId) external view returns (FighterYakuza memory){   
    return unPackFighter(idToFYakuza[tokenId]);    
  }

  function getPackedFighters(uint256[] calldata tokenIds) external view returns (uint256[] memory){
    uint256[] memory _packedFighters = new uint256[](tokenIds.length);
    for (uint i = 0; i < tokenIds.length; i++) {
      if(tokenIds[i] > FIGHTER + ttlFYakuzas || tokenIds[i] <= FIGHTER) revert InvalidTokenID({tokenId: tokenIds[i]});
      _packedFighters[i] = idToFYakuza[tokenIds[i]];
    }
    return _packedFighters;
  }

  function getRingAmulet(uint256 tokenId) external view returns (RingAmulet memory) {
    return idToRingAmulet[tokenId];
  }

  function safeTransferFrom(
    address _from, 
    address _to, 
    uint256 _id, 
    uint256 _amount, 
    bytes memory _data
  ) public override {
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), " INVALID_OPERATOR");
    require(_to != address(0)," INVALID_RECIPIENT");
   
    if(_id > RING && _id <= RING + ttlRings) {
        _updateIDUserTotalBalance(_to, RING_INDEX, _amount, Operations.Add);
        _updateIDUserTotalBalance(_from, RING_INDEX, _amount, Operations.Sub);
      }
      if(_id > AMULET && _id <= AMULET + ttlAmulets){
        _updateIDUserTotalBalance(_to, AMULET_INDEX, _amount, Operations.Add);
        _updateIDUserTotalBalance(_from, AMULET_INDEX, _amount, Operations.Sub); 
      }
      if(_id > FIGHTER && _id <= FIGHTER + ttlFYakuzas) {
        _updateIDUserTotalBalance(_to, FIGHTER_INDEX, _amount, Operations.Add); // Add amount to recipient
        _updateIDUserTotalBalance(_from, FIGHTER_INDEX, _amount, Operations.Sub); // Add amount to recipient
      }
      if(_id > FIGHT_CLUB && _id <= FIGHT_CLUB + ttlFightClubs) {
        _updateIDUserTotalBalance(_to, FIGHT_CLUB_INDEX, _amount, Operations.Add); // Add amount to recipient
        _updateIDUserTotalBalance(_from, FIGHT_CLUB_INDEX, _amount, Operations.Sub); // Add amount to recipient
        idToForgeFightClub[_id].owner = _to;
      }
      if(_id > FORGE && _id <= FORGE + ttlForges) {
        _updateIDUserTotalBalance(_to, FORGE_INDEX, _amount, Operations.Add); // Add amount to recipient
        _updateIDUserTotalBalance(_from, FORGE_INDEX, _amount, Operations.Sub); // Add amount to recipient
        idToForgeFightClub[_id].owner = _to;
      }

    _safeTransferFrom(_from, _to, _id, _amount);
    _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data);
  }

  function safeBatchTransferFrom(
    address _from, 
    address _to, 
    uint256[] calldata _ids, 
    uint256[] calldata _amounts,
    bytes memory _data
  ) public override (UGPackedBalance, IUGNFTs){
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), " INVALID_OPERATOR");
    require(_to != address(0)," INVALID_RECIPIENT");
    uint256 _index;

    for(uint i = 0; i < _ids.length; i++){
      if(_ids[i] > RING && _ids[i] <= RING + ttlRings){
        _index = RING_INDEX;
      } 
      if(_ids[i] > AMULET && _ids[i] <= AMULET + ttlAmulets) {
        _index = AMULET_INDEX;
      }
      if(_ids[i] > FIGHTER && _ids[i] <= FIGHTER + ttlFYakuzas) _index = FIGHTER_INDEX;
      if(_ids[i] > FIGHT_CLUB && _ids[i]<= FIGHT_CLUB + ttlFightClubs) {
        _index = FIGHT_CLUB_INDEX;
        idToForgeFightClub[_ids[i]].owner = _to;
      }
      if(_ids[i] > FORGE && _ids[i] <= FORGE + ttlForges) {
        _index = FORGE_INDEX;
        idToForgeFightClub[_ids[i]].owner = _to;
      }

      _updateIDUserTotalBalance(_to, _index, _amounts[i], Operations.Add);
      _updateIDUserTotalBalance(_from, _index, _amounts[i], Operations.Sub);  
    }

    _safeBatchTransferFrom(_from, _to, _ids, _amounts);
    _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data);
  }

  function checkUserBatchBalance(address user, uint256[] calldata tokenIds) external view returns (bool){
    for (uint i = 0; i < tokenIds.length;i++){
      uint256 bal = balanceOf(user, tokenIds[i]);
      if(bal == 0) revert InvalidTokenID({tokenId: tokenIds[i]});
    }
    return true;
  }

  string private _name;
  string private _symbol;

  function name() external view returns (string memory){
    return _name;
  }

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
   // function tokenURI(uint256 tokenId) external view returns (string memory);

  function tokenURIs(uint256[] calldata tokenIds) external view returns (string[] memory) {
    string memory jsonString;
    string memory fyakuza;
    string memory imageId;
    string[] memory uris = new string[](tokenIds.length);

    for(uint256 i; i<tokenIds.length;i++){
      //if fighter
      if(tokenIds[i] > FIGHTER && tokenIds[i] <= FIGHTER + ttlFYakuzas) {
        FighterYakuza memory traits = unPackFighter(idToFYakuza[tokenIds[i]]);
        if (traits.imageId != 0) {
          imageId = Strings.toString(traits.imageId);
          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(tokenIds[i]),',',
          Strings.toString((traits.isFighter)? 1 : 0),',',
          Strings.toString(traits.Gen),',',
          Strings.toString(traits.cunning),',',
          Strings.toString(traits.brutality),','
          ));

          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(traits.courage),',',
          Strings.toString(traits.level),',',
          Strings.toString(traits.lastLevelUpgradeTime),',',
          Strings.toString(traits.rank),',',
          Strings.toString(traits.lastRaidTime),','
          ));

          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(traits.scars),',',
          Strings.toString(traits.knuckles),',',
          Strings.toString(traits.chains),',',
          Strings.toString(traits.butterfly),',',
          Strings.toString(traits.machete),',',
          Strings.toString(traits.katana)
          ));
        }

        fyakuza = traits.isFighter ? "fighteryakuza/fighter/" : "fighteryakuza/yakuza/";

        uris[i] = string(abi.encodePacked(
          baseURI,
          fyakuza,
          imageId,
          ".png",
          "?traits=",
          jsonString
        ));
      }

      //if ring
      if(tokenIds[i] > RING && tokenIds[i] <= RING + ttlRings) {
        RingAmulet memory traits = idToRingAmulet[tokenIds[i]];
        if (traits.lastLevelUpgradeTime != 0) {
          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(traits.level),',',
          Strings.toString(traits.lastLevelUpgradeTime)
          ));
        }

        uris[i] = string(abi.encodePacked(
          baseURI,
          "ring/ring.png",
          "?traits=",
          jsonString
        ));
      }

      //if amulet
      if(tokenIds[i] > AMULET && tokenIds[i] <= AMULET + ttlAmulets) {
        RingAmulet memory traits = idToRingAmulet[tokenIds[i]];
        if (traits.lastLevelUpgradeTime != 0) {
          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(traits.level),',',
          Strings.toString(traits.lastLevelUpgradeTime)
          ));
        }

        uris[i] = string(abi.encodePacked(
          baseURI,
          "amulet/amulet.png",
          "?traits=",
          jsonString
        ));
      }

    //if forge or fight club
      if( (tokenIds[i] > FORGE && tokenIds[i] <= FORGE + ttlForges) ||
          (tokenIds[i] > FIGHT_CLUB && tokenIds[i] <= FIGHT_CLUB + ttlFightClubs) ){
        //get forge / fight club
        ForgeFightClub memory traits = idToForgeFightClub[tokenIds[i]];
        //if Fight Club
        if(tokenIds[i] > FIGHT_CLUB && tokenIds[i] <= FIGHT_CLUB + ttlFightClubs){
          //using imageId as a holder variable for url segment
          imageId = string(abi.encodePacked('fightclub/',Strings.toString(tokenIds[i]))) ;//replace with fight club image id
        }
        //if forge
        if(tokenIds[i] > FORGE && tokenIds[i] <= FORGE + ttlForges){
          //using imageId as a holder variable for url segment
          imageId = string(abi.encodePacked('forge/',Strings.toString(traits.size))) ;//replace with fight club image id
        }

        if (traits.lastLevelUpgradeTime != 0) {
          jsonString = string(abi.encodePacked(
          jsonString,
          Strings.toString(traits.id),',',
          Strings.toString(traits.level),',',
          Strings.toString(traits.size),',',
          Strings.toString(traits.lastLevelUpgradeTime),',',
          Strings.toString(traits.lastUnstakeTime)
          ));
        }

        uris[i] = string(abi.encodePacked(
          baseURI,
          imageId,
          ".png",
          "?traits=",
          jsonString
        ));
      }
    }

    return uris;
  }

   function unPackFighter(uint256 packedFighter) private pure returns (FighterYakuza memory) {
    FighterYakuza memory fighter;   
    fighter.isFighter = uint8(packedFighter)%2 == 1 ? true : false;
    fighter.Gen = uint8(packedFighter>>1)%2 ;
    fighter.level = uint8(packedFighter>>2);
    fighter.rank = uint8(packedFighter>>10);
    fighter.courage = uint8(packedFighter>>18);
    fighter.cunning = uint8(packedFighter>>26);
    fighter.brutality = uint8(packedFighter>>34);
    fighter.knuckles = uint8(packedFighter>>42);
    fighter.chains = uint8(packedFighter>>50);
    fighter.butterfly = uint8(packedFighter>>58);
    fighter.machete = uint8(packedFighter>>66);
    fighter.katana = uint8(packedFighter>>74);
    fighter.scars = uint16(packedFighter>>90);
    fighter.imageId = uint16(packedFighter>>106);
    fighter.lastLevelUpgradeTime = uint32(packedFighter>>138);
    fighter.lastRankUpgradeTime = uint32(packedFighter>>170);
    fighter.lastRaidTime = uint32(packedFighter>>202);
    return fighter;
  }

  function packFighter(FighterYakuza memory unPackedFighter) private pure returns (uint256 ){
    uint256 packedFighter = unPackedFighter.isFighter ? 1 : 0;
      uint256 nextVal = unPackedFighter.Gen;
      packedFighter |= nextVal<<1;
      nextVal = unPackedFighter.level;
      packedFighter |= nextVal<<2;
      nextVal = unPackedFighter.isFighter ? 0 : unPackedFighter.rank;
      packedFighter |= nextVal<<10;
      nextVal = unPackedFighter.courage;
      packedFighter |= nextVal<<18;
      nextVal =  unPackedFighter.cunning;
      packedFighter |= nextVal<<26;
      nextVal =  unPackedFighter.brutality;
      packedFighter |= nextVal<<34;
      nextVal =  unPackedFighter.knuckles;
      packedFighter |= nextVal<<42;
      nextVal =  unPackedFighter.chains;
      packedFighter |= nextVal<<50;
      nextVal =  unPackedFighter.butterfly;
      packedFighter |= nextVal<<58;
      nextVal =  unPackedFighter.machete;
      packedFighter |= nextVal<<66;
      nextVal =  unPackedFighter.katana;
      packedFighter |= nextVal<<74;
      nextVal =  unPackedFighter.scars;
      packedFighter |= nextVal<<90;
      //image id
      nextVal = unPackedFighter.imageId;
      packedFighter |= nextVal<<106;
      //lastLevelUpgrade
      nextVal = unPackedFighter.lastLevelUpgradeTime;
      packedFighter |= nextVal<<138;
      //lastRankUpgrade
      nextVal = unPackedFighter.lastRankUpgradeTime;
      packedFighter |= nextVal<<170;
      //lastRaidTime
      nextVal = unPackedFighter.lastRaidTime;
      packedFighter |= nextVal<<202;
      return packedFighter;
  }

   function unpackTicket(uint256 packedTicket) 
    private pure returns (IUGRaid.RaidEntryTicket memory _ticket)
  {
      _ticket.sizeTier = uint8(packedTicket);
      _ticket.fighterLevel = uint8(packedTicket>>8);
      _ticket.yakuzaFamily = uint8(packedTicket>>16);
      _ticket.courage = uint8(packedTicket>>24);
      _ticket.brutality = uint8(packedTicket>>32);
      _ticket.cunning = uint8(packedTicket>>40);
      _ticket.knuckles = uint8(packedTicket>>48);
      _ticket.chains = uint8(packedTicket>>56);
      _ticket.butterfly = uint8(packedTicket>>64);
      _ticket.machete = uint8(packedTicket>>72);
      _ticket.katana = uint8(packedTicket>>80);
      _ticket.scars = uint16(packedTicket>>96);
      _ticket.sweat = uint32(packedTicket>>128);
      _ticket.fighterId = uint32(packedTicket>>160);
      _ticket.entryFee = uint32(packedTicket>>192);
      return _ticket;
  }

  /*///////////////////////////////////////////////////////////////
                       ERC165 FUNCTIONS
  //////////////////////////////////////////////////////////////*/
  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override(UGPackedBalance) virtual pure returns (bool) {
    if (_interfaceID == 0xd9b67a26 ||
        _interfaceID == 0x0e89341c) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }

  //////////////////////////////////////
  //      Unsupported Functions       //
  /////////////////////////////////////

  fallback () external {
    revert("UGNFTs: INVALID_METHOD");
  }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"__name","type":"string"},{"internalType":"string","name":"__symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidOnReceiveMsg","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"InvalidTokenID","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MismatchArrays","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FightClubUnstakeTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"indexed":false,"internalType":"struct IUGNFTs.FighterYakuza","name":"fighter","type":"tuple"}],"name":"FighterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"indexed":false,"internalType":"struct IUGNFTs.FighterYakuza","name":"fighter","type":"tuple"}],"name":"FighterYakuzaMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastUnstakeTime","type":"uint32"},{"internalType":"address","name":"owner","type":"address"}],"indexed":false,"internalType":"struct IUGNFTs.ForgeFightClub","name":"ffc","type":"tuple"}],"name":"ForgeFightClubMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LevelUpFighter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"size","type":"uint256"}],"name":"LevelUpForgeFightClub","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LevelUpRingAmulet","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":"uint256","name":"fighterId","type":"uint256"},{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"indexed":false,"internalType":"struct IUGNFTs.FighterYakuza","name":"fighter","type":"tuple"}],"name":"RaidTraitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"}],"indexed":false,"internalType":"struct IUGNFTs.RingAmulet","name":"ringAmulet","type":"tuple"}],"name":"RingAmuletMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"v1TokenIds","type":"uint256[]"},{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"internalType":"struct IUGNFTs.FighterYakuza[]","name":"oldFighters","type":"tuple[]"}],"name":"batchMigrateFYakuza","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"checkUserBatchBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFighter","outputs":[{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"internalType":"struct IUGNFTs.FighterYakuza","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getFighters","outputs":[{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"internalType":"struct IUGNFTs.FighterYakuza[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getForgeFightClub","outputs":[{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastUnstakeTime","type":"uint32"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct IUGNFTs.ForgeFightClub","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getForgeFightClubs","outputs":[{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastUnstakeTime","type":"uint32"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct IUGNFTs.ForgeFightClub[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getIDBinIndex","outputs":[{"internalType":"uint256","name":"bin","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"nftIndex","type":"uint256"}],"name":"getNftIDsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getPackedFighters","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRingAmulet","outputs":[{"components":[{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"}],"internalType":"struct IUGNFTs.RingAmulet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_binValues","type":"uint256"},{"internalType":"uint256","name":"bitsize","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getValueInBin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToFYakuza","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToForgeFightClub","outputs":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastUnstakeTime","type":"uint32"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToRingAmulet","outputs":[{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newSizes","type":"uint256[]"},{"internalType":"uint256[]","name":"newLevels","type":"uint256[]"}],"name":"levelUpFightClubsForges","outputs":[{"components":[{"internalType":"uint8","name":"size","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastUnstakeTime","type":"uint32"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct IUGNFTs.ForgeFightClub[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"levels","type":"uint256[]"}],"name":"levelUpFighters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"levelUpRingAmulets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_level","type":"uint256"},{"internalType":"bool","name":"isFightClub","type":"bool"}],"name":"mintFightClubForge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_level","type":"uint256"},{"internalType":"bool","name":"isRing","type":"bool"}],"name":"mintRingAmulet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isUnstaking","type":"bool"}],"name":"setFightClubUnstakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"bool","name":"isFighter","type":"bool"},{"internalType":"uint8","name":"Gen","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"uint8","name":"courage","type":"uint8"},{"internalType":"uint8","name":"cunning","type":"uint8"},{"internalType":"uint8","name":"brutality","type":"uint8"},{"internalType":"uint8","name":"knuckles","type":"uint8"},{"internalType":"uint8","name":"chains","type":"uint8"},{"internalType":"uint8","name":"butterfly","type":"uint8"},{"internalType":"uint8","name":"machete","type":"uint8"},{"internalType":"uint8","name":"katana","type":"uint8"},{"internalType":"uint16","name":"scars","type":"uint16"},{"internalType":"uint16","name":"imageId","type":"uint16"},{"internalType":"uint32","name":"lastLevelUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRankUpgradeTime","type":"uint32"},{"internalType":"uint32","name":"lastRaidTime","type":"uint32"}],"internalType":"struct IUGNFTs.FighterYakuza","name":"FY","type":"tuple"}],"name":"setFighter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"packedTickets","type":"uint256[]"}],"name":"setRaidTraitsFromPacked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"tokenURIs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ttlAmulets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttlFYakuzas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttlFightClubs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttlForges","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ttlRings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200619838038062006198833981016040819052620000349162000232565b600380546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a382516200008990600d906020860190620000bf565b5081516200009f90600e906020850190620000bf565b508051620000b590600f906020840190620000bf565b50505050620002ff565b828054620000cd90620002c3565b90600052602060002090601f016020900481019282620000f157600085556200013c565b82601f106200010c57805160ff19168380011785556200013c565b828001600101855582156200013c579182015b828111156200013c5782518255916020019190600101906200011f565b506200014a9291506200014e565b5090565b5b808211156200014a57600081556001016200014f565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018d57600080fd5b81516001600160401b0380821115620001aa57620001aa62000165565b604051601f8301601f19908116603f01168101908282118183101715620001d557620001d562000165565b81604052838152602092508683858801011115620001f257600080fd5b600091505b83821015620002165785820183015181830184015290820190620001f7565b83821115620002285760008385830101525b9695505050505050565b6000806000606084860312156200024857600080fd5b83516001600160401b03808211156200026057600080fd5b6200026e878388016200017b565b945060208601519150808211156200028557600080fd5b62000293878388016200017b565b93506040860151915080821115620002aa57600080fd5b50620002b9868287016200017b565b9150509250925092565b600181811c90821680620002d857607f821691505b602082108103620002f957634e487b7160e01b600052602260045260246000fd5b50919050565b615e89806200030f6000396000f3fe608060405234801561001057600080fd5b50600436106102685760003560e01c80638da5cb5b11610151578063d0affedf116100c3578063deb8dbfc11610087578063deb8dbfc146106f8578063e985e9c51461070b578063f242432a1461071e578063f2fde38b14610731578063f80b501814610744578063fc274a701461075757610268565b8063d0affedf1461068e578063d71fe665146106a1578063dabe7832146106b4578063db90e83c146106bd578063dd5439db146106e557610268565b8063a16ba80411610115578063a16ba80414610542578063a22cb46514610555578063b981839814610568578063c38e22651461061a578063c8be4fc61461062d578063ccbc33281461064057610268565b80638da5cb5b146104e35780638f0cd160146104fe57806395d89b41146105075780639b20b5941461050f5780639d49e3311461052f57610268565b80634e1273f4116101ea5780636cc8d8cf116101ae5780636cc8d8cf146103fa578063704802751461041a5780637088a9fa1461042d57806372d8c2b21461043657806383fd1bac14610449578063889fa1dc146104c357610268565b80634e1273f4146103b057806355f804b3146103c35780636500ece0146103d65780636a535ed4146103e95780636c0360eb146103f257610268565b80631f414911116102315780631f414911146103415780632eb2c2d6146103615780633039f3711461037457806333210ee61461037d5780633c4983a31461039057610268565b8062fdd58e146102ae57806301ffc9a7146102d457806306fdde03146102f75780631785f53c1461030c5780631cb62dcc14610321575b60405162461bcd60e51b81526020600482015260166024820152751551d391951cce881253959053125117d351551213d160521b60448201526064015b60405180910390fd5b6102c16102bc36600461483f565b610777565b6040519081526020015b60405180910390f35b6102e76102e2366004614882565b6107c3565b60405190151581526020016102cb565b6102ff61080a565b6040516102cb91906148f7565b61031f61031a36600461490a565b61089c565b005b61033461032f366004614925565b6108e7565b6040516102cb9190614996565b61035461034f3660046149ef565b61096b565b6040516102cb9190614b5d565b61031f61036f366004614c8a565b610a3a565b6102c160085481565b61031f61038b366004614d85565b610e98565b6103a361039e3660046149ef565b610f20565b6040516102cb9190614f31565b6103a36103be366004614fc7565b611058565b61031f6103d1366004615086565b611298565b61031f6103e43660046150f7565b6112d3565b6102c1600a5481565b6102ff6114e8565b61040d6104083660046149ef565b611576565b6040516102cb919061512b565b61031f61042836600461490a565b611e76565b6102c160075481565b61031f61044436600461518d565b611ec4565b61049f610457366004614925565b60408051808201909152600080825260208201525060009081526006602090815260409182902082518084019093525460ff81168352610100900463ffffffff169082015290565b60408051825160ff16815260209283015163ffffffff1692810192909252016102cb565b6104d66104d1366004614925565b612179565b6040516102cb91906151fe565b6003546040516001600160a01b0390911681526020016102cb565b6102c1600b5481565b6102ff612199565b61052261051d3660046149ef565b6121a8565b6040516102cb919061520d565b61031f61053d36600461524f565b6122d6565b6103a361055036600461483f565b61248e565b61031f61056336600461528b565b6125dd565b6105ce610576366004614925565b60056020526000908152604090205460ff8082169161010081049091169061ffff620100008204169063ffffffff6401000000008204811691600160401b8104909116906001600160a01b03600160601b9091041686565b6040805160ff978816815296909516602087015261ffff9093169385019390935263ffffffff908116606085015290911660808301526001600160a01b031660a082015260c0016102cb565b6102e76106283660046152be565b612649565b61031f61063b366004615310565b6126b3565b61067061064e366004614925565b60066020526000908152604090205460ff811690610100900463ffffffff1682565b6040805160ff909316835263ffffffff9091166020830152016102cb565b61031f61069c36600461537b565b612815565b61031f6106af36600461539d565b6128cf565b6102c160095481565b6106d06106cb366004614925565b612e61565b604080519283526020830191909152016102cb565b6102c16106f336600461544b565b612e9b565b61031f610706366004615477565b612ec6565b6102e761071936600461549a565b612f81565b61031f61072c3660046154c4565b612faf565b61031f61073f36600461490a565b613213565b610522610752366004615535565b613302565b6102c1610765366004614925565b60046020526000908152604090205481565b600080600061078584612e61565b6001600160a01b03871660009081526020818152604080832085845290915290205491935091506107b890600183612e9b565b925050505b92915050565b6000636cdb3d1360e11b6001600160e01b0319831614806107f457506303a24d0760e21b6001600160e01b03198316145b1561080157506001919050565b6107bd8261376e565b6060600e8054610819906155ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610845906155ce565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b6003546001600160a01b031633146108c65760405162461bcd60e51b81526004016102a590615608565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6108ef614645565b50600090815260056020908152604091829020825160c081018452905460ff80821683526101008204169282019290925261ffff620100008304169281019290925263ffffffff640100000000820481166060840152600160401b82041660808301526001600160a01b03600160601b9091041660a082015290565b60606000826001600160401b0381111561098757610987614bac565b6040519080825280602002602001820160405280156109c057816020015b6109ad61467a565b8152602001906001900390816109a55790505b50905060005b83811015610a3257610a02600460008787858181106109e7576109e761564e565b905060200201358152602001908152602001600020546137a9565b828281518110610a1457610a1461564e565b60200260200101819052508080610a2a9061567a565b9150506109c6565b509392505050565b336001600160a01b0388161480610a565750610a568733612f81565b610a965760405162461bcd60e51b81526020600482015260116024820152701024a72b20a624a22fa7a822a920aa27a960791b60448201526064016102a5565b6001600160a01b038616610ae15760405162461bcd60e51b8152602060048201526012602482015271081253959053125117d49150d2541251539560721b60448201526064016102a5565b6000805b85811015610dae57611388878783818110610b0257610b0261564e565b90506020020135118015610b3c5750600754610b2090611388615693565b878783818110610b3257610b3261564e565b9050602002013511155b15610b4657600291505b612710878783818110610b5b57610b5b61564e565b90506020020135118015610b955750600854610b7990612710615693565b878783818110610b8b57610b8b61564e565b9050602002013511155b15610b9f57600391505b620186a0878783818110610bb557610bb561564e565b90506020020135118015610bf05750600954610bd490620186a0615693565b878783818110610be657610be661564e565b9050602002013511155b15610bfa57600191505b614e20878783818110610c0f57610c0f61564e565b90506020020135118015610c495750600a54610c2d90614e20615693565b878783818110610c3f57610c3f61564e565b9050602002013511155b15610ca657600591508760056000898985818110610c6957610c6961564e565b905060200201358152602001908152602001600020600001600c6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b613a98878783818110610cbb57610cbb61564e565b90506020020135118015610cf55750600b54610cd990613a98615693565b878783818110610ceb57610ceb61564e565b9050602002013511155b15610d5257600491508760056000898985818110610d1557610d1561564e565b905060200201358152602001908152602001600020600001600c6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b610d778883878785818110610d6957610d6961564e565b9050602002013560006138be565b610d9c8983878785818110610d8e57610d8e61564e565b9050602002013560016138be565b80610da68161567a565b915050610ae5565b50610e1e888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525061390892505050565b610e8e888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a9182918501908490808284376000920191909152505050505a87613c38565b5050505050505050565b336000908152600c602052604090205460ff16610ec7576040516282b42960e81b815260040160405180910390fd5b610ed081613d06565b60008381526004602052604090819020919091555182907f1c15c2a9cc845e273034ca895f38396680a0d26841ea332c9eaf12a475c40b6590610f149084906151fe565b60405180910390a25050565b60606000826001600160401b03811115610f3c57610f3c614bac565b604051908082528060200260200182016040528015610f65578160200160208202803683370190505b50905060005b83811015610a3257600954610f8390620186a0615693565b858583818110610f9557610f9561564e565b905060200201351180610fc35750620186a0858583818110610fb957610fb961564e565b9050602002013511155b15610ffd57848482818110610fda57610fda61564e565b9050602002013560405163b7c882eb60e01b81526004016102a591815260200190565b600460008686848181106110135761101361564e565b9050602002013581526020019081526020016000205482828151811061103b5761103b61564e565b6020908102919091010152806110508161567a565b915050610f6b565b8151815160609190811461107f5760405163019d1e2360e01b815260040160405180910390fd5b6000806110a5856000815181106110985761109861564e565b6020026020010151612e61565b915091506000806000886000815181106110c1576110c161564e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600084815260200190815260200160002054905060008390506000856001600160401b0381111561111c5761111c614bac565b604051908082528060200260200182016040528015611145578160200160208202803683370190505b50905061115483600186612e9b565b816000815181106111675761116761564e565b602090810291909101015260015b8681101561128b576111928982815181106110985761109861564e565b909650945082861415806111f657508981815181106111b3576111b361564e565b60200260200101516001600160a01b03168a6001836111d291906156ab565b815181106111e2576111e261564e565b60200260200101516001600160a01b031614155b15611250576000808b83815181106112105761121061564e565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008781526020019081526020016000205493508592505b61125c84600187612e9b565b82828151811061126e5761126e61564e565b6020908102919091010152806112838161567a565b915050611175565b5098975050505050505050565b6003546001600160a01b031633146112c25760405162461bcd60e51b81526004016102a590615608565b6112ce600d8383614706565b505050565b336000908152600c602052604090205460ff16611302576040516282b42960e81b815260040160405180910390fd5b61130a61478a565b61131261467a565b60005b83518110156114e2576113408482815181106113335761133361564e565b6020026020010151613e82565b60095490935061135390620186a0615693565b836101a0015163ffffffff16118061137f5750620186a063ffffffff16836101a0015163ffffffff1611155b156113ac576101a083015160405163b7c882eb60e01b815263ffffffff90911660048201526024016102a5565b6101a083015163ffffffff166000908152600460205260409020546113d0906137a9565b60808085015160ff90811660c080850191909152606087015182169284019290925260a0808701518216908401526101608087015161ffff1661018085015291860151811660e080850191909152860151811661010080850191909152860151811661012080850191909152860151811661014080850191909152860151169082015263ffffffff4216610200820152915061146b82613d06565b60046000856101a0015163ffffffff16815260200190815260200160002081905550826101a0015163ffffffff167f7629a9dc5b9473be5691762a2e1d32fcec1a6e0cb54eb2dbf7ae61058fb57232836040516114c891906151fe565b60405180910390a2806114da8161567a565b915050611315565b50505050565b600d80546114f5906155ce565b80601f0160208091040260200160405190810160405280929190818152602001828054611521906155ce565b801561156e5780601f106115435761010080835404028352916020019161156e565b820191906000526020600020905b81548152906001019060200180831161155157829003601f168201915b505050505081565b60608080806000856001600160401b0381111561159557611595614bac565b6040519080825280602002602001820160405280156115c857816020015b60608152602001906001900390816115b35790505b50905060005b86811015611e6b57620186a08888838181106115ec576115ec61564e565b90506020020135118015611627575060095461160b90620186a0615693565b88888381811061161d5761161d61564e565b9050602002013511155b156118c1576000611647600460008b8b868181106109e7576109e761564e565b9050806101a0015161ffff166000146118105761166c816101a0015161ffff16613f5f565b9350856116908a8a858181106116845761168461564e565b90506020020135613f5f565b82516116ac906116a15760006116a4565b60015b60ff16613f5f565b6116bc846020015160ff16613f5f565b6116cc8560a0015160ff16613f5f565b6116dc8660c0015160ff16613f5f565b6040516020016116f1969594939291906156de565b604051602081830303815290604052955085611713826080015160ff16613f5f565b611723836040015160ff16613f5f565b611737846101c0015163ffffffff16613f5f565b611747856060015160ff16613f5f565b61175b86610200015163ffffffff16613f5f565b604051602001611770969594939291906156de565b60405160208183030381529060405295508561179482610180015161ffff16613f5f565b6117a48360e0015160ff16613f5f565b6117b584610100015160ff16613f5f565b6117c685610120015160ff16613f5f565b6117d786610140015160ff16613f5f565b6117e887610160015160ff16613f5f565b6040516020016117fe979695949392919061578f565b60405160208183030381529060405295505b805161184957604051806040016040528060158152602001746669676874657279616b757a612f79616b757a612f60581b815250611879565b604051806040016040528060168152602001756669676874657279616b757a612f666967687465722f60501b8152505b9450600d85858860405160200161189394939291906158e5565b6040516020818303038152906040528383815181106118b4576118b461564e565b6020026020010181905250505b6113888888838181106118d6576118d661564e565b9050602002013511801561191057506007546118f490611388615693565b8888838181106119065761190661564e565b9050602002013511155b156119fa576000600660008a8a8581811061192d5761192d61564e565b6020908102929092013583525081810192909252604090810160002081518083019092525460ff81168252610100900463ffffffff169181018290529150156119b85785611981826000015160ff16613f5f565b611994836020015163ffffffff16613f5f565b6040516020016119a693929190615953565b60405160208183030381529060405295505b600d866040516020016119cc9291906159a3565b6040516020818303038152906040528383815181106119ed576119ed61564e565b6020026020010181905250505b612710888883818110611a0f57611a0f61564e565b90506020020135118015611a495750600854611a2d90612710615693565b888883818110611a3f57611a3f61564e565b9050602002013511155b15611b33576000600660008a8a85818110611a6657611a6661564e565b6020908102929092013583525081810192909252604090810160002081518083019092525460ff81168252610100900463ffffffff16918101829052915015611af15785611aba826000015160ff16613f5f565b611acd836020015163ffffffff16613f5f565b604051602001611adf93929190615953565b60405160208183030381529060405295505b600d86604051602001611b059291906159f2565b604051602081830303815290604052838381518110611b2657611b2661564e565b6020026020010181905250505b613a98888883818110611b4857611b4861564e565b90506020020135118015611b825750600b54611b6690613a98615693565b888883818110611b7857611b7861564e565b9050602002013511155b80611bd75750614e20888883818110611b9d57611b9d61564e565b90506020020135118015611bd75750600a54611bbb90614e20615693565b888883818110611bcd57611bcd61564e565b9050602002013511155b15611e59576000600560008a8a85818110611bf457611bf461564e565b60209081029290920135835250818101929092526040908101600020815160c081018352905460ff80821683526101008204169382019390935262010000830461ffff1691810191909152640100000000820463ffffffff9081166060830152600160401b8304166080820152600160601b9091046001600160a01b031660a08201529050614e20898984818110611c8e57611c8e61564e565b90506020020135118015611cc85750600a54611cac90614e20615693565b898984818110611cbe57611cbe61564e565b9050602002013511155b15611d0457611ce28989848181106116845761168461564e565b604051602001611cf29190615a45565b60405160208183030381529060405293505b613a98898984818110611d1957611d1961564e565b90506020020135118015611d535750600b54611d3790613a98615693565b898984818110611d4957611d4961564e565b9050602002013511155b15611d88578051611d669060ff16613f5f565b604051602001611d769190615a77565b60405160208183030381529060405293505b606081015163ffffffff1615611e155785611daa826040015161ffff16613f5f565b611dba836020015160ff16613f5f565b8351611dc89060ff16613f5f565b611ddb856060015163ffffffff16613f5f565b611dee866080015163ffffffff16613f5f565b604051602001611e0396959493929190615aa5565b60405160208183030381529060405295505b600d8487604051602001611e2b93929190615b50565b604051602081830303815290604052838381518110611e4c57611e4c61564e565b6020026020010181905250505b80611e638161567a565b9150506115ce565b509695505050505050565b6003546001600160a01b03163314611ea05760405162461bcd60e51b81526004016102a590615608565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b336000908152600c602052604090205460ff16611ef3576040516282b42960e81b815260040160405180910390fd5b60008115611f5a57600a546107d011611f1f5760405163d05cb60960e01b815260040160405180910390fd5b614e2061ffff16600a60008154611f359061567a565b9182905550611f449190615693565b9050611f55866005600160006138be565b611fb4565b600b546107d011611f7e5760405163d05cb60960e01b815260040160405180910390fd5b613a9861ffff16600b60008154611f949061567a565b9182905550611fa39190615693565b9050611fb4866004600160006138be565b611fbc614645565b84816000019060ff16908160ff168152505083816020019060ff16908160ff168152505081816040019061ffff16908161ffff168152505042816060019063ffffffff16908163ffffffff1681525050868160a001906001600160a01b031690816001600160a01b031681525050806005600084815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548161ffff021916908361ffff16021790555060608201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160086101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555090505061212e8783600189614067565b866001600160a01b0316827ff7f561efac942f2123de5ed4b8aedfb67c90e4dde94f9aa0cb0689172e392bd5836040516121689190614996565b60405180910390a350505050505050565b61218161467a565b6000828152600460205260409020546107bd906137a9565b6060600f8054610819906155ce565b60606000826001600160401b038111156121c4576121c4614bac565b6040519080825280602002602001820160405280156121fd57816020015b6121ea614645565b8152602001906001900390816121e25790505b50905060005b83811015610a3257600560008686848181106122215761222161564e565b60209081029290920135835250818101929092526040908101600020815160c081018352905460ff80821683526101008204169382019390935262010000830461ffff1691810191909152640100000000820463ffffffff9081166060830152600160401b8304166080820152600160601b9091046001600160a01b031660a082015282518390839081106122b8576122b861564e565b602002602001018190525080806122ce9061567a565b915050612203565b336000908152600c602052604090205460ff16612305576040516282b42960e81b815260040160405180910390fd5b6000811561236c57600754610fa0116123315760405163d05cb60960e01b815260040160405180910390fd5b61138861ffff166007600081546123479061567a565b91829055506123569190615693565b9050612367846002600160006138be565b6123c6565b600854610fa0116123905760405163d05cb60960e01b815260040160405180910390fd5b61271061ffff166008600081546123a69061567a565b91829055506123b59190615693565b90506123c6846003600160006138be565b60408051808201825260ff858116825263ffffffff42811660208085019182526000878152600682528681208651815494519095166101000264ffffffffff199094169490951693909317919091179092558351918201909352918252906124349086908490600190614067565b60408051825160ff16815260208084015163ffffffff16908201526001600160a01b0387169184917fc3cb43a681cefcf1a37b37441ae2cce91386db43e4d4724bd63d2674ca1524ca910160405180910390a35050505050565b6060600080600184036124a6575050600954620186a0905b600284036124b8575050600754611388905b600384036124ca575050600854612710905b600584036124dc575050600a54614e20905b600484036124ee575050600b54613a98905b6001600160a01b03851660009081526001602090815260408220546125139187612e9b565b90506000816001600160401b0381111561252f5761252f614bac565b604051908082528060200260200182016040528015612558578160200160208202803683370190505b509050600060015b838210801561256f5750848111155b156125d057612582896102bc8389615693565b6001036125be576125938187615693565b8383815181106125a5576125a561564e565b6020908102919091010152816125ba8161567a565b9250505b806125c88161567a565b915050612560565b5090979650505050505050565b3360008181526002602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000805b828110156126a85760006126798686868581811061266d5761266d61564e565b90506020020135610777565b90508060000361269557848483818110610fda57610fda61564e565b50806126a08161567a565b91505061264d565b506001949350505050565b336000908152600c602052604090205460ff166126e2576040516282b42960e81b815260040160405180910390fd5b8281146127025760405163019d1e2360e01b815260040160405180910390fd5b61270a61467a565b60005b8481101561280d5761272e600460008888858181106109e7576109e761564e565b8051909250156127fb5783838281811061274a5761274a61564e565b602002919091013560ff166040840152504263ffffffff166101c083015261277182613d06565b600460008888858181106127875761278761564e565b90506020020135815260200190815260200160002081905550816040015160ff168686838181106127ba576127ba61564e565b905060200201357f17a8072f9c8bf7c73bfffc4d8b7f81dd6cc521bcb73a3ec56dd0141d136326ec426040516127f291815260200190565b60405180910390a35b806128058161567a565b91505061270d565b505050505050565b336000908152600c602052604090205460ff16612844576040516282b42960e81b815260040160405180910390fd5b60408051808201825260ff838116825263ffffffff4281811660208086019182526000898152600682528790208651815493519095166101000264ffffffffff1990931694909516938417919091179093559351938452919285917f6be09d9a689d0f2508b98d50d0bda45b8eb9017e1b991faabe8e542f573c791a910160405180910390a3505050565b336000908152600c602052604090205460ff166128fe576040516282b42960e81b815260040160405180910390fd5b82811461291e5760405163019d1e2360e01b815260040160405180910390fd5b6000816001600160401b0381111561293857612938614bac565b604051908082528060200260200182016040528015612961578160200160208202803683370190505b5090506000826001600160401b0381111561297e5761297e614bac565b6040519080825280602002602001820160405280156129a7578160200160208202803683370190505b509050600060095460016129bb9190615693565b905060008060005b86811015612e1057836129d58161567a565b94506129e490620186a0615693565b8682815181106129f6576129f661564e565b6020026020010181815250506001858281518110612a1657612a1661564e565b602002602001018181525050878782818110612a3457612a3461564e565b612a4b926020610220909202019081019150615baa565b612a56576000612a59565b60015b60ff16925060009150878782818110612a7457612a7461564e565b905061022002016040016020810190612a8d9190615bc5565b60ff169150600282901b83179250878782818110612aad57612aad61564e565b612ac4926020610220909202019081019150615baa565b612af857878782818110612ada57612ada61564e565b905061022002016060016020810190612af39190615bc5565b612afb565b60005b60ff169150600a82901b83179250878782818110612b1b57612b1b61564e565b905061022002016080016020810190612b349190615bc5565b60ff169150601282901b83179250878782818110612b5457612b5461564e565b9050610220020160a0016020810190612b6d9190615bc5565b60ff169150601a82901b83179250878782818110612b8d57612b8d61564e565b9050610220020160c0016020810190612ba69190615bc5565b60ff169150602282901b83179250878782818110612bc657612bc661564e565b9050610220020160e0016020810190612bdf9190615bc5565b60ff169150602a82901b83179250878782818110612bff57612bff61564e565b90506102200201610100016020810190612c199190615bc5565b60ff169150603282901b83179250878782818110612c3957612c3961564e565b90506102200201610120016020810190612c539190615bc5565b60ff169150603a82901b83179250878782818110612c7357612c7361564e565b90506102200201610140016020810190612c8d9190615bc5565b60ff169150604282901b83179250878782818110612cad57612cad61564e565b90506102200201610160016020810190612cc79190615bc5565b60ff169150604a82901b83179250878782818110612ce757612ce761564e565b905061022002016020016020810190612d009190615bc5565b60ff16600114612d11576064612d14565b60005b60ff169150605a82901b83179250898982818110612d3457612d3461564e565b905060200201359150606a82901b83179250429150608a82901b8317925042915060aa82901b8317925042915060ca82901b831792508260046000888481518110612d8157612d8161564e565b60200260200101518152602001908152602001600020819055508a6001600160a01b0316868281518110612db757612db761564e565b60200260200101517f50f257e837121a398d7e502e945de5c35646b359bc577613254a29f8c67892e5612de9866137a9565b604051612df691906151fe565b60405180910390a380612e088161567a565b9150506129c3565b508686905060096000828254612e269190615693565b90915550612e3a90508a60018a60006138be565b612e558a8686604051806020016040528060008152506140cc565b50505050505050505050565b600080612e716001610100615bf6565b612e7b9084615bf6565b9150612e8a6001610100615bf6565b612e949084615c0a565b9050915091565b600080612eab600180861b6156ab565b90506000612eb98486615c1e565b9590951c16949350505050565b336000908152600c602052604090205460ff16612ef5576040516282b42960e81b815260040160405180910390fd5b80612f01576000612f03565b425b60008381526005602052604090819020805463ffffffff93909316600160401b026bffffffff00000000000000001990931692909217909155517ff9367a78455fb80a7cad5cffdbd8f97115b02539af10132f5676d177aae5453c90612f759084904290918252602082015260400190565b60405180910390a15050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b336001600160a01b0386161480612fcb5750612fcb8533612f81565b61300b5760405162461bcd60e51b81526020600482015260116024820152701024a72b20a624a22fa7a822a920aa27a960791b60448201526064016102a5565b6001600160a01b0384166130565760405162461bcd60e51b8152602060048201526012602482015271081253959053125117d49150d2541251539560721b60448201526064016102a5565b61138883118015613075575060075461307190611388615693565b8311155b15613096576130888460028460006138be565b6130968560028460016138be565b612710831180156130b557506008546130b190612710615693565b8311155b156130d6576130c88460038460006138be565b6130d68560038460016138be565b620186a0831180156130f757506009546130f390620186a0615693565b8311155b156131185761310a8460018460006138be565b6131188560018460016138be565b614e20831180156131375750600a5461313390614e20615693565b8311155b156131855761314a8460058460006138be565b6131588560058460016138be565b600083815260056020526040902080546001600160601b0316600160601b6001600160a01b038716021790555b613a98831180156131a45750600b546131a090613a98615693565b8311155b156131f2576131b78460048460006138be565b6131c58560048460016138be565b600083815260056020526040902080546001600160601b0316600160601b6001600160a01b038716021790555b6131fe85858585614285565b61320c858585855a866142f0565b5050505050565b6003546001600160a01b0316331461323d5760405162461bcd60e51b81526004016102a590615608565b6001600160a01b0381166132a65760405162461bcd60e51b815260206004820152602a60248201527f4f776e61626c65237472616e736665724f776e6572736869703a20494e56414c60448201526949445f4144445245535360b01b60648201526084016102a5565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600c602052604090205460609060ff16613334576040516282b42960e81b815260040160405180910390fd5b8582146133545760405163019d1e2360e01b815260040160405180910390fd5b8584146133745760405163019d1e2360e01b815260040160405180910390fd5b6000866001600160401b0381111561338e5761338e614bac565b6040519080825280602002602001820160405280156133c757816020015b6133b4614645565b8152602001906001900390816133ac5790505b50905060005b8781101561376257600560008a8a848181106133eb576133eb61564e565b60209081029290920135835250818101929092526040908101600020815160c081018352905460ff80821683526101008204169382019390935262010000830461ffff1691810191909152640100000000820463ffffffff9081166060830152600160401b8304166080820152600160601b9091046001600160a01b031660a082015282518390839081106134825761348261564e565b602002602001018190525086868281811061349f5761349f61564e565b905060200201356000036134d0578181815181106134bf576134bf61564e565b6020026020010151600001516134ea565b8686828181106134e2576134e261564e565b905060200201355b8282815181106134fc576134fc61564e565b602090810291909101015160ff90911690528484828181106135205761352061564e565b90506020020135600003613551578181815181106135405761354061564e565b60200260200101516020015161356b565b8484828181106135635761356361564e565b905060200201355b82828151811061357d5761357d61564e565b60200260200101516020019060ff16908160ff1681525050428282815181106135a8576135a861564e565b60200260200101516060019063ffffffff16908163ffffffff16815250508181815181106135d8576135d861564e565b6020026020010151600560008b8b858181106135f6576135f661564e565b602090810292909201358352508181019290925260409081016000208351815493850151928501516060860151608087015160a0909701516001600160a01b0316600160601b026001600160601b0363ffffffff988916600160401b02166001600160401b03989092166401000000000267ffffffff000000001961ffff90941662010000029390931667ffffffffffff00001960ff9788166101000261ffff19909916979095169690961796909617929092169390931792909217939093161717905581518290829081106136ce576136ce61564e565b60200260200101516000015160ff168282815181106136ef576136ef61564e565b60200260200101516020015160ff168a8a848181106137105761371061564e565b905060200201357fba6e211ef7edc278bf788576411e4038e187728af6497258572a045e468fc2b74260405161374891815260200190565b60405180910390a48061375a8161567a565b9150506133cd565b50979650505050505050565b6000631324c2ed60e11b6001600160e01b031983160161379057506001919050565b6301ffc9a760e01b6001600160e01b03198316146107bd565b6137b161467a565b6137b961467a565b6137c4600284615c3d565b60ff166001146137d55760006137d8565b60015b151581526137eb6002600185901c615c3d565b60ff9081166020830152600284901c81166040830152600a84901c81166060830152601284901c81166080830152601a84901c811660a0830152602284901c811660c0830152602a84901c811660e0830152603284901c8116610100830152603a84901c8116610120830152604284901c8116610140830152604a84901c1661016082015261ffff605a84901c8116610180830152606a84901c166101a082015263ffffffff608a84901c81166101c083015260aa84901c81166101e083015260ca9390931c9092166102008301525090565b6001600160a01b0384166000908152600160209081526040909120546138e6918585856143b5565b6001600160a01b03909416600090815260016020526040902093909355505050565b81518151811461392b5760405163019d1e2360e01b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03161415801561394d5750600081115b15613b435760008061396b856000815181106110985761109861564e565b9150915060006139cf6000808a6001600160a01b03166001600160a01b03168152602001908152602001600020600085815260200190815260200160002054600184886000815181106139c0576139c061564e565b602002602001015160016143b5565b90506000613a316000808a6001600160a01b03166001600160a01b0316815260200190815260200160002060008681526020019081526020016000205460018589600081518110613a2257613a2261564e565b602002602001015160006143b5565b90508360015b86811015613afe57613a548982815181106110985761109861564e565b9096509450818614613ab6576001600160a01b038b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b613acf846001878b85815181106139c0576139c061564e565b9350613aea836001878b8581518110613a2257613a2261564e565b925080613af68161567a565b915050613a37565b50506001600160a01b03808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550613bda565b60005b81811015613bd857828181518110613b6057613b6061564e565b6020026020010151613b8b87868481518110613b7e57613b7e61564e565b6020026020010151610777565b1015613bc65760405162461bcd60e51b815260206004820152600a60248201526920554e444552464c4f5760b01b60448201526064016102a5565b80613bd08161567a565b915050613b46565b505b836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613c29929190615c5f565b60405180910390a45050505050565b613c4a856001600160a01b031661459c565b1561280d576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b8152600401613c86959493929190615c8d565b60206040518083038160008887f1158015613ca5573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613cca9190615ceb565b90506001600160e01b0319811663bc197c8160e01b14613cfd576040516319495db160e01b815260040160405180910390fd5b50505050505050565b6000808260000151613d19576000613d1c565b60015b60ff1690506000836020015160ff169050600181901b82179150836040015160ff169050600281901b821791508360000151613d5c578360600151613d5f565b60005b60ff169050600a81901b82179150836080015160ff169050601281901b821791508360a0015160ff169050601a81901b821791508360c0015160ff169050602281901b821791508360e0015160ff169050602a81901b8217915083610100015160ff169050603281901b8217915083610120015160ff169050603a81901b8217915083610140015160ff169050604281901b8217915083610160015160ff169050604a81901b8217915083610180015161ffff169050605a81901b82179150836101a0015161ffff169050606a81901b82179150836101c0015163ffffffff169050608a81901b82179150836101e0015163ffffffff16905060aa81901b8217915083610200015163ffffffff16905060ca81901b821791508192505050919050565b613e8a61478a565b60ff8281168252600883901c8116602080840191909152601084901c8216604080850191909152601885901c83166060808601919091529185901c8316608080860191909152602886901c841660a080870191909152603087901c851660c080880191909152603888901c861660e08801529287901c8516610100870152604887901c8516610120870152605087901c9094166101408601529185901c61ffff166101608501529084901c63ffffffff9081166101808501529184901c82166101a08401529290921c9091166101c082015290565b606081600003613f865750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613fb05780613f9a8161567a565b9150613fa99050600a83615bf6565b9150613f8a565b6000816001600160401b03811115613fca57613fca614bac565b6040519080825280601f01601f191660200182016040528015613ff4576020820181803683370190505b5090505b841561405f576140096001836156ab565b9150614016600a86615c0a565b614021906030615693565b60f81b8183815181106140365761403661564e565b60200101906001600160f81b031916908160001a905350614058600a86615bf6565b9450613ff8565b949350505050565b61407484848460006145d6565b60408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46114e260008585855a866142f0565b81518351146140ee5760405163019d1e2360e01b815260040160405180910390fd5b82511561421e5760008061410e856000815181106110985761109861564e565b915091506000614163600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008581526020019081526020016000205460018488600081518110613a2257613a2261564e565b86519091508360015b828110156141f2576141898982815181106110985761109861564e565b90965094508186146141c5576001600160a01b038a16600090815260208181526040808320948352939052828120949094558584529220549184905b6141de846001878b8581518110613a2257613a2261564e565b9350806141ea8161567a565b91505061416c565b5050506001600160a01b0387166000908152602081815260408083209583529490529290922091909155505b836001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161426e929190615c5f565b60405180910390a46114e260008585855a86613c38565b61429284838360016145d6565b61429f83838360006145d6565b60408051838152602081018390526001600160a01b03808616929087169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b614302856001600160a01b031661459c565b1561280d576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040161433e959493929190615d08565b60206040518083038160008887f115801561435d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143829190615ceb565b90506001600160e01b0319811663f23a6e6160e01b14613cfd576040516319495db160e01b815260040160405180910390fd5b6000806143c28587615c1e565b905060006143d3600180891b6156ab565b905060008460018111156143e9576143e9615d4d565b03614490576143fa85831b89615693565b9250878310156144395760405162461bcd60e51b815260206004820152600a6024820152691027ab22a9232627ab9960b11b60448201526064016102a5565b614444876002615e47565b614452868a851c8416615693565b1061448b5760405162461bcd60e51b81526020600482015260096024820152684f564552464c4f573160b81b60448201526064016102a5565b614591565b60018460018111156144a4576144a4615d4d565b03614549576144b585831b896156ab565b9250878311156144f45760405162461bcd60e51b815260206004820152600a60248201526920554e444552464c4f5760b01b60448201526064016102a5565b8481838a901c16101561448b5760405162461bcd60e51b815260206004820152601960248201527f766965775570647442696e56616c3a20554e444552464c4f570000000000000060448201526064016102a5565b60405162461bcd60e51b815260206004820152601960248201527f766965775570647442563a20494e56414c49445f57524954450000000000000060448201526064016102a5565b505095945050505050565b6000813f80158015906145cf57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b6000806145e285612e61565b6001600160a01b03881660009081526020818152604080832085845290915290205491935091506146179060018387876143b5565b6001600160a01b03909616600090815260208181526040808320948352939052919091209490945550505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081019190915290565b828054614712906155ce565b90600052602060002090601f016020900481019282614734576000855561477a565b82601f1061474d5782800160ff1982351617855561477a565b8280016001018555821561477a579182015b8281111561477a57823582559160200191906001019061475f565b5061478692915061480e565b5090565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081019190915290565b5b80821115614786576000815560010161480f565b80356001600160a01b038116811461483a57600080fd5b919050565b6000806040838503121561485257600080fd5b61485b83614823565b946020939093013593505050565b6001600160e01b03198116811461487f57600080fd5b50565b60006020828403121561489457600080fd5b81356145cf81614869565b60005b838110156148ba5781810151838201526020016148a2565b838111156114e25750506000910152565b600081518084526148e381602086016020860161489f565b601f01601f19169290920160200192915050565b6020815260006145cf60208301846148cb565b60006020828403121561491c57600080fd5b6145cf82614823565b60006020828403121561493757600080fd5b5035919050565b60ff815116825260ff602082015116602083015261ffff6040820151166040830152606081015163ffffffff8082166060850152806080840151166080850152505060018060a01b0360a08201511660a08301525050565b60c081016107bd828461493e565b60008083601f8401126149b657600080fd5b5081356001600160401b038111156149cd57600080fd5b6020830191508360208260051b85010111156149e857600080fd5b9250929050565b60008060208385031215614a0257600080fd5b82356001600160401b03811115614a1857600080fd5b614a24858286016149a4565b90969095509350505050565b8051151582526020810151614a4a602084018260ff169052565b506040810151614a5f604084018260ff169052565b506060810151614a74606084018260ff169052565b506080810151614a89608084018260ff169052565b5060a0810151614a9e60a084018260ff169052565b5060c0810151614ab360c084018260ff169052565b5060e0810151614ac860e084018260ff169052565b506101008181015160ff90811691840191909152610120808301518216908401526101408083015182169084015261016080830151909116908301526101808082015161ffff908116918401919091526101a080830151909116908301526101c08082015163ffffffff908116918401919091526101e0808301518216908401526102008083015191821681850152906114e2565b6020808252825182820181905260009190848201906040850190845b81811015614ba057614b8c838551614a30565b928401926102209290920191600101614b79565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60405161022081016001600160401b0381118282101715614be557614be5614bac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c1357614c13614bac565b604052919050565b600082601f830112614c2c57600080fd5b81356001600160401b03811115614c4557614c45614bac565b614c58601f8201601f1916602001614beb565b818152846020838601011115614c6d57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060a0888a031215614ca557600080fd5b614cae88614823565b9650614cbc60208901614823565b955060408801356001600160401b0380821115614cd857600080fd5b614ce48b838c016149a4565b909750955060608a0135915080821115614cfd57600080fd5b614d098b838c016149a4565b909550935060808a0135915080821115614d2257600080fd5b50614d2f8a828b01614c1b565b91505092959891949750929550565b8035801515811461483a57600080fd5b803560ff8116811461483a57600080fd5b803561ffff8116811461483a57600080fd5b803563ffffffff8116811461483a57600080fd5b600080828403610240811215614d9a57600080fd5b8335925061022080601f1983011215614db257600080fd5b614dba614bc2565b9150614dc860208601614d3e565b8252614dd660408601614d4e565b6020830152614de760608601614d4e565b6040830152614df860808601614d4e565b6060830152614e0960a08601614d4e565b6080830152614e1a60c08601614d4e565b60a0830152614e2b60e08601614d4e565b60c0830152610100614e3e818701614d4e565b60e0840152610120614e51818801614d4e565b828501526101409150614e65828801614d4e565b90840152610160614e77878201614d4e565b828501526101809150614e8b828801614d4e565b908401526101a0614e9d878201614d5f565b828501526101c09150614eb1828801614d5f565b908401526101e0614ec3878201614d71565b828501526102009150614ed7828801614d71565b90840152614ee6868301614d71565b9083015250919491935090915050565b600081518084526020808501945080840160005b83811015614f2657815187529582019590820190600101614f0a565b509495945050505050565b6020815260006145cf6020830184614ef6565b60006001600160401b03821115614f5d57614f5d614bac565b5060051b60200190565b600082601f830112614f7857600080fd5b81356020614f8d614f8883614f44565b614beb565b82815260059290921b84018101918181019086841115614fac57600080fd5b8286015b84811015611e6b5780358352918301918301614fb0565b60008060408385031215614fda57600080fd5b82356001600160401b0380821115614ff157600080fd5b818501915085601f83011261500557600080fd5b81356020615015614f8883614f44565b82815260059290921b8401810191818101908984111561503457600080fd5b948201945b838610156150595761504a86614823565b82529482019490820190615039565b9650508601359250508082111561506f57600080fd5b5061507c85828601614f67565b9150509250929050565b6000806020838503121561509957600080fd5b82356001600160401b03808211156150b057600080fd5b818501915085601f8301126150c457600080fd5b8135818111156150d357600080fd5b8660208285010111156150e557600080fd5b60209290920196919550909350505050565b60006020828403121561510957600080fd5b81356001600160401b0381111561511f57600080fd5b61405f84828501614f67565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561518057603f1988860301845261516e8583516148cb565b94509285019290850190600101615152565b5092979650505050505050565b600080600080600060a086880312156151a557600080fd5b6151ae86614823565b945060208601356001600160401b038111156151c957600080fd5b6151d588828901614c1b565b94505060408601359250606086013591506151f260808701614d3e565b90509295509295909350565b61022081016107bd8284614a30565b6020808252825182820181905260009190848201906040850190845b81811015614ba05761523c83855161493e565b9284019260c09290920191600101615229565b60008060006060848603121561526457600080fd5b61526d84614823565b92506020840135915061528260408501614d3e565b90509250925092565b6000806040838503121561529e57600080fd5b6152a783614823565b91506152b560208401614d3e565b90509250929050565b6000806000604084860312156152d357600080fd5b6152dc84614823565b925060208401356001600160401b038111156152f757600080fd5b615303868287016149a4565b9497909650939450505050565b6000806000806040858703121561532657600080fd5b84356001600160401b038082111561533d57600080fd5b615349888389016149a4565b9096509450602087013591508082111561536257600080fd5b5061536f878288016149a4565b95989497509550505050565b6000806040838503121561538e57600080fd5b50508035926020909101359150565b6000806000806000606086880312156153b557600080fd5b6153be86614823565b945060208601356001600160401b03808211156153da57600080fd5b6153e689838a016149a4565b909650945060408801359150808211156153ff57600080fd5b818801915088601f83011261541357600080fd5b81358181111561542257600080fd5b8960206102208302850101111561543857600080fd5b9699959850939650602001949392505050565b60008060006060848603121561546057600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561548a57600080fd5b823591506152b560208401614d3e565b600080604083850312156154ad57600080fd5b6154b683614823565b91506152b560208401614823565b600080600080600060a086880312156154dc57600080fd5b6154e586614823565b94506154f360208701614823565b9350604086013592506060860135915060808601356001600160401b0381111561551c57600080fd5b61552888828901614c1b565b9150509295509295909350565b6000806000806000806060878903121561554e57600080fd5b86356001600160401b038082111561556557600080fd5b6155718a838b016149a4565b9098509650602089013591508082111561558a57600080fd5b6155968a838b016149a4565b909650945060408901359150808211156155af57600080fd5b506155bc89828a016149a4565b979a9699509497509295939492505050565b600181811c908216806155e257607f821691505b60208210810361560257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f4f776e61626c65236f6e6c794f776e65723a2053454e4445525f49535f4e4f546040820152652fa7aba722a960d11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161568c5761568c615664565b5060010190565b600082198211156156a6576156a6615664565b500190565b6000828210156156bd576156bd615664565b500390565b600081516156d481856020860161489f565b9290920192915050565b6000875160206156f18285838d0161489f565b8851918401916157048184848d0161489f565b600b60fa1b920182815288519092906157238160018601858d0161489f565b60019301928301819052875161573f8160028601858c0161489f565b60029301928301819052865161575b8160038601858b0161489f565b6003930192830181905285516157778160048601858a0161489f565b60049301928301525060050198975050505050505050565b6000885160206157a28285838e0161489f565b8951918401916157b58184848e0161489f565b600b60fa1b920182815289519092906157d48160018601858e0161489f565b6001930192830181905288516157f08160028601858d0161489f565b60029301928301819052875161580c8160038601858c0161489f565b6003930192830181905286516158288160048601858b0161489f565b60049301928301525061583e60058201856156c2565b9a9950505050505050505050565b8054600090600181811c908083168061586657607f831692505b6020808410820361588757634e487b7160e01b600052602260045260246000fd5b81801561589b57600181146158ac576158d9565b60ff198616895284890196506158d9565b60008881526020902060005b868110156158d15781548b8201529085019083016158b8565b505084890196505b50505050505092915050565b60006158f1828761584c565b8551615901818360208a0161489f565b855191019061591481836020890161489f565b632e706e6760e01b9101908152673f7472616974733d60c01b6004820152835161594581600c84016020880161489f565b01600c019695505050505050565b6000845161596581846020890161489f565b84519083019061597981836020890161489f565b600b60fa1b9101908152835161599681600184016020880161489f565b0160010195945050505050565b60006159af828561584c565b6c72696e672f72696e672e706e6760981b8152673f7472616974733d60c01b600d82015283516159e681601584016020880161489f565b01601501949350505050565b60006159fe828561584c565b70616d756c65742f616d756c65742e706e6760781b8152673f7472616974733d60c01b60118201528351615a3981601984016020880161489f565b01601901949350505050565b696669676874636c75622f60b01b815260008251615a6a81600a85016020870161489f565b91909101600a0192915050565b65666f7267652f60d01b815260008251615a9881600685016020870161489f565b9190910160060192915050565b600087516020615ab88285838d0161489f565b885191840191615acb8184848d0161489f565b600b60fa1b92018281528851909290615aea8160018601858d0161489f565b600193019283018190528751615b068160028601858c0161489f565b600293019283018190528651615b228160038601858b0161489f565b60039301928301528451615b3c816004850184890161489f565b919091016004019998505050505050505050565b6000615b5c828661584c565b8451615b6c81836020890161489f565b632e706e6760e01b9101908152673f7472616974733d60c01b60048201528351615b9d81600c84016020880161489f565b01600c0195945050505050565b600060208284031215615bbc57600080fd5b6145cf82614d3e565b600060208284031215615bd757600080fd5b6145cf82614d4e565b634e487b7160e01b600052601260045260246000fd5b600082615c0557615c05615be0565b500490565b600082615c1957615c19615be0565b500690565b6000816000190483118215151615615c3857615c38615664565b500290565b600060ff831680615c5057615c50615be0565b8060ff84160691505092915050565b604081526000615c726040830185614ef6565b8281036020840152615c848185614ef6565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090615cb990830186614ef6565b8281036060840152615ccb8186614ef6565b90508281036080840152615cdf81856148cb565b98975050505050505050565b600060208284031215615cfd57600080fd5b81516145cf81614869565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615d42908301846148cb565b979650505050505050565b634e487b7160e01b600052602160045260246000fd5b600181815b80851115615d9e578160001904821115615d8457615d84615664565b80851615615d9157918102915b93841c9390800290615d68565b509250929050565b600082615db5575060016107bd565b81615dc2575060006107bd565b8160018114615dd85760028114615de257615dfe565b60019150506107bd565b60ff841115615df357615df3615664565b50506001821b6107bd565b5060208310610133831016604e8410600b8410161715615e21575081810a6107bd565b615e2b8383615d63565b8060001904821115615e3f57615e3f615664565b029392505050565b60006145cf8383615da656fea2646970667358221220ca35dba85059abb47deaf29a677aa25e1ca396eea13a276dc658f2c897fea4eb64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f7468652d752e636c75622f72657665616c2f000000000000000000000000000000000000000000000000000000000000000000000000000e5547526573757272656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555474e4654000000000000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f7468652d752e636c75622f72657665616c2f000000000000000000000000000000000000000000000000000000000000000000000000000e5547526573757272656374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555474e4654000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri (string): https://the-u.club/reveal/
Arg [1] : __name (string): UGResurrection
Arg [2] : __symbol (string): UGNFT

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [4] : 68747470733a2f2f7468652d752e636c75622f72657665616c2f000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 5547526573757272656374696f6e000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 55474e4654000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

41615:27211:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68785:32;;-1:-1:-1;;;68785:32:0;;216:2:1;68785:32:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:52;336:18;;68785:32:0;;;;;;;;30677:293;;;;;;:::i;:::-;;:::i;:::-;;;948:25:1;;;936:2;921:18;30677:293:0;;;;;;;;68353:271;;;;;;:::i;:::-;;:::i;:::-;;;1631:14:1;;1624:22;1606:41;;1594:2;1579:18;68353:271:0;1466:187:1;59405:78:0;;;:::i;:::-;;;;;;;:::i;45145:87::-;;;;;;:::i;:::-;;:::i;:::-;;54243:136;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54822:302::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57693:1347::-;;;;;;:::i;:::-;;:::i;42935:25::-;;;;;;54385:172;;;;;;:::i;:::-;;:::i;55279:434::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31336:1038::-;;;;;;:::i;:::-;;:::i;45238:86::-;;;;;;:::i;:::-;;:::i;51801:1028::-;;;;;;:::i;:::-;;:::i;42996:28::-;;;;;;43291:21;;;:::i;59832:4536::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45055:84::-;;;;;;:::i;:::-;;:::i;42907:23::-;;;;;;48832:1032;;;;;;:::i;:::-;;:::i;55719:125::-;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;55815:23:0;;;;:14;:23;;;;;;;;;55808:30;;;;;;;;;;;;;;;;;;;;;;;;55719:125;;;;;17595:13:1;;17610:4;17591:24;17573:43;;17676:4;17664:17;;;17658:24;17684:10;17654:41;17632:20;;;17625:71;;;;17546:18;55719:125:0;17373:329:1;55130:143:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9667:74::-;9728:7;;9667:74;;-1:-1:-1;;;;;9728:7:0;;;18121:51:1;;18109:2;18094:18;9667:74:0;17975:203:1;43029:24:0;;;;;;59559:86;;;:::i;53930:307::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47980:846::-;;;;;;:::i;:::-;;:::i;52835:1089::-;;;;;;:::i;:::-;;:::i;29654:236::-;;;;;;:::i;:::-;;:::i;42783:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42783:60:0;;;;;;-1:-1:-1;;;;;;;;42783:60:0;;;;;;;;;;19799:4:1;19787:17;;;19769:36;;19841:17;;;;19836:2;19821:18;;19814:45;19907:6;19895:19;;;19875:18;;;19868:47;;;;19934:10;19980:15;;;19975:2;19960:18;;19953:43;20033:15;;;20027:3;20012:19;;20005:44;-1:-1:-1;;;;;20086:32:1;20106:3;20065:19;;20058:61;19756:3;19741:19;42783:60:0;19496:629:1;59046:299:0;;;;;;:::i;:::-;;:::i;51231:564::-;;;;;;:::i;:::-;;:::i;42848:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21622:4:1;21610:17;;;21592:36;;21676:10;21664:23;;;21659:2;21644:18;;21637:51;21565:18;42848:52:0;21424:270:1;50872:353:0;;;;;;:::i;:::-;;:::i;45506:2467::-;;;;;;:::i;:::-;;:::i;42965:26::-;;;;;;35244:195;;;;;;:::i;:::-;;:::i;:::-;;;;23172:25:1;;;23228:2;23213:18;;23206:34;;;;23145:18;35244:195:0;22998:248:1;35704:448:0;;;;;;:::i;:::-;;:::i;54563:253::-;;;;;;:::i;:::-;;:::i;30160:164::-;;;;;;:::i;:::-;;:::i;55850:1837::-;;;;;;:::i;:::-;;:::i;9367:232::-;;;;;;:::i;:::-;;:::i;49870:996::-;;;;;;:::i;:::-;;:::i;42732:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30677:293;30768:7;30787:11;30805:13;30874:18;30888:3;30874:13;:18::i;:::-;-1:-1:-1;;;;;30920:16:0;;:8;:16;;;;;;;;;;;:21;;;;;;;;;30859:33;;-1:-1:-1;30859:33:0;-1:-1:-1;30906:58:0;;22084:1;30859:33;30906:13;:58::i;:::-;30899:65;;;;30677:293;;;;;:::o;68353:271::-;68456:4;-1:-1:-1;;;;;;;;;68473:26:0;;;;:65;;-1:-1:-1;;;;;;;;;;68512:26:0;;;68473:65;68469:99;;;-1:-1:-1;68556:4:0;;68353:271;-1:-1:-1;68353:271:0:o;68469:99::-;68581:37;68605:12;68581:23;:37::i;59405:78::-;59444:13;59472:5;59465:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59405:78;:::o;45145:87::-;9166:7;;-1:-1:-1;;;;;9166:7:0;9152:10;:21;9144:72;;;;-1:-1:-1;;;9144:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45213:13:0::1;;::::0;;;:7:::1;:13;::::0;;;;45206:20;;-1:-1:-1;;45206:20:0::1;::::0;;45145:87::o;54243:136::-;54310:21;;:::i;:::-;-1:-1:-1;54346:27:0;;;;:18;:27;;;;;;;;;54339:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54339:34:0;;;;;;;-1:-1:-1;;;;;;;;54339:34:0;;;;;;;;;54243:136::o;54822:302::-;54895:22;54925:25;54973:8;-1:-1:-1;;;;;54953:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;54925:64;;55001:6;54996:107;55013:19;;;54996:107;;;55056:39;55070:11;:24;55082:8;;55091:1;55082:11;;;;;;;:::i;:::-;;;;;;;55070:24;;;;;;;;;;;;55056:13;:39::i;:::-;55048:2;55051:1;55048:5;;;;;;;;:::i;:::-;;;;;;:47;;;;55034:3;;;;;:::i;:::-;;;;54996:107;;;-1:-1:-1;55116:2:0;54822:302;-1:-1:-1;;;54822:302:0:o;57693:1347::-;57917:10;-1:-1:-1;;;;;57917:19:0;;;;57916:60;;;57941:35;57958:5;57965:10;57941:16;:35::i;:::-;57908:90;;;;-1:-1:-1;;;57908:90:0;;27192:2:1;57908:90:0;;;27174:21:1;27231:2;27211:18;;;27204:30;-1:-1:-1;;;27250:18:1;;;27243:47;27307:18;;57908:90:0;26990:341:1;57908:90:0;-1:-1:-1;;;;;58013:17:0;;58005:47;;;;-1:-1:-1;;;58005:47:0;;27538:2:1;58005:47:0;;;27520:21:1;27577:2;27557:18;;;27550:30;-1:-1:-1;;;27596:18:1;;;27589:48;27654:18;;58005:47:0;27336:342:1;58005:47:0;58059:14;;58082:814;58098:15;;;58082:814;;;41892:4;58131;;58136:1;58131:7;;;;;;;:::i;:::-;;;;;;;:14;:44;;;;-1:-1:-1;58167:8:0;;58160:15;;41892:4;58160:15;:::i;:::-;58149:4;;58154:1;58149:7;;;;;;;:::i;:::-;;;;;;;:26;;58131:44;58128:88;;;42546:1;58187:19;;58128:88;41926:5;58228:4;;58233:1;58228:7;;;;;;;:::i;:::-;;;;;;;:16;:50;;;;-1:-1:-1;58268:10:0;;58259:19;;41926:5;58259:19;:::i;:::-;58248:4;;58253:1;58248:7;;;;;;;:::i;:::-;;;;;;;:30;;58228:50;58225:97;;;42594:1;58291:21;;58225:97;42035:6;58333:4;;58338:1;58333:7;;;;;;;:::i;:::-;;;;;;;:17;:53;;;;-1:-1:-1;58375:11:0;;58365:21;;42035:6;58365:21;:::i;:::-;58354:4;;58359:1;58354:7;;;;;;;:::i;:::-;;;;;;;:32;;58333:53;58330:80;;;42500:1;58388:22;;58330:80;41999:5;58422:4;;58427:1;58422:7;;;;;;;:::i;:::-;;;;;;;:20;:60;;;;-1:-1:-1;58469:13:0;;58456:26;;41999:5;58456:26;:::i;:::-;58446:4;;58451:1;58446:7;;;;;;;:::i;:::-;;;;;;;:36;;58422:60;58419:161;;;42693:1;58495:25;;58567:3;58531:18;:27;58550:4;;58555:1;58550:7;;;;;;;:::i;:::-;;;;;;;58531:27;;;;;;;;;;;:33;;;:39;;;;;-1:-1:-1;;;;;58531:39:0;;;;;-1:-1:-1;;;;;58531:39:0;;;;;;58419:161;41960:5;58591:4;;58596:1;58591:7;;;;;;;:::i;:::-;;;;;;;:15;:47;;;;-1:-1:-1;58629:9:0;;58621:17;;41960:5;58621:17;:::i;:::-;58610:4;;58615:1;58610:7;;;;;;;:::i;:::-;;;;;;;:28;;58591:47;58588:143;;;42641:1;58651:20;;58718:3;58682:18;:27;58701:4;;58706:1;58701:7;;;;;;;:::i;:::-;;;;;;;58682:27;;;;;;;;;;;:33;;;:39;;;;;-1:-1:-1;;;;;58682:39:0;;;;;-1:-1:-1;;;;;58682:39:0;;;;;;58588:143;58741:67;58767:3;58772:6;58780:8;;58789:1;58780:11;;;;;;;:::i;:::-;;;;;;;58793:14;58741:25;:67::i;:::-;58817:69;58843:5;58850:6;58858:8;;58867:1;58858:11;;;;;;;:::i;:::-;;;;;;;58871:14;58817:25;:69::i;:::-;58115:3;;;;:::i;:::-;;;;58082:814;;;;58904:50;58927:5;58934:3;58939:4;;58904:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58904:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58945:8:0;;-1:-1:-1;58945:8:0;;;;58904:50;;;58945:8;;58904:50;58945:8;58904:50;;;;;;;;;-1:-1:-1;58904:22:0;;-1:-1:-1;;;58904:50:0:i;:::-;58961:73;58989:5;58996:3;59001:4;;58961:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58961:73:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59007:8:0;;-1:-1:-1;59007:8:0;;;;58961:73;;;59007:8;;58961:73;59007:8;58961:73;;;;;;;;;-1:-1:-1;;;;59017:9:0;59028:5;58961:27;:73::i;:::-;57901:1139;57693:1347;;;;;;;:::o;54385:172::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;54497:15:::1;54509:2;54497:11;:15::i;:::-;54474:20;::::0;;;:11:::1;:20;::::0;;;;;;:38;;;;54524:27;54486:7;;54524:27:::1;::::0;::::1;::::0;54548:2;;54524:27:::1;:::i;:::-;;;;;;;;54385:172:::0;;:::o;55279:434::-;55358:16;55382:32;55431:8;-1:-1:-1;;;;;55417:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55417:30:0;;55382:65;;55459:6;55454:225;55471:19;;;55454:225;;;55533:11;;55523:21;;42035:6;55523:21;:::i;:::-;55509:8;;55518:1;55509:11;;;;;;;:::i;:::-;;;;;;;:35;:61;;;-1:-1:-1;42035:6:0;55548:8;;55557:1;55548:11;;;;;;;:::i;:::-;;;;;;;:22;;55509:61;55506:111;;;55604:8;;55613:1;55604:11;;;;;;;:::i;:::-;;;;;;;55579:38;;-1:-1:-1;;;55579:38:0;;;;;;948:25:1;;936:2;921:18;;802:177;55506:111:0;55647:11;:24;55659:8;;55668:1;55659:11;;;;;;;:::i;:::-;;;;;;;55647:24;;;;;;;;;;;;55626:15;55642:1;55626:18;;;;;;;;:::i;:::-;;;;;;;;;;:45;55492:3;;;;:::i;:::-;;;;55454:225;;31336:1038;31499:14;;31535:11;;31452:16;;31499:14;31523:23;;31520:51;;31555:16;;-1:-1:-1;;;31555:16:0;;;;;;;;;;;31520:51;31602:11;31615:13;31632:22;31646:4;31651:1;31646:7;;;;;;;;:::i;:::-;;;;;;;31632:13;:22::i;:::-;31601:53;;;;31661:19;31683:8;:20;31692:7;31700:1;31692:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;31683:20:0;-1:-1:-1;;;;;31683:20:0;;;;;;;;;;;;:25;31704:3;31683:25;;;;;;;;;;;;31661:47;;31715:16;31734:3;31715:22;;31769:30;31816:8;-1:-1:-1;;;;;31802:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31802:23:0;;31769:56;;31851:48;31865:11;22084:1;31893:5;31851:13;:48::i;:::-;31832:13;31846:1;31832:16;;;;;;;;:::i;:::-;;;;;;;;;;:67;31970:1;31953:387;31977:8;31973:1;:12;31953:387;;;32016:22;32030:4;32035:1;32030:7;;;;;;;;:::i;32016:22::-;32001:37;;-1:-1:-1;32001:37:0;-1:-1:-1;32123:15:0;;;;;:45;;;32158:7;32166:1;32158:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32142:26:0;:7;32152:1;32150;:3;;;;:::i;:::-;32142:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32142:26:0;;;32123:45;32119:136;;;32195:8;:20;32204:7;32212:1;32204:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32195:20:0;-1:-1:-1;;;;;32195:20:0;;;;;;;;;;;;:25;32216:3;32195:25;;;;;;;;;;;;32181:39;;32242:3;32231:14;;32119:136;32284:48;32298:11;22084:1;32326:5;32284:13;:48::i;:::-;32265:13;32279:1;32265:16;;;;;;;;:::i;:::-;;;;;;;;;;:67;31987:3;;;;:::i;:::-;;;;31953:387;;;-1:-1:-1;32355:13:0;31336:1038;-1:-1:-1;;;;;;;;31336:1038:0:o;45238:86::-;9166:7;;-1:-1:-1;;;;;9166:7:0;9152:10;:21;9144:72;;;;-1:-1:-1;;;9144:72:0;;;;;;;:::i;:::-;45305:13:::1;:7;45315:3:::0;;45305:13:::1;:::i;:::-;;45238:86:::0;;:::o;51801:1028::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;51892:37:::1;;:::i;:::-;51936:23;;:::i;:::-;51970:6;51966:858;51983:13;:20;51981:1;:22;51966:858;;;52026:30;52039:13;52053:1;52039:16;;;;;;;;:::i;:::-;;;;;;;52026:12;:30::i;:::-;52105:11;::::0;52017:39;;-1:-1:-1;52095:21:0::1;::::0;42035:6:::1;52095:21;:::i;:::-;52076:6;:16;;;:40;;;:80;;;;42035:6;52129:27;;:6;:16;;;:27;;;;52076:80;52073:135;;;52190:16;::::0;::::1;::::0;52165:43:::1;::::0;-1:-1:-1;;;52165:43:0;;28121:10:1;28109:23;;;52165:43:0::1;::::0;::::1;28091:42:1::0;28064:18;;52165:43:0::1;27946:193:1::0;52073:135:0::1;52250:16;::::0;::::1;::::0;52238:29:::1;;;::::0;;;:11:::1;:29;::::0;;;;;52224:44:::1;::::0;:13:::1;:44::i;:::-;52292:16;::::0;;::::1;::::0;52277:31:::1;::::0;;::::1;:12;::::0;;::::1;:31:::0;;;;52330:14:::1;::::0;::::1;::::0;52317:27;::::1;:10:::0;;::::1;:27:::0;;;;52366:14:::1;::::0;;::::1;::::0;52353:27;::::1;:10:::0;;::::1;:27:::0;52400:12:::1;::::0;;::::1;::::0;52389:23:::1;;:8;::::0;::::1;:23:::0;52435:15;;::::1;::::0;52421:29;::::1;:11;::::0;;::::1;:29:::0;;;;52471:13;::::1;::::0;52459:25;::::1;:9;::::0;;::::1;:25:::0;;;;52508:16;::::1;::::0;52493:31;::::1;:12;::::0;;::::1;:31:::0;;;;52546:14;::::1;::::0;52533:27;::::1;:10;::::0;;::::1;:27:::0;;;;52581:13;::::1;::::0;52569:25:::1;:9:::0;;::::1;:25:::0;52603:41:::1;52628:15;52603:41;:15;::::0;::::1;:41:::0;52219:49;-1:-1:-1;52746:15:0::1;52219:49:::0;52746:11:::1;:15::i;:::-;52714:11;:29;52726:6;:16;;;52714:29;;;;;;;;;;;;;:47;;;;52795:6;:16;;;52777:39;;;52813:2;52777:39;;;;;;:::i;:::-;;;;;;;;52004:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51966:858;;;;51885:944;;51801:1028:::0;:::o;43291:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59832:4536::-;59903:15;;;;60014:20;60050:8;-1:-1:-1;;;;;60037:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60014:52;;60079:9;60075:4268;60090:17;;;60075:4268;;;42035:6;60144:8;;60153:1;60144:11;;;;;;;:::i;:::-;;;;;;;:21;:61;;;;-1:-1:-1;60194:11:0;;60184:21;;42035:6;60184:21;:::i;:::-;60169:8;;60178:1;60169:11;;;;;;;:::i;:::-;;;;;;;:36;;60144:61;60141:1593;;;60218:27;60248:39;60262:11;:24;60274:8;;60283:1;60274:11;;;;;;;:::i;60248:39::-;60218:69;;60302:6;:14;;;:19;;60320:1;60302:19;60298:1152;;60346:32;60363:6;:14;;;60346:32;;:16;:32::i;:::-;60336:42;;60440:10;60463:29;60480:8;;60489:1;60480:11;;;;;;;:::i;:::-;;;;;;;60463:16;:29::i;:::-;60527:16;;60509:43;;60526:25;;60550:1;60526:25;;;60546:1;60526:25;60509:43;;:16;:43::i;:::-;60569:28;60586:6;:10;;;60569:28;;:16;:28::i;:::-;60614:32;60631:6;:14;;;60614:32;;:16;:32::i;:::-;60663:34;60680:6;:16;;;60663:34;;:16;:34::i;:::-;60411:303;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60391:324;;60779:10;60802:32;60819:6;:14;;;60802:32;;:16;:32::i;:::-;60851:30;60868:6;:12;;;60851:30;;:16;:30::i;:::-;60898:45;60915:6;:27;;;60898:45;;:16;:45::i;:::-;60960:29;60977:6;:11;;;60960:29;;:16;:29::i;:::-;61006:37;61023:6;:19;;;61006:37;;:16;:37::i;:::-;60750:310;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60730:331;;61125:10;61148:30;61165:6;:12;;;61148:30;;:16;:30::i;:::-;61195:33;61212:6;:15;;;61195:33;;:16;:33::i;:::-;61245:31;61262:6;:13;;;61245:31;;:16;:31::i;:::-;61293:34;61310:6;:16;;;61293:34;;:16;:34::i;:::-;61344:32;61361:6;:14;;;61344:32;;:16;:32::i;:::-;61393:31;61410:6;:13;;;61393:31;;:16;:31::i;:::-;61096:341;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61076:362;;60298:1152;61472:16;;:69;;;;;;;;;;;;;;;-1:-1:-1;;;61472:69:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61472:69:0;;;;61462:79;;61600:7;61620;61640;61702:10;61571:152;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61554:4;61559:1;61554:7;;;;;;;;:::i;:::-;;;;;;:170;;;;60207:1527;60141:1593;41892:4;61764:8;;61773:1;61764:11;;;;;;;:::i;:::-;;;;;;;:18;:52;;;;-1:-1:-1;61808:8:0;;61801:15;;41892:4;61801:15;:::i;:::-;61786:8;;61795:1;61786:11;;;;;;;:::i;:::-;;;;;;;:30;;61764:52;61761:535;;;61829:24;61856:14;:27;61871:8;;61880:1;61871:11;;;;;;;:::i;:::-;;;;;;;;;;61856:27;;-1:-1:-1;61856:27:0;;;;;;;;;;;-1:-1:-1;61856:27:0;61829:54;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61898:32:0;61894:241;;61994:10;62017:30;62034:6;:12;;;62017:30;;:16;:30::i;:::-;62064:45;62081:6;:27;;;62064:45;;:16;:45::i;:::-;61965:157;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61945:178;;61894:241;62193:7;62264:10;62164:121;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62147:4;62152:1;62147:7;;;;;;;;:::i;:::-;;;;;;:139;;;;61818:478;61761:535;41926:5;62328:8;;62337:1;62328:11;;;;;;;:::i;:::-;;;;;;;:20;:58;;;;-1:-1:-1;62376:10:0;;62367:19;;41926:5;62367:19;:::i;:::-;62352:8;;62361:1;62352:11;;;;;;;:::i;:::-;;;;;;;:34;;62328:58;62325:545;;;62399:24;62426:14;:27;62441:8;;62450:1;62441:11;;;;;;;:::i;:::-;;;;;;;;;;62426:27;;-1:-1:-1;62426:27:0;;;;;;;;;;;-1:-1:-1;62426:27:0;62399:54;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62468:32:0;62464:241;;62564:10;62587:30;62604:6;:12;;;62587:30;;:16;:30::i;:::-;62634:45;62651:6;:27;;;62634:45;;:16;:45::i;:::-;62535:157;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62515:178;;62464:241;62763:7;62838:10;62734:125;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62717:4;62722:1;62717:7;;;;;;;;:::i;:::-;;;;;;:143;;;;62388:482;62325:545;41960:5;62915:8;;62924:1;62915:11;;;;;;;:::i;:::-;;;;;;;:19;:55;;;;-1:-1:-1;62961:9:0;;62953:17;;41960:5;62953:17;:::i;:::-;62938:8;;62947:1;62938:11;;;;;;;:::i;:::-;;;;;;;:32;;62915:55;62914:143;;;-1:-1:-1;41999:5:0;62987:8;;62996:1;62987:11;;;;;;;:::i;:::-;;;;;;;:24;:69;;;;-1:-1:-1;63043:13:0;;63030:26;;41999:5;63030:26;:::i;:::-;63015:8;;63024:1;63015:11;;;;;;;:::i;:::-;;;;;;;:41;;62987:69;62910:1426;;;63104:28;63135:18;:31;63154:8;;63163:1;63154:11;;;;;;;:::i;:::-;;;;;;;;;;63135:31;;-1:-1:-1;63135:31:0;;;;;;;;;;;-1:-1:-1;63135:31:0;63104:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63104:62:0;;;;;;;-1:-1:-1;;;63104:62:0;;;-1:-1:-1;;;;;63104:62:0;;;;;;-1:-1:-1;41999:5:0;63205:8;;63214:1;63205:11;;;;;;;:::i;:::-;;;;;;;:24;:69;;;;-1:-1:-1;63261:13:0;;63248:26;;41999:5;63248:26;:::i;:::-;63233:8;;63242:1;63233:11;;;;;;;:::i;:::-;;;;;;;:41;;63205:69;63202:275;;;63399:29;63416:8;;63425:1;63416:11;;;;;;;:::i;63399:29::-;63369:60;;;;;;;;:::i;:::-;;;;;;;;;;;;;63352:78;;63202:275;41960:5;63510:8;;63519:1;63510:11;;;;;;;:::i;:::-;;;;;;;:19;:55;;;;-1:-1:-1;63556:9:0;;63548:17;;41960:5;63548:17;:::i;:::-;63533:8;;63542:1;63533:11;;;;;;;:::i;:::-;;;;;;;:32;;63510:55;63507:257;;;63703:11;;63686:29;;;;:16;:29::i;:::-;63660:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;63643:74;;63507:257;63780:27;;;;:32;;;63776:388;;63876:10;63899:27;63916:6;:9;;;63899:27;;:16;:27::i;:::-;63943:30;63960:6;:12;;;63943:30;;:16;:30::i;:::-;64007:11;;63990:29;;;;:16;:29::i;:::-;64036:45;64053:6;:27;;;64036:45;;:16;:45::i;:::-;64098:40;64115:6;:22;;;64098:40;;:16;:40::i;:::-;63847:304;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63827:325;;63776:388;64222:7;64242;64304:10;64193:132;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64176:4;64181:1;64176:7;;;;;;;;:::i;:::-;;;;;;:150;;;;63059:1277;62910:1426;60108:3;;;;:::i;:::-;;;;60075:4268;;;-1:-1:-1;64358:4:0;59832:4536;-1:-1:-1;;;;;;59832:4536:0:o;45055:84::-;9166:7;;-1:-1:-1;;;;;9166:7:0;9152:10;:21;9144:72;;;;-1:-1:-1;;;9144:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45113:13:0::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;45113:20:0::1;45129:4;45113:20;::::0;;45055:84::o;48832:1032::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;49004:11:::1;49025;49022:491;;;49049:13;::::0;42224:4:::1;-1:-1:-1::0;49046:68:0::1;;49096:18;;-1:-1:-1::0;;;49096:18:0::1;;;;;;;;;;;49046:68;41999:5;49129:28;;49131:13;;49129:15;;;;;:::i;:::-;::::0;;;;-1:-1:-1;49129:28:0::1;::::0;;::::1;:::i;:::-;49123:34;;49210:67;49236:3;42693:1;49259;49262:14;49210:25;:67::i;:::-;49022:491;;;49305:9;::::0;42174:4:::1;-1:-1:-1::0;49302:59:0::1;;49343:18;;-1:-1:-1::0;;;49343:18:0::1;;;;;;;;;;;49302:59;41960:5;49376:19;;49378:9;;49376:11;;;;;:::i;:::-;::::0;;;;-1:-1:-1;49376:19:0::1;::::0;;::::1;:::i;:::-;49370:25;;49443:62;49469:3;42641:1;49487;49490:14;49443:25;:62::i;:::-;49521:28;;:::i;:::-;49576:5;49556:6;:11;;:26;;;;;;;;;::::0;::::1;49610:6;49589;:12;;:28;;;;;;;;;::::0;::::1;49643:3;49624:6;:9;;:23;;;;;;;;;::::0;::::1;49691:15;49654:6;:27;;:53;;;;;;;;;::::0;::::1;49729:3;49714:6;:12;;:18;-1:-1:-1::0;;;;;49714:18:0::1;;;-1:-1:-1::0;;;;;49714:18:0::1;;;::::0;::::1;49765:6;49739:18;:23;49758:3;49739:23;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49739:32:0::1;;;;;-1:-1:-1::0;;;;;49739:32:0::1;;;;;;;;;49780:28;49787:3;49793;49798:1;49802:5;49780;:28::i;:::-;49846:3;-1:-1:-1::0;;;;;49820:38:0::1;49841:3;49820:38;49851:6;49820:38;;;;;;:::i;:::-;;;;;;;;48995:869;;48832:1032:::0;;;;;:::o;55130:143::-;55190:20;;:::i;:::-;55242;;;;:11;:20;;;;;;55228:35;;:13;:35::i;59559:86::-;59600:13;59630:7;59623:14;;;;;:::i;53930:307::-;54010:23;54041:27;54092:8;-1:-1:-1;;;;;54071:37:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;54041:67;;54120:6;54115:100;54132:19;;;54115:100;;;54176:18;:31;54195:8;;54204:1;54195:11;;;;;;;:::i;:::-;;;;;;;;;;54176:31;;-1:-1:-1;54176:31:0;;;;;;;;;;;-1:-1:-1;54176:31:0;54167:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54167:40:0;;;;;;;-1:-1:-1;;;54167:40:0;;;-1:-1:-1;;;;;54167:40:0;;;;;:6;;;;54171:1;;54167:6;;;;;;:::i;:::-;;;;;;:40;;;;54153:3;;;;;:::i;:::-;;;;54115:100;;47980:846;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;48100:11:::1;48121:6;48118:460;;;48140:8;::::0;42083:4:::1;-1:-1:-1::0;48137:57:0::1;;48176:18;;-1:-1:-1::0;;;48176:18:0::1;;;;;;;;;;;48137:57;41892:4;48209:17;;48211:8;;48209:10;;;;;:::i;:::-;::::0;;;;-1:-1:-1;48209:17:0::1;::::0;;::::1;:::i;:::-;48203:23;;48275:61;48301:3;42546:1;48318;48321:14;48275:25;:61::i;:::-;48118:460;;;48362:10;::::0;42129:4:::1;-1:-1:-1::0;48359:61:0::1;;48402:18;;-1:-1:-1::0;;;48402:18:0::1;;;;;;;;;;;48359:61;41926:5;48435:21;;48437:10;;48435:12;;;;;:::i;:::-;::::0;;;;-1:-1:-1;48435:21:0::1;::::0;;::::1;:::i;:::-;48429:27;;48507:63;48533:3;42594:1;48552;48555:14;48507:25;:63::i;:::-;-1:-1:-1::0;;;;;;;;48617:28:0::1;::::0;;::::1;::::0;;48652:53:::1;48689:15;48652:53:::0;::::1;-1:-1:-1::0;;;;48652:53:0;;;-1:-1:-1;48712:19:0;;;:14:::1;:19:::0;;;;;:28;;;;;;;;::::1;;;-1:-1:-1::0;;48712:28:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;48749:25;;;;::::1;::::0;;;;;;-1:-1:-1;48749:25:0::1;::::0;48756:3;;48712:19;;-1:-1:-1;;48749:5:0::1;:25::i;:::-;48786:34;::::0;;17595:13:1;;17610:4;17591:24;17573:43;;17676:4;17664:17;;;17658:24;17684:10;17654:41;17632:20;;;17625:71;-1:-1:-1;;;;;48786:34:0;::::1;::::0;48803:3;;48786:34:::1;::::0;17546:18:1;48786:34:0::1;;;;;;;48087:739;;47980:846:::0;;;:::o;52835:1089::-;52913:16;52955:11;52973:12;42500:1;52995:8;:25;52992:92;;-1:-1:-1;;53065:11:0;;42035:6;;52992:92;42546:1;53093:8;:22;53090:83;;-1:-1:-1;;53157:8:0;;41892:4;;53090:83;42594:1;53182:8;:24;53179:89;;-1:-1:-1;;53250:10:0;;41926:5;;53179:89;42693:1;53277:8;:28;53274:100;;-1:-1:-1;;53353:13:0;;41999:5;;53274:100;42641:1;53383:8;:23;53380:86;;-1:-1:-1;;53449:9:0;;41960:5;;53380:86;-1:-1:-1;;;;;53527:23:0;;53499:11;53527:23;;;:17;:23;;;;;;;;53513:79;;53583:8;53513:13;:79::i;:::-;53499:93;;53599:26;53642:3;-1:-1:-1;;;;;53628:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53628:18:0;-1:-1:-1;53599:47:0;-1:-1:-1;53715:10:0;53743:1;53732:164;53752:3;53746:5;:9;:25;;;;;53764:7;53759:1;:12;;53746:25;53732:164;;;53789:27;53799:4;53805:10;53814:1;53805:6;:10;:::i;53789:27::-;53819:1;53789:31;53786:103;;53851:10;53860:1;53851:6;:10;:::i;:::-;53832:9;53842:5;53832:16;;;;;;;;:::i;:::-;;;;;;;;;;:29;53872:7;;;;:::i;:::-;;;;53786:103;53773:3;;;;:::i;:::-;;;;53732:164;;;-1:-1:-1;53909:9:0;;52835:1089;-1:-1:-1;;;;;;;52835:1089:0:o;29654:236::-;29790:10;29780:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;29780:32:0;;;;;;;;;;;;:44;;-1:-1:-1;;29780:44:0;;;;;;;;;;29836:48;;1606:41:1;;;29780:32:0;;29790:10;29836:48;;1579:18:1;29836:48:0;;;;;;;29654:236;;:::o;59046:299::-;59143:4;;59155:167;59172:19;;;59155:167;;;59205:11;59219:28;59229:4;59235:8;;59244:1;59235:11;;;;;;;:::i;:::-;;;;;;;59219:9;:28::i;:::-;59205:42;;59259:3;59266:1;59259:8;59256:58;;59301:8;;59310:1;59301:11;;;;;;;:::i;59256:58::-;-1:-1:-1;59192:3:0;;;;:::i;:::-;;;;59155:167;;;-1:-1:-1;59335:4:0;;59046:299;-1:-1:-1;;;;59046:299:0:o;51231:564::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;51341:32;;::::1;51338:60;;51382:16;;-1:-1:-1::0;;;51382:16:0::1;;;;;;;;;;;51338:60;51407:23;;:::i;:::-;51441:6;51437:353;51452:17:::0;;::::1;51437:353;;;51488:39;51502:11;:24;51514:8;;51523:1;51514:11;;;;;;;:::i;51488:39::-;51539:12:::0;;51483:44;;-1:-1:-1;51536:247:0::1;;;51580:6;;51587:1;51580:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;51563:27;;:8;::::0;::::1;:27:::0;-1:-1:-1;51634:15:0::1;51601:49;;:23;::::0;::::1;:49:::0;51688:15:::1;51563:8:::0;51688:11:::1;:15::i;:::-;51661:11;:24;51673:8;;51682:1;51673:11;;;;;;;:::i;:::-;;;;;;;51661:24;;;;;;;;;;;:42;;;;51747:2;:8;;;51719:54;;51734:8;;51743:1;51734:11;;;;;;;:::i;:::-;;;;;;;51719:54;51757:15;51719:54;;;;948:25:1::0;;936:2;921:18;;802:177;51719:54:0::1;;;;;;;;51536:247;51470:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51437:353;;;;51331:464;51231:564:::0;;;;:::o;50872:353::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;-1:-1:-1;;;;;;;;51015:30:0::1;::::0;;::::1;::::0;;51052:53:::1;51089:15;51052:53:::0;;::::1;-1:-1:-1::0;;;;51052:53:0;;;-1:-1:-1;51112:23:0;;;:14:::1;:23:::0;;;;;:32;;;;;;;;::::1;;;-1:-1:-1::0;;51112:32:0;;;;;;::::1;::::0;;;;;;::::1;::::0;;;51162:57;;948:25:1;;;-1:-1:-1;;51112:23:0;;51162:57:::1;::::0;921:18:1;51162:57:0::1;;;;;;;50970:255;50872:353:::0;;:::o;45506:2467::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;45672:39;;::::1;45669:67;;45720:16;;-1:-1:-1::0;;;45720:16:0::1;;;;;;;;;;;45669:67;45745:21;45783:11:::0;-1:-1:-1;;;;;45769:33:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;45769:33:0::1;-1:-1:-1::0;45745:57:0;-1:-1:-1;45809:25:0::1;45851:11:::0;-1:-1:-1;;;;;45837:33:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;45837:33:0::1;;45809:61;;45877:19;45899:11;;45913:1;45899:15;;;;:::i;:::-;45877:37;;45946:18;45971:15:::0;45997:6:::1;45993:1702;46005:20:::0;;::::1;45993:1702;;;46061:13:::0;::::1;::::0;::::1;:::i;:::-;::::0;-1:-1:-1;46050:24:0::1;::::0;42035:6:::1;46050:24;:::i;:::-;46039:4;46044:1;46039:7;;;;;;;;:::i;:::-;;;;;;:35;;;::::0;::::1;46098:1;46084:8;46093:1;46084:11;;;;;;;;:::i;:::-;;;;;;:15;;;::::0;::::1;46131:11;;46143:1;46131:14;;;;;;;:::i;:::-;:24;::::0;::::1;:14;::::0;;::::1;;:24:::0;;::::1;::::0;-1:-1:-1;46131:24:0::1;:::i;:::-;:32;;46162:1;46131:32;;;46158:1;46131:32;46118:45;;::::0;-1:-1:-1;46182:1:0::1;::::0;-1:-1:-1;46267:11:0;;46279:1;46267:14;;::::1;;;;;:::i;:::-;;;;;;:20;;;;;;;;;;:::i;:::-;46257:30;;;;46319:1;46310:7;:10;;46296:24;;;;46339:11;;46351:1;46339:14;;;;;;;:::i;:::-;:24;::::0;::::1;:14;::::0;;::::1;;:24:::0;;::::1;::::0;-1:-1:-1;46339:24:0::1;:::i;:::-;:50;;46370:11;;46382:1;46370:14;;;;;;;:::i;:::-;;;;;;:19;;;;;;;;;;:::i;:::-;46339:50;;;46366:1;46339:50;46329:60;;;;46421:2;46412:7;:11;;46398:25;;;;46442:11;;46454:1;46442:14;;;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;46432:32;;;;46496:2;46487:7;:11;;46473:25;;;;46518:11;;46530:1;46518:14;;;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;46507:33;;;;46572:2;46563:7;:11;;46549:25;;;;46594:11;;46606:1;46594:14;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;46583:35;;;;46650:2;46641:7;:11;;46627:25;;;;46672:11;;46684:1;46672:14;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;;:::i;:::-;46661:34;;;;46727:2;46718:7;:11;;46704:25;;;;46749:11;;46761:1;46749:14;;;;;;;:::i;:::-;;;;;;:21;;;;;;;;;;:::i;:::-;46738:32;;;;46802:2;46793:7;:11;;46779:25;;;;46824:11;;46836:1;46824:14;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;:::i;:::-;46813:35;;;;46880:2;46871:7;:11;;46857:25;;;;46902:11;;46914:1;46902:14;;;;;;;:::i;:::-;;;;;;:22;;;;;;;;;;:::i;:::-;46891:33;;;;46956:2;46947:7;:11;;46933:25;;;;46978:11;;46990:1;46978:14;;;;;;;:::i;:::-;;;;;;:21;;;;;;;;;;:::i;:::-;46967:32;;;;47031:2;47022:7;:11;;47008:25;;;;47053:11;;47065:1;47053:14;;;;;;;:::i;:::-;;;;;;:18;;;;;;;;;;:::i;:::-;:23;;47075:1;47053:23;:33;;47083:3;47053:33;;;47079:1;47053:33;47042:44;;;;47118:2;47109:7;:11;;47095:25;;;;47157:10;;47168:1;47157:13;;;;;;;:::i;:::-;;;;;;;47147:23;;47202:3;47193:7;:12;;47179:26;;;;47250:15;47240:25;;47297:3;47288:7;:12;;47274:26;;;;47344:15;47334:25;;47391:3;47382:7;:12;;47368:26;;;;47435:15;47425:25;;47482:3;47473:7;:12;;47459:26;;;;47599:10;47576:11;:20;47588:4;47593:1;47588:7;;;;;;;;:::i;:::-;;;;;;;47576:20;;;;;;;;;;;:33;;;;47656:3;-1:-1:-1::0;;;;;47625:62:0::1;47647:4;47652:1;47647:7;;;;;;;;:::i;:::-;;;;;;;47625:62;47661:25;47675:10;47661:13;:25::i;:::-;47625:62;;;;;;:::i;:::-;;;;;;;;46026:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45993:1702;;;;47752:11;;:18;;47737:11;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;47816:80:0::1;::::0;-1:-1:-1;47842:3:0;42500:1:::1;47862:10:::0;47881:14:::1;47816:25;:80::i;:::-;47930:37;47942:3;47948:4;47954:8;47930:37;;;;;;;;;;;::::0;:10:::1;:37::i;:::-;45657:2316;;;;;45506:2467:::0;;;;;:::o;35244:195::-;35306:11;;22194:19;22084:1;22194:3;:19;:::i;:::-;35350:21;;:3;:21;:::i;:::-;35344:27;-1:-1:-1;22194:19:0;22084:1;22194:3;:19;:::i;:::-;35386:21;;:3;:21;:::i;:::-;35378:29;;35244:195;;;:::o;35704:448::-;35806:7;;36005:27;36031:1;36006:21;;;36005:27;:::i;:::-;35990:42;-1:-1:-1;36062:18:0;36083:16;36093:6;36083:7;:16;:::i;:::-;36114:24;;;;36113:33;;35704:448;-1:-1:-1;;;;35704:448:0:o;54563:253::-;45000:10;44992:19;;;;:7;:19;;;;;;;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;54704:11:::1;:41;;54744:1;54704:41;;;54725:15;54704:41;54658:27;::::0;;;:18:::1;:27;::::0;;;;;;:87;;::::1;::::0;;;::::1;-1:-1:-1::0;;;54658:87:0::1;-1:-1:-1::0;;54658:87:0;;::::1;::::0;;;::::1;::::0;;;54757:53;::::1;::::0;::::1;::::0;54677:7;;54794:15:::1;::::0;23172:25:1;;;23228:2;23213:18;;23206:34;23160:2;23145:18;;22998:248;54757:53:0::1;;;;;;;;54563:253:::0;;:::o;30160:164::-;-1:-1:-1;;;;;30290:17:0;;;30256:15;30290:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;30160:164::o;55850:1837::-;56020:10;-1:-1:-1;;;;;56020:19:0;;;;56019:60;;;56044:35;56061:5;56068:10;56044:16;:35::i;:::-;56011:90;;;;-1:-1:-1;;;56011:90:0;;27192:2:1;56011:90:0;;;27174:21:1;27231:2;27211:18;;;27204:30;-1:-1:-1;;;27250:18:1;;;27243:47;27307:18;;56011:90:0;26990:341:1;56011:90:0;-1:-1:-1;;;;;56116:17:0;;56108:47;;;;-1:-1:-1;;;56108:47:0;;27538:2:1;56108:47:0;;;27520:21:1;27577:2;27557:18;;;27550:30;-1:-1:-1;;;27596:18:1;;;27589:48;27654:18;;56108:47:0;27336:342:1;56108:47:0;41892:4;56170:10;;:36;;;;-1:-1:-1;56198:8:0;;56191:15;;41892:4;56191:15;:::i;:::-;56184:3;:22;;56170:36;56167:209;;;56219:67;56245:3;42546:1;56262:7;56271:14;56219:25;:67::i;:::-;56297:69;56323:5;42546:1;56342:7;56351:14;56297:25;:69::i;:::-;41926:5;56387:12;;:42;;;;-1:-1:-1;56419:10:0;;56410:19;;41926:5;56410:19;:::i;:::-;56403:3;:26;;56387:42;56384:219;;;56441:69;56467:3;42594:1;56486:7;56495:14;56441:25;:69::i;:::-;56521:71;56547:5;42594:1;56568:7;56577:14;56521:25;:71::i;:::-;42035:6;56614:13;;:45;;;;-1:-1:-1;56648:11:0;;56638:21;;42035:6;56638:21;:::i;:::-;56631:3;:28;;56614:45;56611:278;;;56672:70;56698:3;42500:1;56718:7;56727:14;56672:25;:70::i;:::-;56780:72;56806:5;42500:1;56828:7;56837:14;56780:25;:72::i;:::-;41999:5;56900:16;;:53;;;;-1:-1:-1;56940:13:0;;56927:26;;41999:5;56927:26;:::i;:::-;56920:3;:33;;56900:53;56897:338;;;56966:73;56992:3;42693:1;57015:7;57024:14;56966:25;:73::i;:::-;57077:75;57103:5;42693:1;57128:7;57137:14;57077:25;:75::i;:::-;57190:23;;;;:18;:23;;;;;:35;;-1:-1:-1;;;;;57190:35:0;-1:-1:-1;;;;;;;;57190:35:0;;;;;;56897:338;41960:5;57246:11;;:39;;;;-1:-1:-1;57276:9:0;;57268:17;;41960:5;57268:17;:::i;:::-;57261:3;:24;;57246:39;57243:314;;;57298:68;57324:3;42641:1;57342:7;57351:14;57298:25;:68::i;:::-;57404:70;57430:5;42641:1;57450:7;57459:14;57404:25;:70::i;:::-;57512:23;;;;:18;:23;;;;;:35;;-1:-1:-1;;;;;57512:35:0;-1:-1:-1;;;;;;;;57512:35:0;;;;;;57243:314;57565:43;57583:5;57590:3;57595;57600:7;57565:17;:43::i;:::-;57615:66;57638:5;57645:3;57650;57655:7;57664:9;57675:5;57615:22;:66::i;:::-;55850:1837;;;;;:::o;9367:232::-;9166:7;;-1:-1:-1;;;;;9166:7:0;9152:10;:21;9144:72;;;;-1:-1:-1;;;9144:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9445:23:0;::::1;9437:78;;;::::0;-1:-1:-1;;;9437:78:0;;41361:2:1;9437:78:0::1;::::0;::::1;41343:21:1::0;41400:2;41380:18;;;41373:30;41439:34;41419:18;;;41412:62;-1:-1:-1;;;41490:18:1;;;41483:40;41540:19;;9437:78:0::1;41159:406:1::0;9437:78:0::1;9548:7;::::0;9527:40:::1;::::0;-1:-1:-1;;;;;9527:40:0;;::::1;::::0;9548:7:::1;::::0;9527:40:::1;::::0;9548:7:::1;::::0;9527:40:::1;9574:7;:19:::0;;-1:-1:-1;;;;;;9574:19:0::1;-1:-1:-1::0;;;;;9574:19:0;;;::::1;::::0;;;::::1;::::0;;9367:232::o;49870:996::-;45000:10;44992:19;;;;:7;:19;;;;;;50041:23;;44992:19;;44988:46;;45020:14;;-1:-1:-1;;;45020:14:0;;;;;;;;;;;44988:46;50076:35;;::::1;50073:63;;50120:16;;-1:-1:-1::0;;;50120:16:0::1;;;;;;;;;;;50073:63;50146:34:::0;;::::1;50143:62;;50189:16;;-1:-1:-1::0;;;50189:16:0::1;;;;;;;;;;;50143:62;50212:30;50266:8:::0;-1:-1:-1;;;;;50245:37:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;50212:70;;50295:6;50291:550;50306:17:::0;;::::1;50291:550;;;50349:18;:31;50368:8;;50377:1;50368:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;50349:31:::0;;-1:-1:-1;50349:31:0;;::::1;::::0;;;;;;;;-1:-1:-1;50349:31:0;50337:43;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;::::1;;;::::0;;;;;;;;;::::1;;::::0;;::::1;::::0;;;;-1:-1:-1;;;50337:43:0;::::1;;::::0;;;;-1:-1:-1;;;50337:43:0;;::::1;-1:-1:-1::0;;;;;50337:43:0::1;::::0;;;;:9;;;;50344:1;;50337:9;::::1;;;;;:::i;:::-;;;;;;:43;;;;50448:8;;50457:1;50448:11;;;;;;;:::i;:::-;;;;;;;50463:1;50448:16:::0;50447:56:::1;;50489:6;50496:1;50489:9;;;;;;;;:::i;:::-;;;;;;;:14;;;50447:56;;;50474:8;;50483:1;50474:11;;;;;;;:::i;:::-;;;;;;;50447:56;50430:6;50437:1;50430:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:73:::1;::::0;;::::1;::::0;;50538:9;;50548:1;50538:12;;::::1;;;;;:::i;:::-;;;;;;;50554:1;50538:17:::0;50537:59:::1;;50581:6;50588:1;50581:9;;;;;;;;:::i;:::-;;;;;;;:15;;;50537:59;;;50565:9;;50575:1;50565:12;;;;;;;:::i;:::-;;;;;;;50537:59;50519:6;50526:1;50519:9;;;;;;;;:::i;:::-;;;;;;;:15;;:77;;;;;;;;;::::0;::::1;50645:15;50605:6;50612:1;50605:9;;;;;;;;:::i;:::-;;;;;;;:30;;:56;;;;;;;;;::::0;::::1;50718:6;50725:1;50718:9;;;;;;;;:::i;:::-;;;;;;;50684:18;:31;50703:8;;50712:1;50703:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;50684:31:::0;;-1:-1:-1;50684:31:0;;::::1;::::0;;;;;;;;-1:-1:-1;50684:31:0;:43;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;50684:43:0::1;-1:-1:-1::0;;;50684:43:0::1;-1:-1:-1::0;;;;;50684:43:0::1;::::0;;::::1;-1:-1:-1::0;;;50684:43:0::1;::::0;-1:-1:-1;;;;;50684:43:0;;;::::1;::::0;::::1;-1:-1:-1::0;;50684:43:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;50684:43:0::1;::::0;;::::1;;;-1:-1:-1::0;;50684:43:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;::::1;::::0;;50818:9;;:6;;50825:1;;50818:9;::::1;;;;;:::i;:::-;;;;;;;:14;;;50749:84;;50801:6;50808:1;50801:9;;;;;;;;:::i;:::-;;;;;;;:15;;;50749:84;;50771:8;;50780:1;50771:11;;;;;;;:::i;:::-;;;;;;;50749:84;50784:15;50749:84;;;;948:25:1::0;;936:2;921:18;;802:177;50749:84:0::1;;;;;;;;50324:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50291:550;;;-1:-1:-1::0;50854:6:0;49870:996;-1:-1:-1;;;;;;;49870:996:0:o;36501:248::-;36604:4;-1:-1:-1;;;;;;;;;36621:42:0;;;36617:76;;-1:-1:-1;36681:4:0;;36501:248;-1:-1:-1;36501:248:0:o;36617:76::-;-1:-1:-1;;;;;;;;;11752:47:0;;;36706:37;11646:159;64375:1040;64443:20;;:::i;:::-;64472:28;;:::i;:::-;64530:22;64551:1;64536:13;64530:22;:::i;:::-;:27;;64556:1;64530:27;:42;;64567:5;64530:42;;;64560:4;64530:42;64510:62;;;;64593:25;64617:1;64614;64599:16;;;64593:25;:::i;:::-;64579:39;;;;:11;;;:39;64663:1;64648:16;;;64626:39;;:13;;;:39;64708:2;64693:17;;;64672:39;;:12;;;:39;64757:2;64742:17;;;64718:42;;:15;;;:42;64806:2;64791:17;;;64767:42;;:15;;;:42;64857:2;64842:17;;;64816:44;;:17;;;:44;64907:2;64892:17;;;64867:43;;:16;;;:43;64955:2;64940:17;;;64917:41;;:14;;;:41;65006:2;64991:17;;;64965:44;;:17;;;:44;65055:2;65040:17;;;65016:42;;:15;;;:42;65103:2;65088:17;;;65065:41;:14;;;:41;65113;65151:2;65136:17;;;65113:41;;:13;;;:41;65201:3;65186:18;;;65161:44;:15;;;:44;65212:57;65265:3;65250:18;;;65212:57;;:28;;;:57;65328:3;65313:18;;;65276:56;;:27;;;:56;65384:3;65369:18;;;;65339:49;;;:20;;;:49;-1:-1:-1;64579:7:0;64375:1040::o;33288:300::-;-1:-1:-1;;;;;33494:27:0;;;;;;:17;:27;;;;;;;;;33474:108;;33554:6;33562:7;33571:10;33474:19;:108::i;:::-;-1:-1:-1;;;;;33444:27:0;;;;;;;:17;:27;;;;;:138;;;;-1:-1:-1;;;33288:300:0:o;26668:1991::-;26822:11;;26889:15;;26876:28;;26873:56;;26913:16;;-1:-1:-1;;;26913:16:0;;;;;;;;;;;26873:56;26951:3;-1:-1:-1;;;;;26942:12:0;:5;-1:-1:-1;;;;;26942:12:0;;;:29;;;;;26970:1;26958:9;:13;26942:29;26938:1602;;;27054:11;27067:13;27084:22;27098:4;27103:1;27098:7;;;;;;;;:::i;27084:22::-;27053:53;;;;27195:15;27213:91;27233:8;:15;27242:5;-1:-1:-1;;;;;27233:15:0;-1:-1:-1;;;;;27233:15:0;;;;;;;;;;;;:20;27249:3;27233:20;;;;;;;;;;;;22084:1;27269:5;27276:8;27285:1;27276:11;;;;;;;;:::i;:::-;;;;;;;27289:14;27213:19;:91::i;:::-;27195:109;;27313:13;27329:89;27349:8;:13;27358:3;-1:-1:-1;;;;;27349:13:0;-1:-1:-1;;;;;27349:13:0;;;;;;;;;;;;:18;27363:3;27349:18;;;;;;;;;;;;22084:1;27383:5;27390:8;27399:1;27390:11;;;;;;;;:::i;:::-;;;;;;;27403:14;27329:19;:89::i;:::-;27313:105;-1:-1:-1;27474:3:0;27505:1;27488:706;27512:9;27508:1;:13;27488:706;;;27564:22;27578:4;27583:1;27578:7;;;;;;;;:::i;27564:22::-;27549:37;;-1:-1:-1;27549:37:0;-1:-1:-1;27626:14:0;;;27622:333;;-1:-1:-1;;;;;27708:15:0;;;:8;:15;;;;;;;;;;;:24;;;;;;;;;:34;;;;27755:13;;;;;;;;;;;:22;;;;;;;;;:30;;;;27810:20;;;;;;;;;;27851:18;;;;;;;;;;27810:20;;27622:333;28011:78;28031:7;22084:1;28054:5;28061:8;28070:1;28061:11;;;;;;;;:::i;28011:78::-;28001:88;;28108:76;28128:5;22084:1;28149:5;28156:8;28165:1;28156:11;;;;;;;;:::i;28108:76::-;28100:84;-1:-1:-1;27523:3:0;;;;:::i;:::-;;;;27488:706;;;-1:-1:-1;;;;;;;28253:15:0;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:30;;;;28292:13;;;;;;;;;;;:18;;;;;;;;:26;;;;-1:-1:-1;26938:1602:0;;;28414:9;28409:124;28433:9;28429:1;:13;28409:124;;;28497:8;28506:1;28497:11;;;;;;;;:::i;:::-;;;;;;;28468:25;28478:5;28485:4;28490:1;28485:7;;;;;;;;:::i;:::-;;;;;;;28468:9;:25::i;:::-;:40;;28460:63;;;;-1:-1:-1;;;28460:63:0;;41934:2:1;28460:63:0;;;41916:21:1;41973:2;41953:18;;;41946:30;-1:-1:-1;;;41992:18:1;;;41985:40;42042:18;;28460:63:0;41732:334:1;28460:63:0;28444:3;;;;:::i;:::-;;;;28409:124;;;;26938:1602;28633:3;-1:-1:-1;;;;;28600:53:0;28626:5;-1:-1:-1;;;;;28600:53:0;28614:10;-1:-1:-1;;;;;28600:53:0;;28638:4;28644:8;28600:53;;;;;;;:::i;:::-;;;;;;;;26795:1864;26668:1991;;;;:::o;28777:468::-;29002:16;:3;-1:-1:-1;;;;;29002:14:0;;:16::i;:::-;28998:242;;;29029:13;29067:3;-1:-1:-1;;;;;29045:49:0;;29100:9;29111:10;29123:5;29130:4;29136:8;29146:5;29045:107;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29029:123;-1:-1:-1;;;;;;;29164:38:0;;-1:-1:-1;;;29164:38:0;29161:71;;29211:21;;-1:-1:-1;;;29211:21:0;;;;;;;;;;;29161:71;29020:220;28777:468;;;;;;:::o;65421:1616::-;65502:7;65518:21;65542:15;:25;;;:33;;65574:1;65542:33;;;65570:1;65542:33;65518:57;;;;65584:15;65602;:19;;;65584:37;;;;65656:1;65647:7;:10;;65630:27;;;;65676:15;:21;;;65666:31;;;;65732:1;65723:7;:10;;65706:27;;;;65752:15;:25;;;:52;;65784:15;:20;;;65752:52;;;65780:1;65752:52;65742:62;;;;65839:2;65830:7;:11;;65813:28;;;;65860:15;:23;;;65850:33;;;;65918:2;65909:7;:11;;65892:28;;;;65940:15;:23;;;65929:34;;;;65998:2;65989:7;:11;;65972:28;;;;66020:15;:25;;;66009:36;;;;66080:2;66071:7;:11;;66054:28;;;;66102:15;:24;;;66091:35;;;;66161:2;66152:7;:11;;66135:28;;;;66183:15;:22;;;66172:33;;;;66240:2;66231:7;:11;;66214:28;;;;66262:15;:25;;;66251:36;;;;66322:2;66313:7;:11;;66296:28;;;;66344:15;:23;;;66333:34;;;;66402:2;66393:7;:11;;66376:28;;;;66424:15;:22;;;66413:33;;;;66481:2;66472:7;:11;;66455:28;;;;66503:15;:21;;;66492:32;;;;66559:2;66550:7;:11;;66533:28;;;;66598:15;:23;;;66588:33;;;;66656:3;66647:7;:12;;66630:29;;;;66704:15;:36;;;66694:46;;;;66775:3;66766:7;:12;;66749:29;;;;66822:15;:35;;;66812:45;;;;66892:3;66883:7;:12;;66866:29;;;;66936:15;:28;;;66926:38;;;;66999:3;66990:7;:12;;66973:29;;;;67018:13;67011:20;;;;65421:1616;;;:::o;67044:909::-;67116:38;;:::i;:::-;67168;;;;;;67258:1;67244:15;;;67215:45;;:20;;;;:45;;;;67312:2;67298:16;;;67269:46;;:20;;;;:46;;;;67362:2;67348:16;;;67324:41;;:15;;;;:41;;;;67400:16;;;;67374:43;;:17;;;;:43;;;;67464:2;67450:16;;;67426:41;;:15;;;;:41;;;;67515:2;67501:16;;;67476:42;;:16;;;;:42;;;;67564:2;67550:16;;;67527:40;;:14;;;:40;67602:16;;;;67576:43;;:17;;;:43;67666:2;67652:16;;;67628:41;;:15;;;:41;67715:2;67701:16;;;67678:40;;;:14;;;:40;67750:16;;;;67727:40;;:13;;;:40;67799:17;;;;67776:41;;;;:13;;;:41;67853:17;;;;67826:45;;:17;;;:45;67906:17;;;;67880:44;;;:16;;;:44;67168:38;67044:909::o;365:723::-;421:13;642:5;651:1;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;-1:-1:-1;;;;;867:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;;1073:6;365:723;-1:-1:-1;;;;365:723:0:o;37502:439::-;37623:53;37640:3;37647;37652:7;37661:14;37623:16;:53::i;:::-;37736:59;;;23172:25:1;;;23228:2;23213:18;;23206:34;;;-1:-1:-1;;;;;37736:59:0;;;37771:3;;37751:10;;37736:59;;23145:18:1;37736:59:0;;;;;;;37862:73;37893:3;37899;37904;37909:7;37918:9;37929:5;37862:22;:73::i;38244:1538::-;38389:8;:15;38374:4;:11;:30;38371:58;;38413:16;;-1:-1:-1;;;38413:16:0;;;;;;;;;;;38371:58;38442:11;;:15;38438:1097;;38538:11;38551:13;38568:22;38582:4;38587:1;38582:7;;;;;;;;:::i;38568:22::-;38537:53;;;;38679:13;38695:89;38715:8;:13;38724:3;-1:-1:-1;;;;;38715:13:0;-1:-1:-1;;;;;38715:13:0;;;;;;;;;;;;:18;38729:3;38715:18;;;;;;;;;;;;22084:1;38749:5;38756:8;38765:1;38756:11;;;;;;;;:::i;38695:89::-;38855:11;;38679:105;;-1:-1:-1;38922:3:0;38953:1;38936:506;38960:9;38956:1;:13;38936:506;;;39002:22;39016:4;39021:1;39016:7;;;;;;;;:::i;39002:22::-;38987:37;;-1:-1:-1;38987:37:0;-1:-1:-1;39064:14:0;;;39060:241;;-1:-1:-1;;;;;39146:13:0;;:8;:13;;;;;;;;;;;:22;;;;;;;;;:30;;;;39197:18;;;;;;;;;39060:241;39355:77;39375:5;22084:1;39397:5;39404:8;39413:1;39404:11;;;;;;;;:::i;39355:77::-;39347:85;-1:-1:-1;38971:3:0;;;;:::i;:::-;;;;38936:506;;;-1:-1:-1;;;;;;;;39501:13:0;;:8;:13;;;;;;;;;;;:18;;;;;;;;;;:26;;;;-1:-1:-1;38438:1097:0;39609:3;-1:-1:-1;;;;;39569:60:0;39603:3;-1:-1:-1;;;;;39569:60:0;39583:10;-1:-1:-1;;;;;39569:60:0;;39614:4;39620:8;39569:60;;;;;;;:::i;:::-;;;;;;;;39696:80;39732:3;39738;39743:4;39749:8;39759:9;39770:5;39696:27;:80::i;25326:394::-;25458:53;25475:5;25482:3;25487:7;25496:14;25458:16;:53::i;:::-;25549;25566:3;25573;25578:7;25587:14;25549:16;:53::i;:::-;25662:52;;;23172:25:1;;;23228:2;23213:18;;23206:34;;;-1:-1:-1;;;;;25662:52:0;;;;;;;;25677:10;;25662:52;;23145:18:1;25662:52:0;;;;;;;25326:394;;;;:::o;25833:425::-;26029:16;:3;-1:-1:-1;;;;;26029:14:0;;:16::i;:::-;26025:228;;;26056:13;26094:3;-1:-1:-1;;;;;26072:44:0;;26121:9;26132:10;26144:5;26151:3;26156:7;26165:5;26072:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26056:115;-1:-1:-1;;;;;;;26183:32:0;;-1:-1:-1;;;26183:32:0;26180:65;;26224:21;;-1:-1:-1;;;26224:21:0;;;;;;;;;;;34066:996;34216:20;;34264:16;34274:6;34264:7;:16;:::i;:::-;34248:32;-1:-1:-1;34287:12:0;34302:27;34328:1;34303:21;;;34302:27;:::i;:::-;34287:42;-1:-1:-1;34356:14:0;34342:10;:28;;;;;;;;:::i;:::-;;34338:691;;34396:31;34410:16;;;34396:10;:31;:::i;:::-;34381:46;;34460:10;34444:12;:26;;34436:49;;;;-1:-1:-1;;;34436:49:0;;44549:2:1;34436:49:0;;;44531:21:1;44588:2;44568:18;;;44561:30;-1:-1:-1;;;44607:18:1;;;44600:40;44657:18;;34436:49:0;44347:334:1;34436:49:0;34555:10;34558:7;34555:1;:10;:::i;:::-;34512:40;34545:7;34514:19;;;34513:28;;34512:40;:::i;:::-;:53;34494:137;;;;-1:-1:-1;;;34494:137:0;;46262:2:1;34494:137:0;;;46244:21:1;46301:1;46281:18;;;46274:29;-1:-1:-1;;;46319:18:1;;;46312:39;46368:18;;34494:137:0;46060:332:1;34494:137:0;34338:691;;;34665:14;34651:10;:28;;;;;;;;:::i;:::-;;34647:382;;34705:31;34719:16;;;34705:10;:31;:::i;:::-;34690:46;;34769:10;34753:12;:26;;34745:49;;;;-1:-1:-1;;;34745:49:0;;41934:2:1;34745:49:0;;;41916:21:1;41973:2;41953:18;;;41946:30;-1:-1:-1;;;41992:18:1;;;41985:40;42042:18;;34745:49:0;41732:334:1;34745:49:0;34855:7;34846:4;34837:5;34823:10;:19;;34822:28;34821:41;;34803:141;;;;-1:-1:-1;;;34803:141:0;;46599:2:1;34803:141:0;;;46581:21:1;46638:2;46618:18;;;46611:30;46677:27;46657:18;;;46650:55;46722:18;;34803:141:0;46397:349:1;34647:382:0;34969:35;;-1:-1:-1;;;34969:35:0;;46953:2:1;34969:35:0;;;46935:21:1;46992:2;46972:18;;;46965:30;47031:27;47011:18;;;47004:55;47076:18;;34969:35:0;46751:349:1;34647:382:0;35037:19;;34066:996;;;;;;;:::o;10347:405::-;10408:4;10665:21;;10702:15;;;;;:43;;-1:-1:-1;10004:66:0;10721:24;;;10702:43;10694:52;10347:405;-1:-1:-1;;;10347:405:0:o;32904:378::-;33025:11;33043:13;33113:18;33127:3;33113:13;:18::i;:::-;-1:-1:-1;;;;;33209:18:0;;:8;:18;;;;;;;;;;;:23;;;;;;;;;33098:33;;-1:-1:-1;33098:33:0;-1:-1:-1;33189:87:0;;22084:1;33098:33;33256:7;33265:10;33189:19;:87::i;:::-;-1:-1:-1;;;;;33163:18:0;;;:8;:18;;;;;;;;;;;:23;;;;;;;;;;:113;;;;-1:-1:-1;;;;32904:378:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;365:173:1;433:20;;-1:-1:-1;;;;;482:31:1;;472:42;;462:70;;528:1;525;518:12;462:70;365:173;;;:::o;543:254::-;611:6;619;672:2;660:9;651:7;647:23;643:32;640:52;;;688:1;685;678:12;640:52;711:29;730:9;711:29;:::i;:::-;701:39;787:2;772:18;;;;759:32;;-1:-1:-1;;;543:254:1:o;984:131::-;-1:-1:-1;;;;;;1058:32:1;;1048:43;;1038:71;;1105:1;1102;1095:12;1038:71;984:131;:::o;1120:245::-;1178:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1286:9;1273:23;1305:30;1329:5;1305:30;:::i;1658:258::-;1730:1;1740:113;1754:6;1751:1;1748:13;1740:113;;;1830:11;;;1824:18;1811:11;;;1804:39;1776:2;1769:10;1740:113;;;1871:6;1868:1;1865:13;1862:48;;;-1:-1:-1;;1906:1:1;1888:16;;1881:27;1658:258::o;1921:269::-;1974:3;2012:5;2006:12;2039:6;2034:3;2027:19;2055:63;2111:6;2104:4;2099:3;2095:14;2088:4;2081:5;2077:16;2055:63;:::i;:::-;2172:2;2151:15;-1:-1:-1;;2147:29:1;2138:39;;;;2179:4;2134:50;;1921:269;-1:-1:-1;;1921:269:1:o;2195:231::-;2344:2;2333:9;2326:21;2307:4;2364:56;2416:2;2405:9;2401:18;2393:6;2364:56;:::i;2431:186::-;2490:6;2543:2;2531:9;2522:7;2518:23;2514:32;2511:52;;;2559:1;2556;2549:12;2511:52;2582:29;2601:9;2582:29;:::i;2622:180::-;2681:6;2734:2;2722:9;2713:7;2709:23;2705:32;2702:52;;;2750:1;2747;2740:12;2702:52;-1:-1:-1;2773:23:1;;2622:180;-1:-1:-1;2622:180:1:o;3081:528::-;3179:4;3171:5;3165:12;3161:23;3156:3;3149:36;3246:4;3238;3231:5;3227:16;3221:23;3217:34;3210:4;3205:3;3201:14;3194:58;3313:6;3305:4;3298:5;3294:16;3288:23;3284:36;3277:4;3272:3;3268:14;3261:60;3367:4;3360:5;3356:16;3350:23;3392:10;3452:2;3438:12;3434:21;3427:4;3422:3;3418:14;3411:45;3517:2;3509:4;3502:5;3498:16;3492:23;3488:32;3481:4;3476:3;3472:14;3465:56;;;3599:1;3595;3590:3;3586:11;3582:19;3574:4;3567:5;3563:16;3557:23;3553:49;3546:4;3541:3;3537:14;3530:73;3081:528;;:::o;3614:266::-;3810:3;3795:19;;3823:51;3799:9;3856:6;3823:51;:::i;3885:367::-;3948:8;3958:6;4012:3;4005:4;3997:6;3993:17;3989:27;3979:55;;4030:1;4027;4020:12;3979:55;-1:-1:-1;4053:20:1;;-1:-1:-1;;;;;4085:30:1;;4082:50;;;4128:1;4125;4118:12;4082:50;4165:4;4157:6;4153:17;4141:29;;4225:3;4218:4;4208:6;4205:1;4201:14;4193:6;4189:27;4185:38;4182:47;4179:67;;;4242:1;4239;4232:12;4179:67;3885:367;;;;;:::o;4257:437::-;4343:6;4351;4404:2;4392:9;4383:7;4379:23;4375:32;4372:52;;;4420:1;4417;4410:12;4372:52;4460:9;4447:23;-1:-1:-1;;;;;4485:6:1;4482:30;4479:50;;;4525:1;4522;4515:12;4479:50;4564:70;4626:7;4617:6;4606:9;4602:22;4564:70;:::i;:::-;4653:8;;4538:96;;-1:-1:-1;4257:437:1;-1:-1:-1;;;;4257:437:1:o;4699:2085::-;4782:12;;1440:13;1433:21;1421:34;;4846:4;4839:5;4835:16;4829:23;4861:46;4901:4;4896:3;4892:14;4878:12;2874:4;2863:16;2851:29;;2807:75;4861:46;;4955:4;4948:5;4944:16;4938:23;4970:48;5012:4;5007:3;5003:14;4987;2874:4;2863:16;2851:29;;2807:75;4970:48;;5066:4;5059:5;5055:16;5049:23;5081:48;5123:4;5118:3;5114:14;5098;2874:4;2863:16;2851:29;;2807:75;5081:48;;5177:4;5170:5;5166:16;5160:23;5192:48;5234:4;5229:3;5225:14;5209;2874:4;2863:16;2851:29;;2807:75;5192:48;;5288:4;5281:5;5277:16;5271:23;5303:48;5345:4;5340:3;5336:14;5320;2874:4;2863:16;2851:29;;2807:75;5303:48;;5399:4;5392:5;5388:16;5382:23;5414:48;5456:4;5451:3;5447:14;5431;2874:4;2863:16;2851:29;;2807:75;5414:48;;5510:4;5503:5;5499:16;5493:23;5525:48;5567:4;5562:3;5558:14;5542;2874:4;2863:16;2851:29;;2807:75;5525:48;-1:-1:-1;5592:6:1;5635:14;;;5629:21;2874:4;2863:16;;;5692:12;;;2851:29;;;;5724:6;5767:14;;;5761:21;2863:16;;5824:12;;;2851:29;5856:6;5899:14;;;5893:21;2863:16;;5956:12;;;2851:29;5988:6;6032:14;;;6026:21;2863:16;;;6090:12;;;2851:29;6122:6;6166:14;;;6160:21;2963:6;2952:18;;;6225:12;;;2940:31;;;;6257:6;6301:14;;;6295:21;2952:18;;;6360:12;;;2940:31;6392:6;6436:14;;;6430:21;3058:10;3047:22;;;6495:12;;;3035:35;;;;6527:6;6571:14;;;6565:21;3047:22;;6630:12;;;3035:35;6662:6;6706:14;;;6700:21;3047:22;;;6765:12;;;3035:35;6662:6;6730:48;2982:94;6789:721;7020:2;7072:21;;;7142:13;;7045:18;;;7164:22;;;6991:4;;7020:2;7243:15;;;;7217:2;7202:18;;;6991:4;7286:198;7300:6;7297:1;7294:13;7286:198;;;7349:51;7396:3;7387:6;7381:13;7349:51;:::i;:::-;7459:15;;;;7429:6;7420:16;;;;;7322:1;7315:9;7286:198;;;-1:-1:-1;7501:3:1;;6789:721;-1:-1:-1;;;;;;6789:721:1:o;7515:127::-;7576:10;7571:3;7567:20;7564:1;7557:31;7607:4;7604:1;7597:15;7631:4;7628:1;7621:15;7647:255;7719:2;7713:9;7761:6;7749:19;;-1:-1:-1;;;;;7783:34:1;;7819:22;;;7780:62;7777:88;;;7845:18;;:::i;:::-;7881:2;7874:22;7647:255;:::o;7907:275::-;7978:2;7972:9;8043:2;8024:13;;-1:-1:-1;;8020:27:1;8008:40;;-1:-1:-1;;;;;8063:34:1;;8099:22;;;8060:62;8057:88;;;8125:18;;:::i;:::-;8161:2;8154:22;7907:275;;-1:-1:-1;7907:275:1:o;8187:530::-;8229:5;8282:3;8275:4;8267:6;8263:17;8259:27;8249:55;;8300:1;8297;8290:12;8249:55;8336:6;8323:20;-1:-1:-1;;;;;8358:2:1;8355:26;8352:52;;;8384:18;;:::i;:::-;8428:55;8471:2;8452:13;;-1:-1:-1;;8448:27:1;8477:4;8444:38;8428:55;:::i;:::-;8508:2;8499:7;8492:19;8554:3;8547:4;8542:2;8534:6;8530:15;8526:26;8523:35;8520:55;;;8571:1;8568;8561:12;8520:55;8636:2;8629:4;8621:6;8617:17;8610:4;8601:7;8597:18;8584:55;8684:1;8659:16;;;8677:4;8655:27;8648:38;;;;8663:7;8187:530;-1:-1:-1;;;8187:530:1:o;8722:1121::-;8880:6;8888;8896;8904;8912;8920;8928;8981:3;8969:9;8960:7;8956:23;8952:33;8949:53;;;8998:1;8995;8988:12;8949:53;9021:29;9040:9;9021:29;:::i;:::-;9011:39;;9069:38;9103:2;9092:9;9088:18;9069:38;:::i;:::-;9059:48;;9158:2;9147:9;9143:18;9130:32;-1:-1:-1;;;;;9222:2:1;9214:6;9211:14;9208:34;;;9238:1;9235;9228:12;9208:34;9277:70;9339:7;9330:6;9319:9;9315:22;9277:70;:::i;:::-;9366:8;;-1:-1:-1;9251:96:1;-1:-1:-1;9454:2:1;9439:18;;9426:32;;-1:-1:-1;9470:16:1;;;9467:36;;;9499:1;9496;9489:12;9467:36;9538:72;9602:7;9591:8;9580:9;9576:24;9538:72;:::i;:::-;9629:8;;-1:-1:-1;9512:98:1;-1:-1:-1;9717:3:1;9702:19;;9689:33;;-1:-1:-1;9734:16:1;;;9731:36;;;9763:1;9760;9753:12;9731:36;;9786:51;9829:7;9818:8;9807:9;9803:24;9786:51;:::i;:::-;9776:61;;;8722:1121;;;;;;;;;;:::o;9848:160::-;9913:20;;9969:13;;9962:21;9952:32;;9942:60;;9998:1;9995;9988:12;10013:156;10079:20;;10139:4;10128:16;;10118:27;;10108:55;;10159:1;10156;10149:12;10174:159;10241:20;;10301:6;10290:18;;10280:29;;10270:57;;10323:1;10320;10313:12;10338:163;10405:20;;10465:10;10454:22;;10444:33;;10434:61;;10491:1;10488;10481:12;10506:1776;10604:6;10612;10656:9;10647:7;10643:23;10686:3;10682:2;10678:12;10675:32;;;10703:1;10700;10693:12;10675:32;10739:9;10726:23;10716:33;;10768:6;10808:2;10802;10798:7;10794:2;10790:16;10786:25;10783:45;;;10824:1;10821;10814:12;10783:45;10850:22;;:::i;:::-;10837:35;;10895;10926:2;10915:9;10911:18;10895:35;:::i;:::-;10888:5;10881:50;10963:36;10995:2;10984:9;10980:18;10963:36;:::i;:::-;10958:2;10951:5;10947:14;10940:60;11032:36;11064:2;11053:9;11049:18;11032:36;:::i;:::-;11027:2;11020:5;11016:14;11009:60;11101:37;11133:3;11122:9;11118:19;11101:37;:::i;:::-;11096:2;11089:5;11085:14;11078:61;11172:37;11204:3;11193:9;11189:19;11172:37;:::i;:::-;11166:3;11159:5;11155:15;11148:62;11243:37;11275:3;11264:9;11260:19;11243:37;:::i;:::-;11237:3;11230:5;11226:15;11219:62;11314:37;11346:3;11335:9;11331:19;11314:37;:::i;:::-;11308:3;11301:5;11297:15;11290:62;11371:3;11407:36;11439:2;11428:9;11424:18;11407:36;:::i;:::-;11401:3;11394:5;11390:15;11383:61;11463:3;11498:36;11530:2;11519:9;11515:18;11498:36;:::i;:::-;11493:2;11486:5;11482:14;11475:60;11554:3;11544:13;;11589:36;11621:2;11610:9;11606:18;11589:36;:::i;:::-;11573:14;;;11566:60;11645:3;11680:36;11697:18;;;11680:36;:::i;:::-;11675:2;11668:5;11664:14;11657:60;11736:3;11726:13;;11771:36;11803:2;11792:9;11788:18;11771:36;:::i;:::-;11755:14;;;11748:60;11827:3;11862:37;11880:18;;;11862:37;:::i;:::-;11857:2;11850:5;11846:14;11839:61;11919:3;11909:13;;11954:37;11987:2;11976:9;11972:18;11954:37;:::i;:::-;11938:14;;;11931:61;12012:3;12047:38;12065:19;;;12047:38;:::i;:::-;12042:2;12035:5;12031:14;12024:62;12106:3;12095:14;;12142:38;12175:3;12164:9;12160:19;12142:38;:::i;:::-;12125:15;;;12118:63;12214:37;12232:18;;;12214:37;:::i;:::-;12197:15;;;12190:62;-1:-1:-1;10506:1776:1;;12201:5;;-1:-1:-1;10506:1776:1;;-1:-1:-1;;10506:1776:1:o;12287:435::-;12340:3;12378:5;12372:12;12405:6;12400:3;12393:19;12431:4;12460:2;12455:3;12451:12;12444:19;;12497:2;12490:5;12486:14;12518:1;12528:169;12542:6;12539:1;12536:13;12528:169;;;12603:13;;12591:26;;12637:12;;;;12672:15;;;;12564:1;12557:9;12528:169;;;-1:-1:-1;12713:3:1;;12287:435;-1:-1:-1;;;;;12287:435:1:o;12727:261::-;12906:2;12895:9;12888:21;12869:4;12926:56;12978:2;12967:9;12963:18;12955:6;12926:56;:::i;12993:183::-;13053:4;-1:-1:-1;;;;;13078:6:1;13075:30;13072:56;;;13108:18;;:::i;:::-;-1:-1:-1;13153:1:1;13149:14;13165:4;13145:25;;12993:183::o;13181:662::-;13235:5;13288:3;13281:4;13273:6;13269:17;13265:27;13255:55;;13306:1;13303;13296:12;13255:55;13342:6;13329:20;13368:4;13392:60;13408:43;13448:2;13408:43;:::i;:::-;13392:60;:::i;:::-;13486:15;;;13572:1;13568:10;;;;13556:23;;13552:32;;;13517:12;;;;13596:15;;;13593:35;;;13624:1;13621;13614:12;13593:35;13660:2;13652:6;13648:15;13672:142;13688:6;13683:3;13680:15;13672:142;;;13754:17;;13742:30;;13792:12;;;;13705;;13672:142;;13848:1146;13966:6;13974;14027:2;14015:9;14006:7;14002:23;13998:32;13995:52;;;14043:1;14040;14033:12;13995:52;14083:9;14070:23;-1:-1:-1;;;;;14153:2:1;14145:6;14142:14;14139:34;;;14169:1;14166;14159:12;14139:34;14207:6;14196:9;14192:22;14182:32;;14252:7;14245:4;14241:2;14237:13;14233:27;14223:55;;14274:1;14271;14264:12;14223:55;14310:2;14297:16;14332:4;14356:60;14372:43;14412:2;14372:43;:::i;14356:60::-;14450:15;;;14532:1;14528:10;;;;14520:19;;14516:28;;;14481:12;;;;14556:19;;;14553:39;;;14588:1;14585;14578:12;14553:39;14612:11;;;;14632:148;14648:6;14643:3;14640:15;14632:148;;;14714:23;14733:3;14714:23;:::i;:::-;14702:36;;14665:12;;;;14758;;;;14632:148;;;14799:5;-1:-1:-1;;14842:18:1;;14829:32;;-1:-1:-1;;14873:16:1;;;14870:36;;;14902:1;14899;14892:12;14870:36;;14925:63;14980:7;14969:8;14958:9;14954:24;14925:63;:::i;:::-;14915:73;;;13848:1146;;;;;:::o;14999:592::-;15070:6;15078;15131:2;15119:9;15110:7;15106:23;15102:32;15099:52;;;15147:1;15144;15137:12;15099:52;15187:9;15174:23;-1:-1:-1;;;;;15257:2:1;15249:6;15246:14;15243:34;;;15273:1;15270;15263:12;15243:34;15311:6;15300:9;15296:22;15286:32;;15356:7;15349:4;15345:2;15341:13;15337:27;15327:55;;15378:1;15375;15368:12;15327:55;15418:2;15405:16;15444:2;15436:6;15433:14;15430:34;;;15460:1;15457;15450:12;15430:34;15505:7;15500:2;15491:6;15487:2;15483:15;15479:24;15476:37;15473:57;;;15526:1;15523;15516:12;15473:57;15557:2;15549:11;;;;;15579:6;;-1:-1:-1;14999:592:1;;-1:-1:-1;;;;14999:592:1:o;15596:348::-;15680:6;15733:2;15721:9;15712:7;15708:23;15704:32;15701:52;;;15749:1;15746;15739:12;15701:52;15789:9;15776:23;-1:-1:-1;;;;;15814:6:1;15811:30;15808:50;;;15854:1;15851;15844:12;15808:50;15877:61;15930:7;15921:6;15910:9;15906:22;15877:61;:::i;15949:814::-;16111:4;16140:2;16180;16169:9;16165:18;16210:2;16199:9;16192:21;16233:6;16268;16262:13;16299:6;16291;16284:22;16337:2;16326:9;16322:18;16315:25;;16399:2;16389:6;16386:1;16382:14;16371:9;16367:30;16363:39;16349:53;;16437:2;16429:6;16425:15;16458:1;16468:266;16482:6;16479:1;16476:13;16468:266;;;16575:2;16571:7;16559:9;16551:6;16547:22;16543:36;16538:3;16531:49;16603:51;16647:6;16638;16632:13;16603:51;:::i;:::-;16593:61;-1:-1:-1;16712:12:1;;;;16677:15;;;;16504:1;16497:9;16468:266;;;-1:-1:-1;16751:6:1;;15949:814;-1:-1:-1;;;;;;;15949:814:1:o;16768:600::-;16869:6;16877;16885;16893;16901;16954:3;16942:9;16933:7;16929:23;16925:33;16922:53;;;16971:1;16968;16961:12;16922:53;16994:29;17013:9;16994:29;:::i;:::-;16984:39;;17074:2;17063:9;17059:18;17046:32;-1:-1:-1;;;;;17093:6:1;17090:30;17087:50;;;17133:1;17130;17123:12;17087:50;17156:49;17197:7;17188:6;17177:9;17173:22;17156:49;:::i;:::-;17146:59;;;17252:2;17241:9;17237:18;17224:32;17214:42;;17303:2;17292:9;17288:18;17275:32;17265:42;;17326:36;17357:3;17346:9;17342:19;17326:36;:::i;:::-;17316:46;;16768:600;;;;;;;;:::o;17707:263::-;17901:3;17886:19;;17914:50;17890:9;17946:6;17914:50;:::i;18183:722::-;18416:2;18468:21;;;18538:13;;18441:18;;;18560:22;;;18387:4;;18416:2;18639:15;;;;18613:2;18598:18;;;18387:4;18682:197;18696:6;18693:1;18690:13;18682:197;;;18745:52;18793:3;18784:6;18778:13;18745:52;:::i;:::-;18854:15;;;;18826:4;18817:14;;;;;18718:1;18711:9;18682:197;;18910:322;18984:6;18992;19000;19053:2;19041:9;19032:7;19028:23;19024:32;19021:52;;;19069:1;19066;19059:12;19021:52;19092:29;19111:9;19092:29;:::i;:::-;19082:39;;19168:2;19157:9;19153:18;19140:32;19130:42;;19191:35;19222:2;19211:9;19207:18;19191:35;:::i;:::-;19181:45;;18910:322;;;;;:::o;19237:254::-;19302:6;19310;19363:2;19351:9;19342:7;19338:23;19334:32;19331:52;;;19379:1;19376;19369:12;19331:52;19402:29;19421:9;19402:29;:::i;:::-;19392:39;;19450:35;19481:2;19470:9;19466:18;19450:35;:::i;:::-;19440:45;;19237:254;;;;;:::o;20130:511::-;20225:6;20233;20241;20294:2;20282:9;20273:7;20269:23;20265:32;20262:52;;;20310:1;20307;20300:12;20262:52;20333:29;20352:9;20333:29;:::i;:::-;20323:39;;20413:2;20402:9;20398:18;20385:32;-1:-1:-1;;;;;20432:6:1;20429:30;20426:50;;;20472:1;20469;20462:12;20426:50;20511:70;20573:7;20564:6;20553:9;20549:22;20511:70;:::i;:::-;20130:511;;20600:8;;-1:-1:-1;20485:96:1;;-1:-1:-1;;;;20130:511:1:o;20646:773::-;20768:6;20776;20784;20792;20845:2;20833:9;20824:7;20820:23;20816:32;20813:52;;;20861:1;20858;20851:12;20813:52;20901:9;20888:23;-1:-1:-1;;;;;20971:2:1;20963:6;20960:14;20957:34;;;20987:1;20984;20977:12;20957:34;21026:70;21088:7;21079:6;21068:9;21064:22;21026:70;:::i;:::-;21115:8;;-1:-1:-1;21000:96:1;-1:-1:-1;21203:2:1;21188:18;;21175:32;;-1:-1:-1;21219:16:1;;;21216:36;;;21248:1;21245;21238:12;21216:36;;21287:72;21351:7;21340:8;21329:9;21325:24;21287:72;:::i;:::-;20646:773;;;;-1:-1:-1;21378:8:1;-1:-1:-1;;;;20646:773:1:o;21699:248::-;21767:6;21775;21828:2;21816:9;21807:7;21803:23;21799:32;21796:52;;;21844:1;21841;21834:12;21796:52;-1:-1:-1;;21867:23:1;;;21937:2;21922:18;;;21909:32;;-1:-1:-1;21699:248:1:o;21952:1041::-;22115:6;22123;22131;22139;22147;22200:2;22188:9;22179:7;22175:23;22171:32;22168:52;;;22216:1;22213;22206:12;22168:52;22239:29;22258:9;22239:29;:::i;:::-;22229:39;;22319:2;22308:9;22304:18;22291:32;-1:-1:-1;;;;;22383:2:1;22375:6;22372:14;22369:34;;;22399:1;22396;22389:12;22369:34;22438:70;22500:7;22491:6;22480:9;22476:22;22438:70;:::i;:::-;22527:8;;-1:-1:-1;22412:96:1;-1:-1:-1;22615:2:1;22600:18;;22587:32;;-1:-1:-1;22631:16:1;;;22628:36;;;22660:1;22657;22650:12;22628:36;22698:8;22687:9;22683:24;22673:34;;22745:7;22738:4;22734:2;22730:13;22726:27;22716:55;;22767:1;22764;22757:12;22716:55;22807:2;22794:16;22833:2;22825:6;22822:14;22819:34;;;22849:1;22846;22839:12;22819:34;22907:7;22902:2;22892:6;22884;22880:19;22876:2;22872:28;22868:37;22865:50;22862:70;;;22928:1;22925;22918:12;22862:70;21952:1041;;;;-1:-1:-1;21952:1041:1;;-1:-1:-1;22959:2:1;22951:11;;22981:6;21952:1041;-1:-1:-1;;;21952:1041:1:o;23251:316::-;23328:6;23336;23344;23397:2;23385:9;23376:7;23372:23;23368:32;23365:52;;;23413:1;23410;23403:12;23365:52;-1:-1:-1;;23436:23:1;;;23506:2;23491:18;;23478:32;;-1:-1:-1;23557:2:1;23542:18;;;23529:32;;23251:316;-1:-1:-1;23251:316:1:o;23572:248::-;23637:6;23645;23698:2;23686:9;23677:7;23673:23;23669:32;23666:52;;;23714:1;23711;23704:12;23666:52;23750:9;23737:23;23727:33;;23779:35;23810:2;23799:9;23795:18;23779:35;:::i;23825:260::-;23893:6;23901;23954:2;23942:9;23933:7;23929:23;23925:32;23922:52;;;23970:1;23967;23960:12;23922:52;23993:29;24012:9;23993:29;:::i;:::-;23983:39;;24041:38;24075:2;24064:9;24060:18;24041:38;:::i;24090:606::-;24194:6;24202;24210;24218;24226;24279:3;24267:9;24258:7;24254:23;24250:33;24247:53;;;24296:1;24293;24286:12;24247:53;24319:29;24338:9;24319:29;:::i;:::-;24309:39;;24367:38;24401:2;24390:9;24386:18;24367:38;:::i;:::-;24357:48;;24452:2;24441:9;24437:18;24424:32;24414:42;;24503:2;24492:9;24488:18;24475:32;24465:42;;24558:3;24547:9;24543:19;24530:33;-1:-1:-1;;;;;24578:6:1;24575:30;24572:50;;;24618:1;24615;24608:12;24572:50;24641:49;24682:7;24673:6;24662:9;24658:22;24641:49;:::i;:::-;24631:59;;;24090:606;;;;;;;;:::o;24701:1088::-;24859:6;24867;24875;24883;24891;24899;24952:2;24940:9;24931:7;24927:23;24923:32;24920:52;;;24968:1;24965;24958:12;24920:52;25008:9;24995:23;-1:-1:-1;;;;;25078:2:1;25070:6;25067:14;25064:34;;;25094:1;25091;25084:12;25064:34;25133:70;25195:7;25186:6;25175:9;25171:22;25133:70;:::i;:::-;25222:8;;-1:-1:-1;25107:96:1;-1:-1:-1;25310:2:1;25295:18;;25282:32;;-1:-1:-1;25326:16:1;;;25323:36;;;25355:1;25352;25345:12;25323:36;25394:72;25458:7;25447:8;25436:9;25432:24;25394:72;:::i;:::-;25485:8;;-1:-1:-1;25368:98:1;-1:-1:-1;25573:2:1;25558:18;;25545:32;;-1:-1:-1;25589:16:1;;;25586:36;;;25618:1;25615;25608:12;25586:36;;25657:72;25721:7;25710:8;25699:9;25695:24;25657:72;:::i;:::-;24701:1088;;;;-1:-1:-1;24701:1088:1;;-1:-1:-1;24701:1088:1;;25748:8;;24701:1088;-1:-1:-1;;;24701:1088:1:o;25794:380::-;25873:1;25869:12;;;;25916;;;25937:61;;25991:4;25983:6;25979:17;25969:27;;25937:61;26044:2;26036:6;26033:14;26013:18;26010:38;26007:161;;26090:10;26085:3;26081:20;26078:1;26071:31;26125:4;26122:1;26115:15;26153:4;26150:1;26143:15;26007:161;;25794:380;;;:::o;26179:402::-;26381:2;26363:21;;;26420:2;26400:18;;;26393:30;26459:34;26454:2;26439:18;;26432:62;-1:-1:-1;;;26525:2:1;26510:18;;26503:36;26571:3;26556:19;;26179:402::o;26586:127::-;26647:10;26642:3;26638:20;26635:1;26628:31;26678:4;26675:1;26668:15;26702:4;26699:1;26692:15;26718:127;26779:10;26774:3;26770:20;26767:1;26760:31;26810:4;26807:1;26800:15;26834:4;26831:1;26824:15;26850:135;26889:3;26910:17;;;26907:43;;26930:18;;:::i;:::-;-1:-1:-1;26977:1:1;26966:13;;26850:135::o;27683:128::-;27723:3;27754:1;27750:6;27747:1;27744:13;27741:39;;;27760:18;;:::i;:::-;-1:-1:-1;27796:9:1;;27683:128::o;27816:125::-;27856:4;27884:1;27881;27878:8;27875:34;;;27889:18;;:::i;:::-;-1:-1:-1;27926:9:1;;27816:125::o;28144:185::-;28186:3;28224:5;28218:12;28239:52;28284:6;28279:3;28272:4;28265:5;28261:16;28239:52;:::i;:::-;28307:16;;;;;28144:185;-1:-1:-1;;28144:185:1:o;28334:1968::-;29210:3;29248:6;29242:13;29274:4;29287:51;29331:6;29326:3;29321:2;29313:6;29309:15;29287:51;:::i;:::-;29401:13;;29360:16;;;;29423:55;29401:13;29360:16;29445:15;;;29423:55;:::i;:::-;-1:-1:-1;;;29500:20:1;;29551:17;;;29593:13;;29500:20;;29539:3;29615:63;29593:13;29665:1;29654:13;;29637:15;;;29615:63;:::i;:::-;29741:1;29697:20;;29733:10;;;29726:22;;;29773:13;;29795:60;29773:13;29842:1;29834:10;;29817:15;;;29795:60;:::i;:::-;29915:1;29874:17;;29907:10;;;29900:22;;;29947:13;;29969:60;29947:13;30016:1;30008:10;;29991:15;;;29969:60;:::i;:::-;30089:1;30048:17;;30081:10;;;30074:22;;;30121:13;;30143:60;30121:13;30190:1;30182:10;;30165:15;;;30143:60;:::i;:::-;30263:1;30222:17;;30255:10;;;30248:22;-1:-1:-1;30294:1:1;30286:10;;28334:1968;-1:-1:-1;;;;;;;;28334:1968:1:o;30307:2043::-;31231:3;31269:6;31263:13;31295:4;31308:51;31352:6;31347:3;31342:2;31334:6;31330:15;31308:51;:::i;:::-;31422:13;;31381:16;;;;31444:55;31422:13;31381:16;31466:15;;;31444:55;:::i;:::-;-1:-1:-1;;;31521:20:1;;31572:17;;;31614:13;;31521:20;;31560:3;31636:63;31614:13;31686:1;31675:13;;31658:15;;;31636:63;:::i;:::-;31762:1;31718:20;;31754:10;;;31747:22;;;31794:13;;31816:60;31794:13;31863:1;31855:10;;31838:15;;;31816:60;:::i;:::-;31936:1;31895:17;;31928:10;;;31921:22;;;31968:13;;31990:60;31968:13;32037:1;32029:10;;32012:15;;;31990:60;:::i;:::-;32110:1;32069:17;;32102:10;;;32095:22;;;32142:13;;32164:60;32142:13;32211:1;32203:10;;32186:15;;;32164:60;:::i;:::-;32284:1;32243:17;;32276:10;;;32269:22;-1:-1:-1;32307:37:1;32341:1;32333:10;;32325:6;32307:37;:::i;:::-;32300:44;30307:2043;-1:-1:-1;;;;;;;;;;30307:2043:1:o;32481:973::-;32566:12;;32531:3;;32621:1;32641:18;;;;32694;;;;32721:61;;32775:4;32767:6;32763:17;32753:27;;32721:61;32801:2;32849;32841:6;32838:14;32818:18;32815:38;32812:161;;32895:10;32890:3;32886:20;32883:1;32876:31;32930:4;32927:1;32920:15;32958:4;32955:1;32948:15;32812:161;32989:18;33016:104;;;;33134:1;33129:319;;;;32982:466;;33016:104;-1:-1:-1;;33049:24:1;;33037:37;;33094:16;;;;-1:-1:-1;33016:104:1;;33129:319;32428:1;32421:14;;;32465:4;32452:18;;33223:1;33237:165;33251:6;33248:1;33245:13;33237:165;;;33329:14;;33316:11;;;33309:35;33372:16;;;;33266:10;;33237:165;;;33241:3;;33431:6;33426:3;33422:16;33415:23;;32982:466;;;;;;;32481:973;;;;:::o;33459:1056::-;33933:3;33961:38;33995:3;33987:6;33961:38;:::i;:::-;34028:6;34022:13;34044:52;34089:6;34085:2;34078:4;34070:6;34066:17;34044:52;:::i;:::-;34158:13;;34118:15;;;34180:57;34158:13;34118:15;34214:4;34202:17;;34180:57;:::i;:::-;-1:-1:-1;;;34259:20:1;;34288:21;;;-1:-1:-1;;;34336:1:1;34325:13;;34318:33;34376:13;;34398:66;34376:13;34450:2;34439:14;;34432:4;34420:17;;34398:66;:::i;:::-;34484:20;34506:2;34480:29;;33459:1056;-1:-1:-1;;;;;;33459:1056:1:o;34520:808::-;34848:3;34886:6;34880:13;34902:53;34948:6;34943:3;34936:4;34928:6;34924:17;34902:53;:::i;:::-;35018:13;;34977:16;;;;35040:57;35018:13;34977:16;35074:4;35062:17;;35040:57;:::i;:::-;-1:-1:-1;;;35119:20:1;;35148:18;;;35191:13;;35213:65;35191:13;35265:1;35254:13;;35247:4;35235:17;;35213:65;:::i;:::-;35298:20;35320:1;35294:28;;34520:808;-1:-1:-1;;;;;34520:808:1:o;35333:672::-;35711:3;35739:38;35773:3;35765:6;35739:38;:::i;:::-;-1:-1:-1;;;35793:2:1;35786:27;-1:-1:-1;;;35837:2:1;35833;35829:11;35822:31;35882:6;35876:13;35898:61;35952:6;35947:2;35943;35939:11;35932:4;35924:6;35920:17;35898:61;:::i;:::-;35979:15;35996:2;35975:24;;35333:672;-1:-1:-1;;;;35333:672:1:o;36010:676::-;36388:3;36416:38;36450:3;36442:6;36416:38;:::i;:::-;-1:-1:-1;;;36470:2:1;36463:31;-1:-1:-1;;;36518:2:1;36514;36510:11;36503:31;36563:6;36557:13;36579:61;36633:6;36628:2;36624;36620:11;36613:4;36605:6;36601:17;36579:61;:::i;:::-;36660:15;36677:2;36656:24;;36010:676;-1:-1:-1;;;;36010:676:1:o;36691:429::-;-1:-1:-1;;;36948:3:1;36941:25;36923:3;36995:6;36989:13;37011:62;37066:6;37061:2;37056:3;37052:12;37045:4;37037:6;37033:17;37011:62;:::i;:::-;37093:16;;;;37111:2;37089:25;;36691:429;-1:-1:-1;;36691:429:1:o;37125:423::-;-1:-1:-1;;;37382:3:1;37375:21;37357:3;37425:6;37419:13;37441:61;37495:6;37491:1;37486:3;37482:11;37475:4;37467:6;37463:17;37441:61;:::i;:::-;37522:16;;;;37540:1;37518:24;;37125:423;-1:-1:-1;;37125:423:1:o;37553:1815::-;38328:3;38366:6;38360:13;38392:4;38405:51;38449:6;38444:3;38439:2;38431:6;38427:15;38405:51;:::i;:::-;38519:13;;38478:16;;;;38541:55;38519:13;38478:16;38563:15;;;38541:55;:::i;:::-;-1:-1:-1;;;38618:20:1;;38669:17;;;38711:13;;38618:20;;38657:3;38733:63;38711:13;38783:1;38772:13;;38755:15;;;38733:63;:::i;:::-;38859:1;38815:20;;38851:10;;;38844:22;;;38891:13;;38913:60;38891:13;38960:1;38952:10;;38935:15;;;38913:60;:::i;:::-;39033:1;38992:17;;39025:10;;;39018:22;;;39065:13;;39087:60;39065:13;39134:1;39126:10;;39109:15;;;39087:60;:::i;:::-;39207:1;39166:17;;39199:10;;;39192:22;39239:13;;39261:60;39239:13;39308:1;39300:10;;39283:15;;;39261:60;:::i;:::-;39341:17;;;;39360:1;39337:25;;37553:1815;-1:-1:-1;;;;;;;;;37553:1815:1:o;39373:862::-;39799:3;39827:38;39861:3;39853:6;39827:38;:::i;:::-;39894:6;39888:13;39910:52;39955:6;39951:2;39944:4;39936:6;39932:17;39910:52;:::i;:::-;-1:-1:-1;;;39984:15:1;;40008:21;;;-1:-1:-1;;;40056:1:1;40045:13;;40038:33;40096:13;;40118:66;40096:13;40170:2;40159:14;;40152:4;40140:17;;40118:66;:::i;:::-;40204:20;40226:2;40200:29;;39373:862;-1:-1:-1;;;;;39373:862:1:o;40240:180::-;40296:6;40349:2;40337:9;40328:7;40324:23;40320:32;40317:52;;;40365:1;40362;40355:12;40317:52;40388:26;40404:9;40388:26;:::i;40425:182::-;40482:6;40535:2;40523:9;40514:7;40510:23;40506:32;40503:52;;;40551:1;40548;40541:12;40503:52;40574:27;40591:9;40574:27;:::i;40612:127::-;40673:10;40668:3;40664:20;40661:1;40654:31;40704:4;40701:1;40694:15;40728:4;40725:1;40718:15;40744:120;40784:1;40810;40800:35;;40815:18;;:::i;:::-;-1:-1:-1;40849:9:1;;40744:120::o;40869:112::-;40901:1;40927;40917:35;;40932:18;;:::i;:::-;-1:-1:-1;40966:9:1;;40869:112::o;40986:168::-;41026:7;41092:1;41088;41084:6;41080:14;41077:1;41074:21;41069:1;41062:9;41055:17;41051:45;41048:71;;;41099:18;;:::i;:::-;-1:-1:-1;41139:9:1;;40986:168::o;41570:157::-;41600:1;41634:4;41631:1;41627:12;41658:3;41648:37;;41665:18;;:::i;:::-;41717:3;41710:4;41707:1;41703:12;41699:22;41694:27;;;41570:157;;;;:::o;42071:465::-;42328:2;42317:9;42310:21;42291:4;42354:56;42406:2;42395:9;42391:18;42383:6;42354:56;:::i;:::-;42458:9;42450:6;42446:22;42441:2;42430:9;42426:18;42419:50;42486:44;42523:6;42515;42486:44;:::i;:::-;42478:52;42071:465;-1:-1:-1;;;;;42071:465:1:o;42541:838::-;-1:-1:-1;;;;;42938:15:1;;;42920:34;;42990:15;;42985:2;42970:18;;42963:43;42900:3;43037:2;43022:18;;43015:31;;;42863:4;;43069:57;;43106:19;;43098:6;43069:57;:::i;:::-;43174:9;43166:6;43162:22;43157:2;43146:9;43142:18;43135:50;43208:44;43245:6;43237;43208:44;:::i;:::-;43194:58;;43301:9;43293:6;43289:22;43283:3;43272:9;43268:19;43261:51;43329:44;43366:6;43358;43329:44;:::i;:::-;43321:52;42541:838;-1:-1:-1;;;;;;;;42541:838:1:o;43384:249::-;43453:6;43506:2;43494:9;43485:7;43481:23;43477:32;43474:52;;;43522:1;43519;43512:12;43474:52;43554:9;43548:16;43573:30;43597:5;43573:30;:::i;43638:572::-;-1:-1:-1;;;;;43935:15:1;;;43917:34;;43987:15;;43982:2;43967:18;;43960:43;44034:2;44019:18;;44012:34;;;44077:2;44062:18;;44055:34;;;43897:3;44120;44105:19;;44098:32;;;43860:4;;44147:57;;44184:19;;44176:6;44147:57;:::i;:::-;44139:65;43638:572;-1:-1:-1;;;;;;;43638:572:1:o;44215:127::-;44276:10;44271:3;44267:20;44264:1;44257:31;44307:4;44304:1;44297:15;44331:4;44328:1;44321:15;44686:422;44775:1;44818:5;44775:1;44832:270;44853:7;44843:8;44840:21;44832:270;;;44912:4;44908:1;44904:6;44900:17;44894:4;44891:27;44888:53;;;44921:18;;:::i;:::-;44971:7;44961:8;44957:22;44954:55;;;44991:16;;;;44954:55;45070:22;;;;45030:15;;;;44832:270;;;44836:3;44686:422;;;;;:::o;45113:806::-;45162:5;45192:8;45182:80;;-1:-1:-1;45233:1:1;45247:5;;45182:80;45281:4;45271:76;;-1:-1:-1;45318:1:1;45332:5;;45271:76;45363:4;45381:1;45376:59;;;;45449:1;45444:130;;;;45356:218;;45376:59;45406:1;45397:10;;45420:5;;;45444:130;45481:3;45471:8;45468:17;45465:43;;;45488:18;;:::i;:::-;-1:-1:-1;;45544:1:1;45530:16;;45559:5;;45356:218;;45658:2;45648:8;45645:16;45639:3;45633:4;45630:13;45626:36;45620:2;45610:8;45607:16;45602:2;45596:4;45593:12;45589:35;45586:77;45583:159;;;-1:-1:-1;45695:19:1;;;45727:5;;45583:159;45774:34;45799:8;45793:4;45774:34;:::i;:::-;45844:6;45840:1;45836:6;45832:19;45823:7;45820:32;45817:58;;;45855:18;;:::i;:::-;45893:20;;45113:806;-1:-1:-1;;;45113:806:1:o;45924:131::-;45984:5;46013:36;46040:8;46034:4;46013:36;:::i

Swarm Source

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