Overview
AVAX Balance
0 AVAX
AVAX Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
StakedAvax
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2022-08-29 */ // File: src/StakedAvax/StakedAvaxStorage.sol pragma solidity 0.6.12; contract StakedAvaxStorage { struct UnlockRequest { // The timestamp at which the `shareAmount` was requested to be unlocked uint startedAt; // The amount of shares to burn uint shareAmount; } bytes32 public constant ROLE_WITHDRAW = keccak256("ROLE_WITHDRAW"); bytes32 public constant ROLE_PAUSE = keccak256("ROLE_PAUSE"); bytes32 public constant ROLE_RESUME = keccak256("ROLE_RESUME"); bytes32 public constant ROLE_ACCRUE_REWARDS = keccak256("ROLE_ACCRUE_REWARDS"); bytes32 public constant ROLE_DEPOSIT = keccak256("ROLE_DEPOSIT"); bytes32 public constant ROLE_PAUSE_MINTING = keccak256("ROLE_PAUSE_MINTING"); bytes32 public constant ROLE_RESUME_MINTING = keccak256("ROLE_RESUME_MINTING"); bytes32 public constant ROLE_SET_TOTAL_POOLED_AVAX_CAP = keccak256("ROLE_SET_TOTAL_POOLED_AVAX_CAP"); // The total amount of AVAX controlled by the contract uint public totalPooledAvax; // The total number of sAVAX shares uint public totalShares; /** * @dev sAVAX balances are dynamic and are calculated based on the accounts' shares * and the total amount of AVAX controlled by the protocol. Account shares aren't * normalized, so the contract also stores the sum of all shares to calculate * each account's token balance which equals to: * * shares[account] * totalPooledAvax / totalShares */ mapping(address => uint256) internal shares; // Allowances are nominated in tokens, not token shares. mapping(address => mapping(address => uint256)) internal allowances; // The time that has to elapse before all sAVAX can be converted into AVAX uint public cooldownPeriod; // The time window within which the unlocked AVAX has to be redeemed after the cooldown uint public redeemPeriod; // User-specific details of requested AVAX unlocks mapping(address => UnlockRequest[]) public userUnlockRequests; // Amount of users' sAVAX custodied by the contract mapping(address => uint) public userSharesInCustody; // Exchange rate by timestamp. Updated on delegation reward accrual. mapping(uint => uint) public historicalExchangeRatesByTimestamp; // An ordered list of `historicalExchangeRates` keys uint[] public historicalExchangeRateTimestamps; // Set if minting has been paused bool public mintingPaused; // The maximum amount of AVAX that can be held by the protocol uint public totalPooledAvaxCap; // Number of wallets which have sAVAX uint public stakerCount; } // File: @openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File: @openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; using AddressUpgradeable for address; struct RoleData { EnumerableSetUpgradeable.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: src/StakedAvax/StakedAvax.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; contract StakedAvax is IERC20Upgradeable, AccessControlUpgradeable, ReentrancyGuardUpgradeable, PausableUpgradeable, StakedAvaxStorage { using SafeMathUpgradeable for uint; /// @notice Emitted when a user stakes AVAX event Submitted(address indexed user, uint avaxAmount, uint shareAmount); /// @notice Emitted when a user requests sAVAX to be converted back to AVAX event UnlockRequested(address indexed user, uint shareAmount); /// @notice Emitted when a user cancel a pending unlock request event UnlockCancelled(address indexed user, uint unlockRequestedAt, uint shareAmount); /// @notice Emitted when a user redeems delegated AVAX event Redeem(address indexed user, uint unlockRequestedAt, uint shareAmount, uint avaxAmount); /// @notice Emitted when a user redeems sAVAX which was not burned for AVAX withing the `redeemPeriod`. event RedeemOverdueShares(address indexed user, uint shareAmount); /// @notice Emitted when a warden withdraws AVAX for delegation event Withdraw(address indexed user, uint amount); /// @notice Emitted when a warden deposits AVAX into the contract event Deposit(address indexed user, uint amount); /// @notice Emitted when the cooldown period is updated event CooldownPeriodUpdated(uint oldCooldownPeriod, uint newCooldownPeriod); /// @notice Emitted when the redeem period is updated event RedeemPeriodUpdated(uint oldRedeemPeriod, uint newRedeemPeriod); /// @notice Emitted when the maximum pooled AVAX amount is changed event TotalPooledAvaxCapUpdated(uint oldTotalPooldAvaxCap, uint newTotalPooledAvaxCap); /// @notice Emitted when rewards are distributed into the pool event AccrueRewards(uint value); /// @notice Emitted when sAVAX minting is paused event MintingPaused(address user); /// @notice Emitted when sAVAX minting is resumed event MintingResumed(address user); constructor() initializer public {} /** * @notice Initialize the StakedAvax contract * @param _cooldownPeriod Time delay before shares can be burned for AVAX * @param _redeemPeriod AVAX redemption period after unlock cooldown has elapsed */ function initialize(uint _cooldownPeriod, uint _redeemPeriod) initializer public { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); cooldownPeriod = _cooldownPeriod; emit CooldownPeriodUpdated(0, _cooldownPeriod); redeemPeriod = _redeemPeriod; emit RedeemPeriodUpdated(0, _redeemPeriod); totalPooledAvaxCap = uint(-1); emit TotalPooledAvaxCapUpdated(0, totalPooledAvaxCap); } /** * @return The name of the token. */ function name() public pure returns (string memory) { return "Staked AVAX"; } /** * @return The symbol of the token. */ function symbol() public pure returns (string memory) { return "sAVAX"; } /** * @return The number of decimals for getting user representation of a token amount. */ function decimals() public pure returns (uint8) { return 18; } /** * @return The amount of tokens in existence. */ function totalSupply() public view override returns (uint) { return totalShares; } /** * @return The amount of sAVAX tokens owned by the `account`. */ function balanceOf(address account) public view override returns (uint) { return shares[account]; } /** * @notice Moves `amount` tokens from the caller's account to the `recipient` account. * Emits a `Transfer` event. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. * - the contract must not be paused. * * @return A boolean value indicating whether the operation succeeded. */ function transfer(address recipient, uint amount) public override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @return The remaining number of tokens that `spender` is allowed to spend on behalf of `owner` * through `transferFrom`. This is zero by default. * * @dev This value changes when `approve` or `transferFrom` is called. */ function allowance(address owner, address spender) public view override returns (uint) { return allowances[owner][spender]; } /** * @notice Sets `amount` as the allowance of `spender` over the caller's tokens. * Emits an `Approval` event. * * Requirements: * * - `spender` cannot be the zero address. * - the contract must not be paused. * * @return A boolean value indicating whether the operation succeeded. */ function approve(address spender, uint amount) public override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @notice Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` * is then deducted from the caller's allowance. * * @return A boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `sender` and `recipient` cannot be the zero addresses. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least `amount`. * - the contract must not be paused. */ function transferFrom(address sender, address recipient, uint amount) public override returns (bool) { uint currentAllowance = allowances[sender][msg.sender]; require(currentAllowance >= amount, "TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE"); _transfer(sender, recipient, amount); _approve(sender, msg.sender, currentAllowance.sub(amount)); return true; } /** * @return The amount of shares that corresponds to `avaxAmount` protocol-controlled AVAX. */ function getSharesByPooledAvax(uint avaxAmount) public view returns (uint) { if (totalPooledAvax == 0) { return 0; } uint shares = avaxAmount.mul(totalShares).div(totalPooledAvax); require(shares > 0, "Invalid share count"); return shares; } /** * @return The amount of AVAX that corresponds to `shareAmount` token shares. */ function getPooledAvaxByShares(uint shareAmount) public view returns (uint) { if (totalShares == 0) { return 0; } return shareAmount.mul(totalPooledAvax).div(totalShares); } /** * @notice Start unlocking cooldown period for `shareAmount` AVAX * @param shareAmount Amount of shares to unlock */ function requestUnlock(uint shareAmount) external nonReentrant whenNotPaused { require(shareAmount > 0, "Invalid unlock amount"); require(shareAmount <= shares[msg.sender], "Unlock amount too large"); userSharesInCustody[msg.sender] = userSharesInCustody[msg.sender].add(shareAmount); _transfer(msg.sender, address(this), shareAmount); userUnlockRequests[msg.sender].push(UnlockRequest( block.timestamp, shareAmount )); emit UnlockRequested(msg.sender, shareAmount); } /** * @notice Get the number of active unlock requests by user * @param user User address */ function getUnlockRequestCount(address user) external view returns (uint) { return userUnlockRequests[user].length; } /** * @notice Get a subsection of a user's unlock requests * @param user User account address * @param from List start index * @param to List end index */ function getPaginatedUnlockRequests(address user, uint from, uint to) external view returns ( UnlockRequest[] memory, uint[] memory ) { require(from < userUnlockRequests[user].length, "From index out of bounds"); require(from < to, "To index must be greater than from index"); if (to > userUnlockRequests[user].length) { to = userUnlockRequests[user].length; } UnlockRequest[] memory paginatedUnlockRequests = new UnlockRequest[](to.sub(from)); uint[] memory exchangeRates = new uint[](to.sub(from)); for (uint i = 0; i < to.sub(from); i = i.add(1)) { paginatedUnlockRequests[i] = userUnlockRequests[user][from.add(i)]; if (_isWithinRedemptionPeriod(paginatedUnlockRequests[i])) { (bool success, uint exchangeRate) = _getExchangeRateByUnlockTimestamp(paginatedUnlockRequests[i].startedAt); require(success, "Exchange rate not found"); exchangeRates[i] = exchangeRate; } } return (paginatedUnlockRequests, exchangeRates); } /** * @notice Cancel all unlock requests that are pending the cooldown period to elapse. */ function cancelPendingUnlockRequests() external nonReentrant { uint unlockIndex; while (unlockIndex < userUnlockRequests[msg.sender].length) { if (!_isWithinCooldownPeriod(userUnlockRequests[msg.sender][unlockIndex])) { unlockIndex = unlockIndex.add(1); continue; } _cancelUnlockRequest(unlockIndex); } } /** * @notice Cancel all unlock requests that are redeemable. */ function cancelRedeemableUnlockRequests() external nonReentrant { uint unlockIndex; while (unlockIndex < userUnlockRequests[msg.sender].length) { if (!_isWithinRedemptionPeriod(userUnlockRequests[msg.sender][unlockIndex])) { unlockIndex = unlockIndex.add(1); continue; } _cancelUnlockRequest(unlockIndex); } } /** * @notice Cancel an unexpired unlock request * @param unlockIndex Index number of the cancelled unlock */ function cancelUnlockRequest(uint unlockIndex) external nonReentrant { _cancelUnlockRequest(unlockIndex); } /** * @notice Redeem all redeemable AVAX from all unlocks */ function redeem() external nonReentrant { uint unlockRequestCount = userUnlockRequests[msg.sender].length; uint i = 0; while (i < unlockRequestCount) { if (!_isWithinRedemptionPeriod(userUnlockRequests[msg.sender][i])) { i = i.add(1); continue; } _redeem(i); unlockRequestCount = unlockRequestCount.sub(1); } } /** * @notice Redeem AVAX after cooldown has finished * @param unlockIndex Index number of the redeemed unlock request */ function redeem(uint unlockIndex) external nonReentrant { _redeem(unlockIndex); } /** * @notice Redeem all sAVAX held in custody for overdue unlock requests */ function redeemOverdueShares() external nonReentrant whenNotPaused { uint totalOverdueShares = 0; uint unlockCount = userUnlockRequests[msg.sender].length; uint i = 0; while (i < unlockCount) { UnlockRequest memory unlockRequest = userUnlockRequests[msg.sender][i]; if (!_isExpired(unlockRequest)) { i = i.add(1); continue; } totalOverdueShares = totalOverdueShares.add(unlockRequest.shareAmount); userUnlockRequests[msg.sender][i] = userUnlockRequests[msg.sender][userUnlockRequests[msg.sender].length.sub(1)]; userUnlockRequests[msg.sender].pop(); unlockCount = unlockCount.sub(1); } if (totalOverdueShares > 0) { userSharesInCustody[msg.sender] = userSharesInCustody[msg.sender].sub(totalOverdueShares); _transfer(address(this), msg.sender, totalOverdueShares); emit RedeemOverdueShares(msg.sender, totalOverdueShares); } } /** * @notice Redeem sAVAX held in custody for the given unlock request * @param unlockIndex Unlock request array index */ function redeemOverdueShares(uint unlockIndex) external nonReentrant whenNotPaused { require(unlockIndex < userUnlockRequests[msg.sender].length, "Invalid unlock index"); UnlockRequest memory unlockRequest = userUnlockRequests[msg.sender][unlockIndex]; require(_isExpired(unlockRequest), "Unlock request is not expired"); uint shareAmount = unlockRequest.shareAmount; userSharesInCustody[msg.sender] = userSharesInCustody[msg.sender].sub(shareAmount); userUnlockRequests[msg.sender][unlockIndex] = userUnlockRequests[msg.sender][userUnlockRequests[msg.sender].length - 1]; userUnlockRequests[msg.sender].pop(); _transfer(address(this), msg.sender, shareAmount); emit RedeemOverdueShares(msg.sender, shareAmount); } /** * @notice Process user deposit, mints liquid tokens and increase the pool buffer * @return Amount of sAVAX shares generated */ function submit() public payable whenNotPaused returns (uint) { address sender = msg.sender; uint deposit = msg.value; require(deposit != 0, "ZERO_DEPOSIT"); uint shareAmount = getSharesByPooledAvax(deposit); if (shareAmount == 0) { shareAmount = deposit; } _mintShares(sender, shareAmount); totalPooledAvax = totalPooledAvax.add(deposit); emit Transfer(address(0), sender, shareAmount); emit Submitted(sender, deposit, shareAmount); return shareAmount; } receive() external payable { submit(); } /********************************************************************************* * * * INTERNAL FUNCTIONS * * * *********************************************************************************/ /** * @notice Moves `amount` tokens from `sender` to `recipient`. * Emits a `Transfer` event. */ function _transfer(address sender, address recipient, uint amount) internal { _transferShares(sender, recipient, amount); emit Transfer(sender, recipient, amount); } /** * @notice Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * Emits an `Approval` event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * - the contract must not be paused. */ function _approve(address owner, address spender, uint amount) internal whenNotPaused { require(owner != address(0), "APPROVE_FROM_ZERO_ADDRESS"); require(spender != address(0), "APPROVE_TO_ZERO_ADDRESS"); allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @notice Moves `shareAmount` shares from `sender` to `recipient`. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must hold at least `shareAmount` shares. * - the contract must not be paused. */ function _transferShares(address sender, address recipient, uint shareAmount) internal whenNotPaused { require(sender != address(0), "TRANSFER_FROM_THE_ZERO_ADDRESS"); require(recipient != address(0), "TRANSFER_TO_THE_ZERO_ADDRESS"); require(sender != recipient, "TRANSFER_TO_SELF"); uint currentSenderShares = shares[sender]; require(shareAmount <= currentSenderShares, "TRANSFER_AMOUNT_EXCEEDS_BALANCE"); require(shareAmount > 0, "TRANSFER_ZERO_VALUE"); if (shares[recipient] == 0) { stakerCount = stakerCount.add(1); } shares[sender] = currentSenderShares.sub(shareAmount); shares[recipient] = shares[recipient].add(shareAmount); if (shares[sender] == 0) { stakerCount = stakerCount.sub(1); } } /** * @notice Creates `shareAmount` shares and assigns them to `recipient`, increasing the total amount of shares. * @dev This doesn't increase the token total supply. * * Requirements: * * - `recipient` cannot be the zero address * - the contract must not be paused * - minting must not be paused * - total pooled AVAX cap must not be exceeded */ function _mintShares(address recipient, uint shareAmount) internal whenNotPaused returns (uint) { require(!mintingPaused, "Minting paused"); require(recipient != address(0), "MINT_TO_THE_ZERO_ADDRESS"); require(shareAmount > 0, "MINT_ZERO_VALUE"); uint avaxAmount = getPooledAvaxByShares(shareAmount); require(totalPooledAvax.add(avaxAmount) <= totalPooledAvaxCap, "TOTAL_POOLED_AVAX_CAP_EXCEEDED"); if (shares[recipient] == 0) { stakerCount = stakerCount.add(1); } totalShares = totalShares.add(shareAmount); shares[recipient] = shares[recipient].add(shareAmount); return totalShares; } /** * @notice Destroys `shareAmount` shares from `account`'s holdings, decreasing the total amount of shares. * @dev This doesn't decrease the token total supply. * * Requirements: * * - `account` cannot be the zero address. * - `account` must hold at least `shareAmount` shares. * - the contract must not be paused. */ function _burnShares(address account, uint shareAmount) internal whenNotPaused returns (uint) { require(account != address(0), "BURN_FROM_THE_ZERO_ADDRESS"); require(shareAmount > 0, "BURN_ZERO_VALUE"); uint accountShares = shares[account]; require(shareAmount <= accountShares, "BURN_AMOUNT_EXCEEDS_BALANCE"); totalShares = totalShares.sub(shareAmount); shares[account] = accountShares.sub(shareAmount); if (shares[account] == 0) { stakerCount = stakerCount.sub(1); } return totalShares; } /** * @notice Checks if the unlock request is within its cooldown period * @param unlockRequest Unlock request */ function _isWithinCooldownPeriod(UnlockRequest memory unlockRequest) internal view returns (bool) { return unlockRequest.startedAt.add(cooldownPeriod) >= block.timestamp; } /** * @notice Checks if the unlock request is within its redemption period * @param unlockRequest Unlock request */ function _isWithinRedemptionPeriod(UnlockRequest memory unlockRequest) internal view returns (bool) { return !_isWithinCooldownPeriod(unlockRequest) && unlockRequest.startedAt.add(cooldownPeriod).add(redeemPeriod) >= block.timestamp; } /** * @notice Checks if the unlock request has expired * @param unlockRequest Unlock request */ function _isExpired(UnlockRequest memory unlockRequest) internal view returns (bool) { return unlockRequest.startedAt.add(cooldownPeriod).add(redeemPeriod) < block.timestamp; } /** * @notice Cancel an unexpired unlock request * @param unlockIndex Index number of the cancelled unlock */ function _cancelUnlockRequest(uint unlockIndex) internal whenNotPaused { require(unlockIndex < userUnlockRequests[msg.sender].length, "Invalid index"); UnlockRequest memory unlockRequest = userUnlockRequests[msg.sender][unlockIndex]; require(!_isExpired(unlockRequest), "Unlock request is expired"); uint shareAmount = unlockRequest.shareAmount; uint unlockRequestedAt = unlockRequest.startedAt; if (unlockIndex != userUnlockRequests[msg.sender].length - 1) { userUnlockRequests[msg.sender][unlockIndex] = userUnlockRequests[msg.sender][userUnlockRequests[msg.sender].length - 1]; } userUnlockRequests[msg.sender].pop(); userSharesInCustody[msg.sender] = userSharesInCustody[msg.sender].sub(shareAmount); _transfer(address(this), msg.sender, shareAmount); emit UnlockCancelled(msg.sender, unlockRequestedAt, shareAmount); } /** * @notice Redeem AVAX after cooldown has finished * @param unlockRequestIndex Index number of the redeemed unlock request */ function _redeem(uint unlockRequestIndex) internal whenNotPaused { require(unlockRequestIndex < userUnlockRequests[msg.sender].length, "Invalid unlock request index"); UnlockRequest memory unlockRequest = userUnlockRequests[msg.sender][unlockRequestIndex]; require(_isWithinRedemptionPeriod(unlockRequest), "Unlock request is not redeemable"); (bool success, uint exchangeRate) = _getExchangeRateByUnlockTimestamp(unlockRequest.startedAt); require(success, "Exchange rate not found"); uint shareAmount = unlockRequest.shareAmount; uint startedAt = unlockRequest.startedAt; uint avaxAmount = exchangeRate.mul(shareAmount).div(1e18); require(avaxAmount >= shareAmount, "Invalid exchange rate"); userSharesInCustody[msg.sender] = userSharesInCustody[msg.sender].sub(shareAmount); _burnShares(address(this), shareAmount); totalPooledAvax = totalPooledAvax.sub(avaxAmount); userUnlockRequests[msg.sender][unlockRequestIndex] = userUnlockRequests[msg.sender][userUnlockRequests[msg.sender].length.sub(1)]; userUnlockRequests[msg.sender].pop(); (success, ) = msg.sender.call{ value: avaxAmount }(""); require(success, "AVAX transfer failed"); emit Redeem(msg.sender, startedAt, shareAmount, avaxAmount); } /** * @notice Get the earliest exchange rate closest to the unlock timestamp * @param unlockTimestamp Unlock request timestamp * @return (success, exchange rate) */ function _getExchangeRateByUnlockTimestamp(uint unlockTimestamp) internal view returns (bool, uint) { if (historicalExchangeRateTimestamps.length == 0) { return (false, 0); } uint low = 0; uint mid; uint high = historicalExchangeRateTimestamps.length - 1; uint unlockClaimableAtTimestamp = unlockTimestamp.add(cooldownPeriod); while (low <= high) { mid = high.add(low).div(2); if (historicalExchangeRateTimestamps[mid] <= unlockClaimableAtTimestamp) { if (mid.add(1) == historicalExchangeRateTimestamps.length || historicalExchangeRateTimestamps[mid.add(1)] > unlockClaimableAtTimestamp) { return (true, historicalExchangeRatesByTimestamp[historicalExchangeRateTimestamps[mid]]); } low = mid.add(1); } else if (mid == 0) { return (true, 1e18); } else { high = mid.sub(1); } } return (false, 0); } /** * @notice Remove exchange rate entries older than `redeemPeriod` */ function _dropExpiredExchangeRateEntries() internal { if (historicalExchangeRateTimestamps.length == 0) { return; } uint shiftCount = 0; uint expirationThreshold = block.timestamp.sub(redeemPeriod).sub(172800); while (shiftCount < historicalExchangeRateTimestamps.length && historicalExchangeRateTimestamps[shiftCount] < expirationThreshold) { shiftCount = shiftCount.add(1); } if (shiftCount == 0) { return; } for (uint i = 0; i < historicalExchangeRateTimestamps.length.sub(shiftCount); i = i.add(1)) { historicalExchangeRateTimestamps[i] = historicalExchangeRateTimestamps[i.add(shiftCount)]; } for (uint i = 1; i <= shiftCount; i = i.add(1)) { historicalExchangeRateTimestamps.pop(); } } /********************************************************************************* * * * ADMIN-ONLY FUNCTIONS * * * *********************************************************************************/ /** * @notice Accrue staking rewards to the pool * @param amount Amount of rewards accrued to the pool */ function accrueRewards(uint amount) external nonReentrant { require(hasRole(ROLE_ACCRUE_REWARDS, msg.sender), "ROLE_ACCRUE_REWARDS"); totalPooledAvax = totalPooledAvax.add(amount); _dropExpiredExchangeRateEntries(); historicalExchangeRatesByTimestamp[block.timestamp] = getPooledAvaxByShares(1e18); historicalExchangeRateTimestamps.push(block.timestamp); emit AccrueRewards(amount); } /** * @notice Withdraw AVAX from the contract for delegation * @param amount Amount of AVAX to withdraw */ function withdraw(uint amount) external nonReentrant { require(hasRole(ROLE_WITHDRAW, msg.sender), "ROLE_WITHDRAW"); (bool success, ) = msg.sender.call{ value: amount }(""); require(success, "AVAX transfer failed"); emit Withdraw(msg.sender, amount); } /** * @notice Deposit AVAX into the contract without minting sAVAX */ function deposit() external payable { require(hasRole(ROLE_DEPOSIT, msg.sender), "ROLE_DEPOSIT"); require(msg.value > 0, "Zero value"); emit Deposit(msg.sender, msg.value); } /** * @notice Update the cooldown period * @param newCooldownPeriod New cooldown period */ function setCooldownPeriod(uint newCooldownPeriod) external { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "DEFAULT_ADMIN_ROLE"); uint oldCooldownPeriod = cooldownPeriod; cooldownPeriod = newCooldownPeriod; emit CooldownPeriodUpdated(oldCooldownPeriod, cooldownPeriod); } /** * @notice Update the redeem period * @param newRedeemPeriod New redeem period */ function setRedeemPeriod(uint newRedeemPeriod) external { require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "DEFAULT_ADMIN_ROLE"); uint oldRedeemPeriod = redeemPeriod; redeemPeriod = newRedeemPeriod; emit RedeemPeriodUpdated(oldRedeemPeriod, redeemPeriod); } /** * @notice Set a upper limit for the total pooled AVAX amount * @param newTotalPooledAvaxCap The pool cap */ function setTotalPooledAvaxCap(uint newTotalPooledAvaxCap) external { require(hasRole(ROLE_SET_TOTAL_POOLED_AVAX_CAP, msg.sender), "ROLE_SET_TOTAL_POOLED_AVAX_CAP"); uint oldTotalPooledAvaxCap = totalPooledAvaxCap; totalPooledAvaxCap = newTotalPooledAvaxCap; emit TotalPooledAvaxCapUpdated(oldTotalPooledAvaxCap, newTotalPooledAvaxCap); } /** * @notice Stop pool routine operations */ function pause() external { require(hasRole(ROLE_PAUSE, msg.sender), "ROLE_PAUSE"); _pause(); } /** * @notice Resume pool routine operations */ function resume() external { require(hasRole(ROLE_RESUME, msg.sender), "ROLE_RESUME"); _unpause(); } /** * @notice Stop minting */ function pauseMinting() external { require(hasRole(ROLE_PAUSE_MINTING, msg.sender), "ROLE_PAUSE_MINTING"); require(!mintingPaused, "Minting is already paused"); mintingPaused = true; emit MintingPaused(msg.sender); } /** * @notice Resume minting */ function resumeMinting() external { require(hasRole(ROLE_RESUME_MINTING, msg.sender), "ROLE_RESUME_MINTING"); require(mintingPaused, "Minting is not paused"); mintingPaused = false; emit MintingResumed(msg.sender); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AccrueRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCooldownPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCooldownPeriod","type":"uint256"}],"name":"CooldownPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"MintingPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"MintingResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockRequestedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"avaxAmount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"RedeemOverdueShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRedeemPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRedeemPeriod","type":"uint256"}],"name":"RedeemPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"avaxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"Submitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTotalPooldAvaxCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalPooledAvaxCap","type":"uint256"}],"name":"TotalPooledAvaxCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockRequestedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"UnlockCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"UnlockRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_ACCRUE_REWARDS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_DEPOSIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_PAUSE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_PAUSE_MINTING","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_RESUME","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_RESUME_MINTING","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_SET_TOTAL_POOLED_AVAX_CAP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"accrueRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelPendingUnlockRequests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelRedeemableUnlockRequests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unlockIndex","type":"uint256"}],"name":"cancelUnlockRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getPaginatedUnlockRequests","outputs":[{"components":[{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"internalType":"struct StakedAvaxStorage.UnlockRequest[]","name":"","type":"tuple[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"getPooledAvaxByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"avaxAmount","type":"uint256"}],"name":"getSharesByPooledAvax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUnlockRequestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"historicalExchangeRateTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"historicalExchangeRatesByTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownPeriod","type":"uint256"},{"internalType":"uint256","name":"_redeemPeriod","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unlockIndex","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemOverdueShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unlockIndex","type":"uint256"}],"name":"redeemOverdueShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"requestUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCooldownPeriod","type":"uint256"}],"name":"setCooldownPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRedeemPeriod","type":"uint256"}],"name":"setRedeemPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTotalPooledAvaxCap","type":"uint256"}],"name":"setTotalPooledAvaxCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"submit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPooledAvax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPooledAvaxCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userSharesInCustody","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userUnlockRequests","outputs":[{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600054610100900460ff16806200002e57506200002e620000ab565b806200003d575060005460ff16155b620000655760405162461bcd60e51b81526004016200005c90620000cf565b60405180910390fd5b600054610100900460ff1615801562000091576000805460ff1961ff0019909116610100171660011790555b8015620000a4576000805461ff00191690555b506200011d565b6000620000c330620000c960201b620022491760201c565b15905090565b3b151590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6141a8806200012d6000396000f3fe6080604052600436106103a65760003560e01c8063629e8056116101e7578063c9d2ff9d1161010d578063dff69787116100a0578063f0d82e841161006f578063f0d82e84146109b8578063f1ee8d92146109d8578063f2ab8cd2146109f8578063fd012e3414610a26576103b6565b8063dff697871461094e578063e1a283d614610963578063e1a472b914610978578063e4a3011614610998576103b6565b8063d547741f116100dc578063d547741f146108d9578063da8fbf2a146108f9578063db006a751461090e578063dd62ed3e1461092e576103b6565b8063c9d2ff9d1461087c578063ca15c8731461089c578063d0e30db0146108bc578063d1f1ca04146108c4576103b6565b8063a217fddf11610185578063be040fb011610154578063be040fb01461081d578063c1db658814610832578063c2d7865414610847578063c423f9a81461085c576103b6565b8063a217fddf146107b3578063a9059cbb146107c8578063a905ff93146107e8578063ada03b38146107fd576103b6565b80638456cb59116101c15780638456cb591461073c5780639010d07c1461075157806391d148541461077e57806395d89b411461079e576103b6565b8063629e8056146106e757806370a08231146106fc57806380ea3de11461071c576103b6565b80632f2ff15d116102cc5780634a36d6c11161026a5780635bcb2fc6116102395780635bcb2fc6146106955780635c975abb1461069d5780635cd47487146106b25780635d039525146106c7576103b6565b80634a36d6c1146106365780634b7e23dc146106565780634ff0241a1461066b57806359ae340e14610680576103b6565b80633a98ef39116102a65780633a98ef39146105e25780633fc777b3146105f757806340a233a61461060c5780634757c0d214610621576103b6565b80632f2ff15d14610580578063313ce567146105a057806336568abe146105c2576103b6565b80630f7e2048116103445780631b2b3a2f116103135780631b2b3a2f1461050057806323b872dd14610520578063248a9ca3146105405780632e1a7d4d14610560576103b6565b80630f7e2048146104965780631610247b146104b657806318160ddd146104d65780631ab8ab25146104eb576103b6565b806306fdde031161038057806306fdde0314610412578063095ea7b3146104345780630a732ce6146104615780630d10d32c14610481576103b6565b806301550f64146103bb57806304646a49146103d2578063046f7da2146103fd576103b6565b366103b6576103b3610a54565b50005b600080fd5b3480156103c757600080fd5b506103d0610b63565b005b3480156103de57600080fd5b506103e7610c23565b6040516103f491906135d4565b60405180910390f35b34801561040957600080fd5b506103d0610c29565b34801561041e57600080fd5b50610427610c79565b6040516103f491906135eb565b34801561044057600080fd5b5061045461044f366004613452565b610c9e565b6040516103f491906135c9565b34801561046d57600080fd5b506103e761047c3660046134af565b610cb5565b34801561048d57600080fd5b506103d0610cc7565b3480156104a257600080fd5b506103d06104b13660046134af565b610f11565b3480156104c257600080fd5b506103d06104d13660046134af565b611127565b3480156104e257600080fd5b506103e7611158565b3480156104f757600080fd5b506103e761115e565b34801561050c57600080fd5b506103e761051b3660046134af565b611182565b34801561052c57600080fd5b5061045461053b366004613412565b6111a0565b34801561054c57600080fd5b506103e761055b3660046134af565b61120e565b34801561056c57600080fd5b506103d061057b3660046134af565b611226565b34801561058c57600080fd5b506103d061059b3660046134c7565b61135a565b3480156105ac57600080fd5b506105b56113a2565b6040516103f4919061414c565b3480156105ce57600080fd5b506103d06105dd3660046134c7565b6113a7565b3480156105ee57600080fd5b506103e76113e9565b34801561060357600080fd5b506103e76113ef565b34801561061857600080fd5b506103e7611413565b34801561062d57600080fd5b506103e7611419565b34801561064257600080fd5b506103e76106513660046134af565b61143d565b34801561066257600080fd5b506103e7611473565b34801561067757600080fd5b506103e7611497565b34801561068c57600080fd5b506103d06114bb565b6103e7610a54565b3480156106a957600080fd5b50610454611567565b3480156106be57600080fd5b506103e7611570565b3480156106d357600080fd5b506103e76106e23660046133c3565b611576565b3480156106f357600080fd5b506103e7611588565b34801561070857600080fd5b506103e76107173660046133c3565b61158e565b34801561072857600080fd5b506103d06107373660046134af565b6115a9565b34801561074857600080fd5b506103d0611616565b34801561075d57600080fd5b5061077161076c3660046134f6565b611664565b6040516103f49190613522565b34801561078a57600080fd5b506104546107993660046134c7565b611683565b3480156107aa57600080fd5b5061042761169b565b3480156107bf57600080fd5b506103e76116ba565b3480156107d457600080fd5b506104546107e3366004613452565b6116bf565b3480156107f457600080fd5b506103e76116cc565b34801561080957600080fd5b506103d06108183660046134af565b6116f0565b34801561082957600080fd5b506103d0611770565b34801561083e57600080fd5b506103e761183e565b34801561085357600080fd5b506103e7611862565b34801561086857600080fd5b506103e76108773660046133c3565b611886565b34801561088857600080fd5b506103d06108973660046134af565b6118a1565b3480156108a857600080fd5b506103e76108b73660046134af565b6119f7565b6103d0611a0e565b3480156108d057600080fd5b506103d0611ab7565b3480156108e557600080fd5b506103d06108f43660046134c7565b611b3d565b34801561090557600080fd5b506103d0611b77565b34801561091a57600080fd5b506103d06109293660046134af565b611c1d565b34801561093a57600080fd5b506103e76109493660046133de565b611c4e565b34801561095a57600080fd5b506103e7611c79565b34801561096f57600080fd5b50610454611c7f565b34801561098457600080fd5b506103d06109933660046134af565b611c88565b3480156109a457600080fd5b506103d06109b33660046134f6565b611da0565b3480156109c457600080fd5b506103d06109d33660046134af565b611ef2565b3480156109e457600080fd5b506103e76109f33660046134af565b611f53565b348015610a0457600080fd5b50610a18610a1336600461347c565b611fa7565b6040516103f4929190613536565b348015610a3257600080fd5b50610a46610a41366004613452565b612210565b6040516103f49291906135dd565b6000610a5e611567565b15610a845760405162461bcd60e51b8152600401610a7b90613a98565b60405180910390fd5b333480610aa35760405162461bcd60e51b8152600401610a7b90613c95565b6000610aae82611f53565b905080610ab85750805b610ac2838261224f565b5060c954610ad090836123a8565b60c9556040516001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b119085906135d4565b60405180910390a3826001600160a01b03167fbb0070894135d02edfa550b04d7e5e141aa8090b46e57597ad45bfedd65544988383604051610b549291906135dd565b60405180910390a29250505090565b60026065541415610b865760405162461bcd60e51b8152600401610a7b90613ff7565b600260655560005b33600090815260cf6020526040902054811015610c1b5733600090815260cf602052604090208054610bf7919083908110610bc557fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250506123cd565b610c0d57610c068160016123a8565b9050610b8e565b610c16816123e8565b610b8e565b506001606555565b60cd5481565b610c537f042c6cf123ef505aa22225497dce2119e438d03e616dea9958b9e78a7d2c9bfd33611683565b610c6f5760405162461bcd60e51b8152600401610a7b90613667565b610c7761260e565b565b60408051808201909152600b81526a0a6e8c2d6cac84082ac82b60ab1b602082015290565b6000610cab338484612672565b5060015b92915050565b60d16020526000908152604090205481565b60026065541415610cea5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610cf7611567565b15610d145760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf6020526040812054815b81811015610e8657610d36613392565b33600090815260cf60205260409020805483908110610d5157fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050610d898161274b565b610da057610d988260016123a8565b915050610d26565b6020810151610db09085906123a8565b33600090815260cf60205260409020805491955090610dd0906001612772565b81548110610dda57fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b031681526020019081526020016000208381548110610e1857fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf90915260409020805480610e5057fe5b6000828152602081206002600019909301928302018181556001908101919091559155610e7e908490612772565b925050610d26565b8215610f075733600090815260d06020526040902054610ea69084612772565b33600081815260d06020526040902091909155610ec59030908561279a565b336001600160a01b03167feaca243f6502ade1b9ea0909306c290366d6ea6778ca407ca4415c4a0f45e35384604051610efe91906135d4565b60405180910390a25b5050600160655550565b60026065541415610f345760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610f41611567565b15610f5e5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf60205260409020548110610f8c5760405162461bcd60e51b8152600401610a7b90613cbb565b610f94613392565b33600090815260cf60205260409020805483908110610faf57fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050610fe78161274b565b6110035760405162461bcd60e51b8152600401610a7b9061402e565b60208082015133600090815260d09092526040909120546110249082612772565b33600090815260d0602090815260408083209390935560cf9052208054600019810190811061104f57fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b03168152602001908152602001600020848154811061108d57fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf909152604090208054806110c557fe5b6000828152602081206002600019909301928302018181556001015590556110ee30338361279a565b336001600160a01b03167feaca243f6502ade1b9ea0909306c290366d6ea6778ca407ca4415c4a0f45e35382604051610efe91906135d4565b6002606554141561114a5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610c1b816123e8565b60ca5490565b7fcdf8b82f637f9a4be48302312e5512748fdc83ce33bdd13a07588c9a48f40d0881565b60d2818154811061118f57fe5b600091825260209091200154905081565b6001600160a01b038316600090815260cc60209081526040808320338452909152812054828110156111e45760405162461bcd60e51b8152600401610a7b906136ce565b6111ef85858561279a565b61120385336111fe8487612772565b612672565b506001949350505050565b6000818152603360205260409020600201545b919050565b600260655414156112495760405162461bcd60e51b8152600401610a7b90613ff7565b60026065556112787f0f9dd4db10c87ffcc337f44200a5df16e545591d09c12f63c158b3d592fcf18833611683565b6112945760405162461bcd60e51b8152600401610a7b9061378c565b6000336001600160a01b0316826040516112ad9061351f565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b50509050806113105760405162461bcd60e51b8152600401610a7b90613da1565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161134991906135d4565b60405180910390a250506001606555565b600082815260336020526040902060020154611378906107996127e8565b6113945760405162461bcd60e51b8152600401610a7b9061370f565b61139e82826127ec565b5050565b601290565b6113af6127e8565b6001600160a01b0316816001600160a01b0316146113df5760405162461bcd60e51b8152600401610a7b90614089565b61139e8282612855565b60ca5481565b7feaf074586bf6c7ac16d3c4db5c992c7f0721b20b018b99a7d1fe8187f59d9c8681565b60ce5481565b7f7507d5b6f482d6f276fc3788841416ce1f32150a93658622625d5b91ccda3d7881565b600060ca546000141561145257506000611221565b610caf60ca5461146d60c954856128be90919063ffffffff16565b906128f8565b7f0f9dd4db10c87ffcc337f44200a5df16e545591d09c12f63c158b3d592fcf18881565b7ff146182d150a5b368b6d283f87aeae1f25c21b02ff55cf16848704ade176a5cb81565b6114e57fcdf8b82f637f9a4be48302312e5512748fdc83ce33bdd13a07588c9a48f40d0833611683565b6115015760405162461bcd60e51b8152600401610a7b90613dcf565b60d35460ff166115235760405162461bcd60e51b8152600401610a7b90614107565b60d3805460ff191690556040517f8a53acd29b3c02ba82b89c57b23196b792ccb00a28515221f71bd92eafbc2dc39061155d903390613522565b60405180910390a1565b60975460ff1690565b60d45481565b60d06020526000908152604090205481565b60c95481565b6001600160a01b0316600090815260cb602052604090205490565b6115b4600033611683565b6115d05760405162461bcd60e51b8152600401610a7b906137ea565b60cd8054908290556040517f98eaabfe135a9c40c420208962bf81e7926b4d6df3e23502164c0554b7b352249061160a90839085906135dd565b60405180910390a15050565b6116407ff146182d150a5b368b6d283f87aeae1f25c21b02ff55cf16848704ade176a5cb33611683565b61165c5760405162461bcd60e51b8152600401610a7b90614065565b610c7761292a565b600082815260336020526040812061167c9083612985565b9392505050565b600082815260336020526040812061167c9083612991565b6040805180820190915260058152640e682ac82b60db1b602082015290565b600081565b6000610cab33848461279a565b7f47b922604560255f6e7d9ac32bd55d2b112af12fac29e9cbbcef77fe82ffbd9381565b61171a7f7507d5b6f482d6f276fc3788841416ce1f32150a93658622625d5b91ccda3d7833611683565b6117365760405162461bcd60e51b8152600401610a7b90613ac2565b60d48054908290556040517fc016457d0a92973d26bab98d68d6f20133e355c467d05e5206c88c25d3b739d09061160a90839085906135dd565b600260655414156117935760405162461bcd60e51b8152600401610a7b90613ff7565b600260655533600090815260cf6020526040812054905b818110156118355733600090815260cf6020526040902080546118049190839081106117d257fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250506129a6565b61181a576118138160016123a8565b90506117aa565b611823816129d9565b61182e826001612772565b91506117aa565b50506001606555565b7f042c6cf123ef505aa22225497dce2119e438d03e616dea9958b9e78a7d2c9bfd81565b7fa9905b3f34c6e7b8ac62a407ded9f3069ef096a2e251318e09aff6898263df1981565b6001600160a01b0316600090815260cf602052604090205490565b600260655414156118c45760405162461bcd60e51b8152600401610a7b90613ff7565b60026065556118d1611567565b156118ee5760405162461bcd60e51b8152600401610a7b90613a98565b6000811161190e5760405162461bcd60e51b8152600401610a7b90613f05565b33600090815260cb602052604090205481111561193d5760405162461bcd60e51b8152600401610a7b90613dfc565b33600090815260d0602052604090205461195790826123a8565b33600081815260d0602052604090209190915561197590308361279a565b33600081815260cf602090815260408083208151808301835242815280840187815282546001818101855593875294909520905160029094020192835592519190920155517fd843ce9ef55b27026be6c5e44e9f58097e0ebfa0d9d2d5823cb8ffa779585170906119e79084906135d4565b60405180910390a2506001606555565b6000818152603360205260408120610caf90612cd7565b611a387fa9905b3f34c6e7b8ac62a407ded9f3069ef096a2e251318e09aff6898263df1933611683565b611a545760405162461bcd60e51b8152600401610a7b90613d20565b60003411611a745760405162461bcd60e51b8152600401610a7b90613d46565b336001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c34604051611aad91906135d4565b60405180910390a2565b60026065541415611ada5760405162461bcd60e51b8152600401610a7b90613ff7565b600260655560005b33600090815260cf6020526040902054811015610c1b5733600090815260cf602052604090208054611b199190839081106117d257fe5b611b2f57611b288160016123a8565b9050611ae2565b611b38816123e8565b611ae2565b600082815260336020526040902060020154611b5b906107996127e8565b6113df5760405162461bcd60e51b8152600401610a7b90613a13565b611ba17feaf074586bf6c7ac16d3c4db5c992c7f0721b20b018b99a7d1fe8187f59d9c8633611683565b611bbd5760405162461bcd60e51b8152600401610a7b90613fcb565b60d35460ff1615611be05760405162461bcd60e51b8152600401610a7b90613e33565b60d3805460ff191660011790556040517f35365f539a67058ad0735a24a50fe45b0ee05207919e9f4a2f60d855f55e0c0e9061155d903390613522565b60026065541415611c405760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610c1b816129d9565b6001600160a01b03918216600090815260cc6020908152604080832093909416825291909152205490565b60d55481565b60d35460ff1681565b60026065541415611cab5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555611cda7f47b922604560255f6e7d9ac32bd55d2b112af12fac29e9cbbcef77fe82ffbd9333611683565b611cf65760405162461bcd60e51b8152600401610a7b90613978565b60c954611d0390826123a8565b60c955611d0e612ce2565b611d1f670de0b6b3a764000061143d565b42600081815260d160205260408082209390935560d2805460018101825591527ff2192e1030363415d7b4fb0406540a0060e8e2fc8982f3f32289379e11fa65460155517f8fbf6a230d02fb8f41af8c1ca90b126472e11286c47d7ed86bb2e1fc51a283d890611d909083906135d4565b60405180910390a1506001606555565b600054610100900460ff1680611db95750611db9612e0a565b80611dc7575060005460ff16155b611de35760405162461bcd60e51b8152600401610a7b90613af9565b600054610100900460ff16158015611e0e576000805460ff1961ff0019909116610100171660011790555b611e19600033611394565b60cd8390556040517f98eaabfe135a9c40c420208962bf81e7926b4d6df3e23502164c0554b7b3522490611e519060009086906135dd565b60405180910390a160ce8290556040517f13cca15637be33d4651625caf09528168b20c132463c69ab5c0ff48b3e63911790611e919060009085906135dd565b60405180910390a160001960d48190556040517fc016457d0a92973d26bab98d68d6f20133e355c467d05e5206c88c25d3b739d091611ed391600091906135dd565b60405180910390a18015611eed576000805461ff00191690555b505050565b611efd600033611683565b611f195760405162461bcd60e51b8152600401610a7b906137ea565b60ce8054908290556040517f13cca15637be33d4651625caf09528168b20c132463c69ab5c0ff48b3e6391179061160a90839085906135dd565b600060c95460001415611f6857506000611221565b6000611f8560c95461146d60ca54866128be90919063ffffffff16565b905060008111610caf5760405162461bcd60e51b8152600401610a7b90613ed8565b6001600160a01b038316600090815260cf602052604090205460609081908410611fe35760405162461bcd60e51b8152600401610a7b90613875565b8284106120025760405162461bcd60e51b8152600401610a7b90613b47565b6001600160a01b038516600090815260cf602052604090205483111561203e576001600160a01b038516600090815260cf602052604090205492505b606061204a8486612772565b67ffffffffffffffff8111801561206057600080fd5b5060405190808252806020026020018201604052801561209a57816020015b612087613392565b81526020019060019003908161207f5790505b50905060606120a98587612772565b67ffffffffffffffff811180156120bf57600080fd5b506040519080825280602002602001820160405280156120e9578160200160208202803683370190505b50905060005b6120f98688612772565b811015612203576001600160a01b038816600090815260cf6020526040902061212288836123a8565b8154811061212c57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505083828151811061216557fe5b602002602001018190525061218c83828151811061217f57fe5b60200260200101516129a6565b156121f1576000806121b48584815181106121a357fe5b602002602001015160000151612e1b565b91509150816121d55760405162461bcd60e51b8152600401610a7b90613ce9565b808484815181106121e257fe5b60200260200101818152505050505b6121fc8160016123a8565b90506120ef565b5090969095509350505050565b60cf602052816000526040600020818154811061222957fe5b600091825260209091206002909102018054600190910154909250905082565b3b151590565b6000612259611567565b156122765760405162461bcd60e51b8152600401610a7b90613a98565b60d35460ff16156122995760405162461bcd60e51b8152600401610a7b90613816565b6001600160a01b0383166122bf5760405162461bcd60e51b8152600401610a7b90613f34565b600082116122df5760405162461bcd60e51b8152600401610a7b9061363e565b60006122ea8361143d565b905060d4546123048260c9546123a890919063ffffffff16565b11156123225760405162461bcd60e51b8152600401610a7b90613941565b6001600160a01b038416600090815260cb60205260409020546123515760d55461234d9060016123a8565b60d5555b60ca5461235e90846123a8565b60ca556001600160a01b038416600090815260cb602052604090205461238490846123a8565b6001600160a01b038516600090815260cb6020526040902055505060ca5492915050565b60008282018381101561167c5760405162461bcd60e51b8152600401610a7b906138e3565b60cd54815160009142916123e0916123a8565b101592915050565b6123f0611567565b1561240d5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf6020526040902054811061243b5760405162461bcd60e51b8152600401610a7b9061391a565b612443613392565b33600090815260cf6020526040902080548390811061245e57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505090506124968161274b565b156124b35760405162461bcd60e51b8152600401610a7b90613f6b565b602080820151825133600090815260cf9093526040909220549091906000190184146125555733600090815260cf60205260409020805460001981019081106124f857fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b03168152602001908152602001600020858154811061253657fe5b6000918252602090912082546002909202019081556001918201549101555b33600090815260cf6020526040902080548061256d57fe5b600082815260208082206002600019909401938402018281556001018290559190925533825260d0905260409020546125a69083612772565b33600081815260d060205260409020919091556125c59030908461279a565b336001600160a01b03167f7e4a9502fd577f76f1dc8c9c8f63196816f7c1bd73c6db99f888e8d7bb2f899882846040516126009291906135dd565b60405180910390a250505050565b612616611567565b6126325760405162461bcd60e51b8152600401610a7b9061375e565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126656127e8565b60405161155d9190613522565b61267a611567565b156126975760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b0383166126bd5760405162461bcd60e51b8152600401610a7b90613ea1565b6001600160a01b0382166126e35760405162461bcd60e51b8152600401610a7b906138ac565b6001600160a01b03808416600081815260cc602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061273e9085906135d4565b60405180910390a3505050565b60ce5460cd548251600092429261276b92612765916123a8565b906123a8565b1092915050565b6000828211156127945760405162461bcd60e51b8152600401610a7b906139a5565b50900390565b6127a5838383612f56565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161273e91906135d4565b3390565b600082815260336020526040902061280490826130fb565b1561139e576128116127e8565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260336020526040902061286d9082613110565b1561139e5761287a6127e8565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000826128cd57506000610caf565b828202828482816128da57fe5b041461167c5760405162461bcd60e51b8152600401610a7b90613c2a565b60008082116129195760405162461bcd60e51b8152600401610a7b906139dc565b81838161292257fe5b049392505050565b612932611567565b1561294f5760405162461bcd60e51b8152600401610a7b90613a98565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126656127e8565b600061167c8383613125565b600061167c836001600160a01b03841661316a565b60006129b1826123cd565b158015610caf5750426123e060ce5461276560cd5486600001516123a890919063ffffffff16565b6129e1611567565b156129fe5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf60205260409020548110612a2c5760405162461bcd60e51b8152600401610a7b90613e6a565b612a34613392565b33600090815260cf60205260409020805483908110612a4f57fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050612a87816129a6565b612aa35760405162461bcd60e51b8152600401610a7b90613a63565b600080612ab38360000151612e1b565b9150915081612ad45760405162461bcd60e51b8152600401610a7b90613ce9565b602083015183516000612af3670de0b6b3a764000061146d86866128be565b905082811015612b155760405162461bcd60e51b8152600401610a7b906140d8565b33600090815260d06020526040902054612b2f9084612772565b33600090815260d06020526040902055612b493084613182565b5060c954612b579082612772565b60c95533600090815260cf602052604090208054612b76906001612772565b81548110612b8057fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b031681526020019081526020016000208881548110612bbe57fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf90915260409020805480612bf657fe5b60008281526020812060026000199093019283020181815560010155905560405133908290612c249061351f565b60006040518083038185875af1925050503d8060008114612c61576040519150601f19603f3d011682016040523d82523d6000602084013e612c66565b606091505b50508095505084612c895760405162461bcd60e51b8152600401610a7b90613da1565b336001600160a01b03167fbd5034ffbd47e4e72a94baa2cdb74c6fad73cb3bcdc13036b72ec8306f5a7646838584604051612cc693929190614136565b60405180910390a250505050505050565b6000610caf8261327e565b60d254612cee57610c77565b600080612d136202a300612d0d60ce544261277290919063ffffffff16565b90612772565b90505b60d25482108015612d3d57508060d28381548110612d3057fe5b9060005260206000200154105b15612d5457612d4d8260016123a8565b9150612d16565b81612d60575050610c77565b60005b60d254612d709084612772565b811015612dc35760d2612d8382856123a8565b81548110612d8d57fe5b906000526020600020015460d28281548110612da557fe5b600091825260209091200155612dbc8160016123a8565b9050612d63565b5060015b828111611eed5760d2805480612dd957fe5b60019003818190600052602060002001600090559055612e036001826123a890919063ffffffff16565b9050612dc7565b6000612e1530612249565b15905090565b60d2546000908190612e3257506000905080612f51565b60d25460cd546000918291600019909101908290612e519088906123a8565b90505b818411612f4557612e6a600261146d84876123a8565b92508060d28481548110612e7a57fe5b906000526020600020015411612f155760d254612e988460016123a8565b1480612ec457508060d2612ead8560016123a8565b81548110612eb757fe5b9060005260206000200154115b15612f0357600160d1600060d28681548110612edc57fe5b90600052602060002001548152602001908152602001600020549550955050505050612f51565b612f0e8360016123a8565b9350612f40565b82612f32576001670de0b6b3a76400009550955050505050612f51565b612f3d836001612772565b91505b612e54565b60008095509550505050505b915091565b612f5e611567565b15612f7b5760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b038316612fa15760405162461bcd60e51b8152600401610a7b906137b3565b6001600160a01b038216612fc75760405162461bcd60e51b8152600401610a7b90613bbc565b816001600160a01b0316836001600160a01b03161415612ff95760405162461bcd60e51b8152600401610a7b90613c6b565b6001600160a01b038316600090815260cb6020526040902054808211156130325760405162461bcd60e51b8152600401610a7b90613d6a565b600082116130525760405162461bcd60e51b8152600401610a7b90613b8f565b6001600160a01b038316600090815260cb60205260409020546130815760d55461307d9060016123a8565b60d5555b61308b8183612772565b6001600160a01b03808616600090815260cb602052604080822093909355908516815220546130ba90836123a8565b6001600160a01b03808516600090815260cb602052604080822093909355908616815220546130f55760d5546130f1906001612772565b60d5555b50505050565b600061167c836001600160a01b038416613282565b600061167c836001600160a01b0384166132cc565b815460009082106131485760405162461bcd60e51b8152600401610a7b9061368c565b82600001828154811061315757fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b600061318c611567565b156131a95760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b0383166131cf5760405162461bcd60e51b8152600401610a7b9061383e565b600082116131ef5760405162461bcd60e51b8152600401610a7b90613fa2565b6001600160a01b038316600090815260cb6020526040902054808311156132285760405162461bcd60e51b8152600401610a7b90613bf3565b60ca546132359084612772565b60ca556132428184612772565b6001600160a01b038516600090815260cb602052604090208190556132735760d55461326f906001612772565b60d5555b505060ca5492915050565b5490565b600061328e838361316a565b6132c457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610caf565b506000610caf565b6000818152600183016020526040812054801561338857835460001980830191908101906000908790839081106132ff57fe5b906000526020600020015490508087600001848154811061331c57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061334c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610caf565b6000915050610caf565b604051806040016040528060008152602001600081525090565b80356001600160a01b0381168114610caf57600080fd5b6000602082840312156133d4578081fd5b61167c83836133ac565b600080604083850312156133f0578081fd5b6133fa84846133ac565b915061340984602085016133ac565b90509250929050565b600080600060608486031215613426578081fd5b83356134318161415a565b925060208401356134418161415a565b929592945050506040919091013590565b60008060408385031215613464578182fd5b61346e84846133ac565b946020939093013593505050565b600080600060608486031215613490578283fd5b61349a85856133ac565b95602085013595506040909401359392505050565b6000602082840312156134c0578081fd5b5035919050565b600080604083850312156134d9578182fd5b8235915060208301356134eb8161415a565b809150509250929050565b60008060408385031215613508578182fd5b50508035926020909101359150565b815260200190565b90565b6001600160a01b0391909116815260200190565b60408082528351828201819052600091906020906060850190828801855b8281101561357957815180518552850151858501529285019290840190600101613554565b50505084810382860152809250855161359281836135d4565b93508287019150845b818110156135bc576135ae858451613517565b94509183019160010161359b565b5092979650505050505050565b901515815260200190565b90815260200190565b918252602082015260400190565b6000602080835283518082850152825b81811015613617578581018301518582016040015282016135fb565b818111156136285783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600f908201526e4d494e545f5a45524f5f56414c554560881b604082015260600190565b6020808252600b908201526a524f4c455f524553554d4560a81b604082015260600190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526021908201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436040820152604560f81b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600d908201526c524f4c455f574954484452415760981b604082015260600190565b6020808252601e908201527f5452414e534645525f46524f4d5f5448455f5a45524f5f414444524553530000604082015260600190565b60208082526012908201527144454641554c545f41444d494e5f524f4c4560701b604082015260600190565b6020808252600e908201526d135a5b9d1a5b99c81c185d5cd95960921b604082015260600190565b6020808252601a908201527f4255524e5f46524f4d5f5448455f5a45524f5f41444452455353000000000000604082015260600190565b60208082526018908201527f46726f6d20696e646578206f7574206f6620626f756e64730000000000000000604082015260600190565b60208082526017908201527f415050524f56455f544f5f5a45524f5f41444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c092dcecc2d8d2c840d2dcc8caf609b1b604082015260600190565b6020808252601e908201527f544f54414c5f504f4f4c45445f415641585f4341505f45584345454445440000604082015260600190565b602080825260139082015272524f4c455f4143435255455f5245574152445360681b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b6020808252818101527f556e6c6f636b2072657175657374206973206e6f742072656465656d61626c65604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f524f4c455f5345545f544f54414c5f504f4f4c45445f415641585f4341500000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526028908201527f546f20696e646578206d7573742062652067726561746572207468616e2066726040820152670deda40d2dcc8caf60c31b606082015260800190565b6020808252601390820152725452414e534645525f5a45524f5f56414c554560681b604082015260600190565b6020808252601c908201527f5452414e534645525f544f5f5448455f5a45524f5f4144445245535300000000604082015260600190565b6020808252601b908201527f4255524e5f414d4f554e545f455843454544535f42414c414e43450000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526010908201526f2a2920a729a322a92faa27afa9a2a62360811b604082015260600190565b6020808252600c908201526b16915493d7d1115413d4d25560a21b604082015260600190565b602080825260149082015273092dcecc2d8d2c840eadcd8dec6d640d2dcc8caf60631b604082015260600190565b60208082526017908201527f45786368616e67652072617465206e6f7420666f756e64000000000000000000604082015260600190565b6020808252600c908201526b1493d31157d1115413d4d25560a21b604082015260600190565b6020808252600a90820152695a65726f2076616c756560b01b604082015260600190565b6020808252601f908201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e434500604082015260600190565b60208082526014908201527310559056081d1c985b9cd9995c8819985a5b195960621b604082015260600190565b602080825260139082015272524f4c455f524553554d455f4d494e54494e4760681b604082015260600190565b60208082526017908201527f556e6c6f636b20616d6f756e7420746f6f206c61726765000000000000000000604082015260600190565b60208082526019908201527f4d696e74696e6720697320616c72656164792070617573656400000000000000604082015260600190565b6020808252601c908201527f496e76616c696420756e6c6f636b207265717565737420696e64657800000000604082015260600190565b60208082526019908201527f415050524f56455f46524f4d5f5a45524f5f4144445245535300000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cda185c994818dbdd5b9d606a1b604082015260600190565b602080825260159082015274125b9d985b1a59081d5b9b1bd8dac8185b5bdd5b9d605a1b604082015260600190565b60208082526018908201527f4d494e545f544f5f5448455f5a45524f5f414444524553530000000000000000604082015260600190565b60208082526019908201527f556e6c6f636b2072657175657374206973206578706972656400000000000000604082015260600190565b6020808252600f908201526e4255524e5f5a45524f5f56414c554560881b604082015260600190565b602080825260129082015271524f4c455f50415553455f4d494e54494e4760701b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601d908201527f556e6c6f636b2072657175657374206973206e6f742065787069726564000000604082015260600190565b6020808252600a9082015269524f4c455f504155534560b01b604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b602080825260159082015274496e76616c69642065786368616e6765207261746560581b604082015260600190565b602080825260159082015274135a5b9d1a5b99c81a5cc81b9bdd081c185d5cd959605a1b604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6001600160a01b038116811461416f57600080fd5b5056fea264697066735822122080c4b8398d3967fc1dc4314a40cc0cb71b1fc51b134aecdaf154d8a7b631fc4564736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106103a65760003560e01c8063629e8056116101e7578063c9d2ff9d1161010d578063dff69787116100a0578063f0d82e841161006f578063f0d82e84146109b8578063f1ee8d92146109d8578063f2ab8cd2146109f8578063fd012e3414610a26576103b6565b8063dff697871461094e578063e1a283d614610963578063e1a472b914610978578063e4a3011614610998576103b6565b8063d547741f116100dc578063d547741f146108d9578063da8fbf2a146108f9578063db006a751461090e578063dd62ed3e1461092e576103b6565b8063c9d2ff9d1461087c578063ca15c8731461089c578063d0e30db0146108bc578063d1f1ca04146108c4576103b6565b8063a217fddf11610185578063be040fb011610154578063be040fb01461081d578063c1db658814610832578063c2d7865414610847578063c423f9a81461085c576103b6565b8063a217fddf146107b3578063a9059cbb146107c8578063a905ff93146107e8578063ada03b38146107fd576103b6565b80638456cb59116101c15780638456cb591461073c5780639010d07c1461075157806391d148541461077e57806395d89b411461079e576103b6565b8063629e8056146106e757806370a08231146106fc57806380ea3de11461071c576103b6565b80632f2ff15d116102cc5780634a36d6c11161026a5780635bcb2fc6116102395780635bcb2fc6146106955780635c975abb1461069d5780635cd47487146106b25780635d039525146106c7576103b6565b80634a36d6c1146106365780634b7e23dc146106565780634ff0241a1461066b57806359ae340e14610680576103b6565b80633a98ef39116102a65780633a98ef39146105e25780633fc777b3146105f757806340a233a61461060c5780634757c0d214610621576103b6565b80632f2ff15d14610580578063313ce567146105a057806336568abe146105c2576103b6565b80630f7e2048116103445780631b2b3a2f116103135780631b2b3a2f1461050057806323b872dd14610520578063248a9ca3146105405780632e1a7d4d14610560576103b6565b80630f7e2048146104965780631610247b146104b657806318160ddd146104d65780631ab8ab25146104eb576103b6565b806306fdde031161038057806306fdde0314610412578063095ea7b3146104345780630a732ce6146104615780630d10d32c14610481576103b6565b806301550f64146103bb57806304646a49146103d2578063046f7da2146103fd576103b6565b366103b6576103b3610a54565b50005b600080fd5b3480156103c757600080fd5b506103d0610b63565b005b3480156103de57600080fd5b506103e7610c23565b6040516103f491906135d4565b60405180910390f35b34801561040957600080fd5b506103d0610c29565b34801561041e57600080fd5b50610427610c79565b6040516103f491906135eb565b34801561044057600080fd5b5061045461044f366004613452565b610c9e565b6040516103f491906135c9565b34801561046d57600080fd5b506103e761047c3660046134af565b610cb5565b34801561048d57600080fd5b506103d0610cc7565b3480156104a257600080fd5b506103d06104b13660046134af565b610f11565b3480156104c257600080fd5b506103d06104d13660046134af565b611127565b3480156104e257600080fd5b506103e7611158565b3480156104f757600080fd5b506103e761115e565b34801561050c57600080fd5b506103e761051b3660046134af565b611182565b34801561052c57600080fd5b5061045461053b366004613412565b6111a0565b34801561054c57600080fd5b506103e761055b3660046134af565b61120e565b34801561056c57600080fd5b506103d061057b3660046134af565b611226565b34801561058c57600080fd5b506103d061059b3660046134c7565b61135a565b3480156105ac57600080fd5b506105b56113a2565b6040516103f4919061414c565b3480156105ce57600080fd5b506103d06105dd3660046134c7565b6113a7565b3480156105ee57600080fd5b506103e76113e9565b34801561060357600080fd5b506103e76113ef565b34801561061857600080fd5b506103e7611413565b34801561062d57600080fd5b506103e7611419565b34801561064257600080fd5b506103e76106513660046134af565b61143d565b34801561066257600080fd5b506103e7611473565b34801561067757600080fd5b506103e7611497565b34801561068c57600080fd5b506103d06114bb565b6103e7610a54565b3480156106a957600080fd5b50610454611567565b3480156106be57600080fd5b506103e7611570565b3480156106d357600080fd5b506103e76106e23660046133c3565b611576565b3480156106f357600080fd5b506103e7611588565b34801561070857600080fd5b506103e76107173660046133c3565b61158e565b34801561072857600080fd5b506103d06107373660046134af565b6115a9565b34801561074857600080fd5b506103d0611616565b34801561075d57600080fd5b5061077161076c3660046134f6565b611664565b6040516103f49190613522565b34801561078a57600080fd5b506104546107993660046134c7565b611683565b3480156107aa57600080fd5b5061042761169b565b3480156107bf57600080fd5b506103e76116ba565b3480156107d457600080fd5b506104546107e3366004613452565b6116bf565b3480156107f457600080fd5b506103e76116cc565b34801561080957600080fd5b506103d06108183660046134af565b6116f0565b34801561082957600080fd5b506103d0611770565b34801561083e57600080fd5b506103e761183e565b34801561085357600080fd5b506103e7611862565b34801561086857600080fd5b506103e76108773660046133c3565b611886565b34801561088857600080fd5b506103d06108973660046134af565b6118a1565b3480156108a857600080fd5b506103e76108b73660046134af565b6119f7565b6103d0611a0e565b3480156108d057600080fd5b506103d0611ab7565b3480156108e557600080fd5b506103d06108f43660046134c7565b611b3d565b34801561090557600080fd5b506103d0611b77565b34801561091a57600080fd5b506103d06109293660046134af565b611c1d565b34801561093a57600080fd5b506103e76109493660046133de565b611c4e565b34801561095a57600080fd5b506103e7611c79565b34801561096f57600080fd5b50610454611c7f565b34801561098457600080fd5b506103d06109933660046134af565b611c88565b3480156109a457600080fd5b506103d06109b33660046134f6565b611da0565b3480156109c457600080fd5b506103d06109d33660046134af565b611ef2565b3480156109e457600080fd5b506103e76109f33660046134af565b611f53565b348015610a0457600080fd5b50610a18610a1336600461347c565b611fa7565b6040516103f4929190613536565b348015610a3257600080fd5b50610a46610a41366004613452565b612210565b6040516103f49291906135dd565b6000610a5e611567565b15610a845760405162461bcd60e51b8152600401610a7b90613a98565b60405180910390fd5b333480610aa35760405162461bcd60e51b8152600401610a7b90613c95565b6000610aae82611f53565b905080610ab85750805b610ac2838261224f565b5060c954610ad090836123a8565b60c9556040516001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b119085906135d4565b60405180910390a3826001600160a01b03167fbb0070894135d02edfa550b04d7e5e141aa8090b46e57597ad45bfedd65544988383604051610b549291906135dd565b60405180910390a29250505090565b60026065541415610b865760405162461bcd60e51b8152600401610a7b90613ff7565b600260655560005b33600090815260cf6020526040902054811015610c1b5733600090815260cf602052604090208054610bf7919083908110610bc557fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250506123cd565b610c0d57610c068160016123a8565b9050610b8e565b610c16816123e8565b610b8e565b506001606555565b60cd5481565b610c537f042c6cf123ef505aa22225497dce2119e438d03e616dea9958b9e78a7d2c9bfd33611683565b610c6f5760405162461bcd60e51b8152600401610a7b90613667565b610c7761260e565b565b60408051808201909152600b81526a0a6e8c2d6cac84082ac82b60ab1b602082015290565b6000610cab338484612672565b5060015b92915050565b60d16020526000908152604090205481565b60026065541415610cea5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610cf7611567565b15610d145760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf6020526040812054815b81811015610e8657610d36613392565b33600090815260cf60205260409020805483908110610d5157fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050610d898161274b565b610da057610d988260016123a8565b915050610d26565b6020810151610db09085906123a8565b33600090815260cf60205260409020805491955090610dd0906001612772565b81548110610dda57fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b031681526020019081526020016000208381548110610e1857fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf90915260409020805480610e5057fe5b6000828152602081206002600019909301928302018181556001908101919091559155610e7e908490612772565b925050610d26565b8215610f075733600090815260d06020526040902054610ea69084612772565b33600081815260d06020526040902091909155610ec59030908561279a565b336001600160a01b03167feaca243f6502ade1b9ea0909306c290366d6ea6778ca407ca4415c4a0f45e35384604051610efe91906135d4565b60405180910390a25b5050600160655550565b60026065541415610f345760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610f41611567565b15610f5e5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf60205260409020548110610f8c5760405162461bcd60e51b8152600401610a7b90613cbb565b610f94613392565b33600090815260cf60205260409020805483908110610faf57fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050610fe78161274b565b6110035760405162461bcd60e51b8152600401610a7b9061402e565b60208082015133600090815260d09092526040909120546110249082612772565b33600090815260d0602090815260408083209390935560cf9052208054600019810190811061104f57fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b03168152602001908152602001600020848154811061108d57fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf909152604090208054806110c557fe5b6000828152602081206002600019909301928302018181556001015590556110ee30338361279a565b336001600160a01b03167feaca243f6502ade1b9ea0909306c290366d6ea6778ca407ca4415c4a0f45e35382604051610efe91906135d4565b6002606554141561114a5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610c1b816123e8565b60ca5490565b7fcdf8b82f637f9a4be48302312e5512748fdc83ce33bdd13a07588c9a48f40d0881565b60d2818154811061118f57fe5b600091825260209091200154905081565b6001600160a01b038316600090815260cc60209081526040808320338452909152812054828110156111e45760405162461bcd60e51b8152600401610a7b906136ce565b6111ef85858561279a565b61120385336111fe8487612772565b612672565b506001949350505050565b6000818152603360205260409020600201545b919050565b600260655414156112495760405162461bcd60e51b8152600401610a7b90613ff7565b60026065556112787f0f9dd4db10c87ffcc337f44200a5df16e545591d09c12f63c158b3d592fcf18833611683565b6112945760405162461bcd60e51b8152600401610a7b9061378c565b6000336001600160a01b0316826040516112ad9061351f565b60006040518083038185875af1925050503d80600081146112ea576040519150601f19603f3d011682016040523d82523d6000602084013e6112ef565b606091505b50509050806113105760405162461bcd60e51b8152600401610a7b90613da1565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243648360405161134991906135d4565b60405180910390a250506001606555565b600082815260336020526040902060020154611378906107996127e8565b6113945760405162461bcd60e51b8152600401610a7b9061370f565b61139e82826127ec565b5050565b601290565b6113af6127e8565b6001600160a01b0316816001600160a01b0316146113df5760405162461bcd60e51b8152600401610a7b90614089565b61139e8282612855565b60ca5481565b7feaf074586bf6c7ac16d3c4db5c992c7f0721b20b018b99a7d1fe8187f59d9c8681565b60ce5481565b7f7507d5b6f482d6f276fc3788841416ce1f32150a93658622625d5b91ccda3d7881565b600060ca546000141561145257506000611221565b610caf60ca5461146d60c954856128be90919063ffffffff16565b906128f8565b7f0f9dd4db10c87ffcc337f44200a5df16e545591d09c12f63c158b3d592fcf18881565b7ff146182d150a5b368b6d283f87aeae1f25c21b02ff55cf16848704ade176a5cb81565b6114e57fcdf8b82f637f9a4be48302312e5512748fdc83ce33bdd13a07588c9a48f40d0833611683565b6115015760405162461bcd60e51b8152600401610a7b90613dcf565b60d35460ff166115235760405162461bcd60e51b8152600401610a7b90614107565b60d3805460ff191690556040517f8a53acd29b3c02ba82b89c57b23196b792ccb00a28515221f71bd92eafbc2dc39061155d903390613522565b60405180910390a1565b60975460ff1690565b60d45481565b60d06020526000908152604090205481565b60c95481565b6001600160a01b0316600090815260cb602052604090205490565b6115b4600033611683565b6115d05760405162461bcd60e51b8152600401610a7b906137ea565b60cd8054908290556040517f98eaabfe135a9c40c420208962bf81e7926b4d6df3e23502164c0554b7b352249061160a90839085906135dd565b60405180910390a15050565b6116407ff146182d150a5b368b6d283f87aeae1f25c21b02ff55cf16848704ade176a5cb33611683565b61165c5760405162461bcd60e51b8152600401610a7b90614065565b610c7761292a565b600082815260336020526040812061167c9083612985565b9392505050565b600082815260336020526040812061167c9083612991565b6040805180820190915260058152640e682ac82b60db1b602082015290565b600081565b6000610cab33848461279a565b7f47b922604560255f6e7d9ac32bd55d2b112af12fac29e9cbbcef77fe82ffbd9381565b61171a7f7507d5b6f482d6f276fc3788841416ce1f32150a93658622625d5b91ccda3d7833611683565b6117365760405162461bcd60e51b8152600401610a7b90613ac2565b60d48054908290556040517fc016457d0a92973d26bab98d68d6f20133e355c467d05e5206c88c25d3b739d09061160a90839085906135dd565b600260655414156117935760405162461bcd60e51b8152600401610a7b90613ff7565b600260655533600090815260cf6020526040812054905b818110156118355733600090815260cf6020526040902080546118049190839081106117d257fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250506129a6565b61181a576118138160016123a8565b90506117aa565b611823816129d9565b61182e826001612772565b91506117aa565b50506001606555565b7f042c6cf123ef505aa22225497dce2119e438d03e616dea9958b9e78a7d2c9bfd81565b7fa9905b3f34c6e7b8ac62a407ded9f3069ef096a2e251318e09aff6898263df1981565b6001600160a01b0316600090815260cf602052604090205490565b600260655414156118c45760405162461bcd60e51b8152600401610a7b90613ff7565b60026065556118d1611567565b156118ee5760405162461bcd60e51b8152600401610a7b90613a98565b6000811161190e5760405162461bcd60e51b8152600401610a7b90613f05565b33600090815260cb602052604090205481111561193d5760405162461bcd60e51b8152600401610a7b90613dfc565b33600090815260d0602052604090205461195790826123a8565b33600081815260d0602052604090209190915561197590308361279a565b33600081815260cf602090815260408083208151808301835242815280840187815282546001818101855593875294909520905160029094020192835592519190920155517fd843ce9ef55b27026be6c5e44e9f58097e0ebfa0d9d2d5823cb8ffa779585170906119e79084906135d4565b60405180910390a2506001606555565b6000818152603360205260408120610caf90612cd7565b611a387fa9905b3f34c6e7b8ac62a407ded9f3069ef096a2e251318e09aff6898263df1933611683565b611a545760405162461bcd60e51b8152600401610a7b90613d20565b60003411611a745760405162461bcd60e51b8152600401610a7b90613d46565b336001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c34604051611aad91906135d4565b60405180910390a2565b60026065541415611ada5760405162461bcd60e51b8152600401610a7b90613ff7565b600260655560005b33600090815260cf6020526040902054811015610c1b5733600090815260cf602052604090208054611b199190839081106117d257fe5b611b2f57611b288160016123a8565b9050611ae2565b611b38816123e8565b611ae2565b600082815260336020526040902060020154611b5b906107996127e8565b6113df5760405162461bcd60e51b8152600401610a7b90613a13565b611ba17feaf074586bf6c7ac16d3c4db5c992c7f0721b20b018b99a7d1fe8187f59d9c8633611683565b611bbd5760405162461bcd60e51b8152600401610a7b90613fcb565b60d35460ff1615611be05760405162461bcd60e51b8152600401610a7b90613e33565b60d3805460ff191660011790556040517f35365f539a67058ad0735a24a50fe45b0ee05207919e9f4a2f60d855f55e0c0e9061155d903390613522565b60026065541415611c405760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555610c1b816129d9565b6001600160a01b03918216600090815260cc6020908152604080832093909416825291909152205490565b60d55481565b60d35460ff1681565b60026065541415611cab5760405162461bcd60e51b8152600401610a7b90613ff7565b6002606555611cda7f47b922604560255f6e7d9ac32bd55d2b112af12fac29e9cbbcef77fe82ffbd9333611683565b611cf65760405162461bcd60e51b8152600401610a7b90613978565b60c954611d0390826123a8565b60c955611d0e612ce2565b611d1f670de0b6b3a764000061143d565b42600081815260d160205260408082209390935560d2805460018101825591527ff2192e1030363415d7b4fb0406540a0060e8e2fc8982f3f32289379e11fa65460155517f8fbf6a230d02fb8f41af8c1ca90b126472e11286c47d7ed86bb2e1fc51a283d890611d909083906135d4565b60405180910390a1506001606555565b600054610100900460ff1680611db95750611db9612e0a565b80611dc7575060005460ff16155b611de35760405162461bcd60e51b8152600401610a7b90613af9565b600054610100900460ff16158015611e0e576000805460ff1961ff0019909116610100171660011790555b611e19600033611394565b60cd8390556040517f98eaabfe135a9c40c420208962bf81e7926b4d6df3e23502164c0554b7b3522490611e519060009086906135dd565b60405180910390a160ce8290556040517f13cca15637be33d4651625caf09528168b20c132463c69ab5c0ff48b3e63911790611e919060009085906135dd565b60405180910390a160001960d48190556040517fc016457d0a92973d26bab98d68d6f20133e355c467d05e5206c88c25d3b739d091611ed391600091906135dd565b60405180910390a18015611eed576000805461ff00191690555b505050565b611efd600033611683565b611f195760405162461bcd60e51b8152600401610a7b906137ea565b60ce8054908290556040517f13cca15637be33d4651625caf09528168b20c132463c69ab5c0ff48b3e6391179061160a90839085906135dd565b600060c95460001415611f6857506000611221565b6000611f8560c95461146d60ca54866128be90919063ffffffff16565b905060008111610caf5760405162461bcd60e51b8152600401610a7b90613ed8565b6001600160a01b038316600090815260cf602052604090205460609081908410611fe35760405162461bcd60e51b8152600401610a7b90613875565b8284106120025760405162461bcd60e51b8152600401610a7b90613b47565b6001600160a01b038516600090815260cf602052604090205483111561203e576001600160a01b038516600090815260cf602052604090205492505b606061204a8486612772565b67ffffffffffffffff8111801561206057600080fd5b5060405190808252806020026020018201604052801561209a57816020015b612087613392565b81526020019060019003908161207f5790505b50905060606120a98587612772565b67ffffffffffffffff811180156120bf57600080fd5b506040519080825280602002602001820160405280156120e9578160200160208202803683370190505b50905060005b6120f98688612772565b811015612203576001600160a01b038816600090815260cf6020526040902061212288836123a8565b8154811061212c57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505083828151811061216557fe5b602002602001018190525061218c83828151811061217f57fe5b60200260200101516129a6565b156121f1576000806121b48584815181106121a357fe5b602002602001015160000151612e1b565b91509150816121d55760405162461bcd60e51b8152600401610a7b90613ce9565b808484815181106121e257fe5b60200260200101818152505050505b6121fc8160016123a8565b90506120ef565b5090969095509350505050565b60cf602052816000526040600020818154811061222957fe5b600091825260209091206002909102018054600190910154909250905082565b3b151590565b6000612259611567565b156122765760405162461bcd60e51b8152600401610a7b90613a98565b60d35460ff16156122995760405162461bcd60e51b8152600401610a7b90613816565b6001600160a01b0383166122bf5760405162461bcd60e51b8152600401610a7b90613f34565b600082116122df5760405162461bcd60e51b8152600401610a7b9061363e565b60006122ea8361143d565b905060d4546123048260c9546123a890919063ffffffff16565b11156123225760405162461bcd60e51b8152600401610a7b90613941565b6001600160a01b038416600090815260cb60205260409020546123515760d55461234d9060016123a8565b60d5555b60ca5461235e90846123a8565b60ca556001600160a01b038416600090815260cb602052604090205461238490846123a8565b6001600160a01b038516600090815260cb6020526040902055505060ca5492915050565b60008282018381101561167c5760405162461bcd60e51b8152600401610a7b906138e3565b60cd54815160009142916123e0916123a8565b101592915050565b6123f0611567565b1561240d5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf6020526040902054811061243b5760405162461bcd60e51b8152600401610a7b9061391a565b612443613392565b33600090815260cf6020526040902080548390811061245e57fe5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505090506124968161274b565b156124b35760405162461bcd60e51b8152600401610a7b90613f6b565b602080820151825133600090815260cf9093526040909220549091906000190184146125555733600090815260cf60205260409020805460001981019081106124f857fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b03168152602001908152602001600020858154811061253657fe5b6000918252602090912082546002909202019081556001918201549101555b33600090815260cf6020526040902080548061256d57fe5b600082815260208082206002600019909401938402018281556001018290559190925533825260d0905260409020546125a69083612772565b33600081815260d060205260409020919091556125c59030908461279a565b336001600160a01b03167f7e4a9502fd577f76f1dc8c9c8f63196816f7c1bd73c6db99f888e8d7bb2f899882846040516126009291906135dd565b60405180910390a250505050565b612616611567565b6126325760405162461bcd60e51b8152600401610a7b9061375e565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126656127e8565b60405161155d9190613522565b61267a611567565b156126975760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b0383166126bd5760405162461bcd60e51b8152600401610a7b90613ea1565b6001600160a01b0382166126e35760405162461bcd60e51b8152600401610a7b906138ac565b6001600160a01b03808416600081815260cc602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061273e9085906135d4565b60405180910390a3505050565b60ce5460cd548251600092429261276b92612765916123a8565b906123a8565b1092915050565b6000828211156127945760405162461bcd60e51b8152600401610a7b906139a5565b50900390565b6127a5838383612f56565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161273e91906135d4565b3390565b600082815260336020526040902061280490826130fb565b1561139e576128116127e8565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260336020526040902061286d9082613110565b1561139e5761287a6127e8565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000826128cd57506000610caf565b828202828482816128da57fe5b041461167c5760405162461bcd60e51b8152600401610a7b90613c2a565b60008082116129195760405162461bcd60e51b8152600401610a7b906139dc565b81838161292257fe5b049392505050565b612932611567565b1561294f5760405162461bcd60e51b8152600401610a7b90613a98565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126656127e8565b600061167c8383613125565b600061167c836001600160a01b03841661316a565b60006129b1826123cd565b158015610caf5750426123e060ce5461276560cd5486600001516123a890919063ffffffff16565b6129e1611567565b156129fe5760405162461bcd60e51b8152600401610a7b90613a98565b33600090815260cf60205260409020548110612a2c5760405162461bcd60e51b8152600401610a7b90613e6a565b612a34613392565b33600090815260cf60205260409020805483908110612a4f57fe5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050612a87816129a6565b612aa35760405162461bcd60e51b8152600401610a7b90613a63565b600080612ab38360000151612e1b565b9150915081612ad45760405162461bcd60e51b8152600401610a7b90613ce9565b602083015183516000612af3670de0b6b3a764000061146d86866128be565b905082811015612b155760405162461bcd60e51b8152600401610a7b906140d8565b33600090815260d06020526040902054612b2f9084612772565b33600090815260d06020526040902055612b493084613182565b5060c954612b579082612772565b60c95533600090815260cf602052604090208054612b76906001612772565b81548110612b8057fe5b906000526020600020906002020160cf6000336001600160a01b03166001600160a01b031681526020019081526020016000208881548110612bbe57fe5b600091825260208083208454600290930201918255600193840154939091019290925533815260cf90915260409020805480612bf657fe5b60008281526020812060026000199093019283020181815560010155905560405133908290612c249061351f565b60006040518083038185875af1925050503d8060008114612c61576040519150601f19603f3d011682016040523d82523d6000602084013e612c66565b606091505b50508095505084612c895760405162461bcd60e51b8152600401610a7b90613da1565b336001600160a01b03167fbd5034ffbd47e4e72a94baa2cdb74c6fad73cb3bcdc13036b72ec8306f5a7646838584604051612cc693929190614136565b60405180910390a250505050505050565b6000610caf8261327e565b60d254612cee57610c77565b600080612d136202a300612d0d60ce544261277290919063ffffffff16565b90612772565b90505b60d25482108015612d3d57508060d28381548110612d3057fe5b9060005260206000200154105b15612d5457612d4d8260016123a8565b9150612d16565b81612d60575050610c77565b60005b60d254612d709084612772565b811015612dc35760d2612d8382856123a8565b81548110612d8d57fe5b906000526020600020015460d28281548110612da557fe5b600091825260209091200155612dbc8160016123a8565b9050612d63565b5060015b828111611eed5760d2805480612dd957fe5b60019003818190600052602060002001600090559055612e036001826123a890919063ffffffff16565b9050612dc7565b6000612e1530612249565b15905090565b60d2546000908190612e3257506000905080612f51565b60d25460cd546000918291600019909101908290612e519088906123a8565b90505b818411612f4557612e6a600261146d84876123a8565b92508060d28481548110612e7a57fe5b906000526020600020015411612f155760d254612e988460016123a8565b1480612ec457508060d2612ead8560016123a8565b81548110612eb757fe5b9060005260206000200154115b15612f0357600160d1600060d28681548110612edc57fe5b90600052602060002001548152602001908152602001600020549550955050505050612f51565b612f0e8360016123a8565b9350612f40565b82612f32576001670de0b6b3a76400009550955050505050612f51565b612f3d836001612772565b91505b612e54565b60008095509550505050505b915091565b612f5e611567565b15612f7b5760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b038316612fa15760405162461bcd60e51b8152600401610a7b906137b3565b6001600160a01b038216612fc75760405162461bcd60e51b8152600401610a7b90613bbc565b816001600160a01b0316836001600160a01b03161415612ff95760405162461bcd60e51b8152600401610a7b90613c6b565b6001600160a01b038316600090815260cb6020526040902054808211156130325760405162461bcd60e51b8152600401610a7b90613d6a565b600082116130525760405162461bcd60e51b8152600401610a7b90613b8f565b6001600160a01b038316600090815260cb60205260409020546130815760d55461307d9060016123a8565b60d5555b61308b8183612772565b6001600160a01b03808616600090815260cb602052604080822093909355908516815220546130ba90836123a8565b6001600160a01b03808516600090815260cb602052604080822093909355908616815220546130f55760d5546130f1906001612772565b60d5555b50505050565b600061167c836001600160a01b038416613282565b600061167c836001600160a01b0384166132cc565b815460009082106131485760405162461bcd60e51b8152600401610a7b9061368c565b82600001828154811061315757fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b600061318c611567565b156131a95760405162461bcd60e51b8152600401610a7b90613a98565b6001600160a01b0383166131cf5760405162461bcd60e51b8152600401610a7b9061383e565b600082116131ef5760405162461bcd60e51b8152600401610a7b90613fa2565b6001600160a01b038316600090815260cb6020526040902054808311156132285760405162461bcd60e51b8152600401610a7b90613bf3565b60ca546132359084612772565b60ca556132428184612772565b6001600160a01b038516600090815260cb602052604090208190556132735760d55461326f906001612772565b60d5555b505060ca5492915050565b5490565b600061328e838361316a565b6132c457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610caf565b506000610caf565b6000818152600183016020526040812054801561338857835460001980830191908101906000908790839081106132ff57fe5b906000526020600020015490508087600001848154811061331c57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061334c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610caf565b6000915050610caf565b604051806040016040528060008152602001600081525090565b80356001600160a01b0381168114610caf57600080fd5b6000602082840312156133d4578081fd5b61167c83836133ac565b600080604083850312156133f0578081fd5b6133fa84846133ac565b915061340984602085016133ac565b90509250929050565b600080600060608486031215613426578081fd5b83356134318161415a565b925060208401356134418161415a565b929592945050506040919091013590565b60008060408385031215613464578182fd5b61346e84846133ac565b946020939093013593505050565b600080600060608486031215613490578283fd5b61349a85856133ac565b95602085013595506040909401359392505050565b6000602082840312156134c0578081fd5b5035919050565b600080604083850312156134d9578182fd5b8235915060208301356134eb8161415a565b809150509250929050565b60008060408385031215613508578182fd5b50508035926020909101359150565b815260200190565b90565b6001600160a01b0391909116815260200190565b60408082528351828201819052600091906020906060850190828801855b8281101561357957815180518552850151858501529285019290840190600101613554565b50505084810382860152809250855161359281836135d4565b93508287019150845b818110156135bc576135ae858451613517565b94509183019160010161359b565b5092979650505050505050565b901515815260200190565b90815260200190565b918252602082015260400190565b6000602080835283518082850152825b81811015613617578581018301518582016040015282016135fb565b818111156136285783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600f908201526e4d494e545f5a45524f5f56414c554560881b604082015260600190565b6020808252600b908201526a524f4c455f524553554d4560a81b604082015260600190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526021908201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436040820152604560f81b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252600d908201526c524f4c455f574954484452415760981b604082015260600190565b6020808252601e908201527f5452414e534645525f46524f4d5f5448455f5a45524f5f414444524553530000604082015260600190565b60208082526012908201527144454641554c545f41444d494e5f524f4c4560701b604082015260600190565b6020808252600e908201526d135a5b9d1a5b99c81c185d5cd95960921b604082015260600190565b6020808252601a908201527f4255524e5f46524f4d5f5448455f5a45524f5f41444452455353000000000000604082015260600190565b60208082526018908201527f46726f6d20696e646578206f7574206f6620626f756e64730000000000000000604082015260600190565b60208082526017908201527f415050524f56455f544f5f5a45524f5f41444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c092dcecc2d8d2c840d2dcc8caf609b1b604082015260600190565b6020808252601e908201527f544f54414c5f504f4f4c45445f415641585f4341505f45584345454445440000604082015260600190565b602080825260139082015272524f4c455f4143435255455f5245574152445360681b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b6020808252818101527f556e6c6f636b2072657175657374206973206e6f742072656465656d61626c65604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f524f4c455f5345545f544f54414c5f504f4f4c45445f415641585f4341500000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526028908201527f546f20696e646578206d7573742062652067726561746572207468616e2066726040820152670deda40d2dcc8caf60c31b606082015260800190565b6020808252601390820152725452414e534645525f5a45524f5f56414c554560681b604082015260600190565b6020808252601c908201527f5452414e534645525f544f5f5448455f5a45524f5f4144445245535300000000604082015260600190565b6020808252601b908201527f4255524e5f414d4f554e545f455843454544535f42414c414e43450000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526010908201526f2a2920a729a322a92faa27afa9a2a62360811b604082015260600190565b6020808252600c908201526b16915493d7d1115413d4d25560a21b604082015260600190565b602080825260149082015273092dcecc2d8d2c840eadcd8dec6d640d2dcc8caf60631b604082015260600190565b60208082526017908201527f45786368616e67652072617465206e6f7420666f756e64000000000000000000604082015260600190565b6020808252600c908201526b1493d31157d1115413d4d25560a21b604082015260600190565b6020808252600a90820152695a65726f2076616c756560b01b604082015260600190565b6020808252601f908201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e434500604082015260600190565b60208082526014908201527310559056081d1c985b9cd9995c8819985a5b195960621b604082015260600190565b602080825260139082015272524f4c455f524553554d455f4d494e54494e4760681b604082015260600190565b60208082526017908201527f556e6c6f636b20616d6f756e7420746f6f206c61726765000000000000000000604082015260600190565b60208082526019908201527f4d696e74696e6720697320616c72656164792070617573656400000000000000604082015260600190565b6020808252601c908201527f496e76616c696420756e6c6f636b207265717565737420696e64657800000000604082015260600190565b60208082526019908201527f415050524f56455f46524f4d5f5a45524f5f4144445245535300000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cda185c994818dbdd5b9d606a1b604082015260600190565b602080825260159082015274125b9d985b1a59081d5b9b1bd8dac8185b5bdd5b9d605a1b604082015260600190565b60208082526018908201527f4d494e545f544f5f5448455f5a45524f5f414444524553530000000000000000604082015260600190565b60208082526019908201527f556e6c6f636b2072657175657374206973206578706972656400000000000000604082015260600190565b6020808252600f908201526e4255524e5f5a45524f5f56414c554560881b604082015260600190565b602080825260129082015271524f4c455f50415553455f4d494e54494e4760701b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601d908201527f556e6c6f636b2072657175657374206973206e6f742065787069726564000000604082015260600190565b6020808252600a9082015269524f4c455f504155534560b01b604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b602080825260159082015274496e76616c69642065786368616e6765207261746560581b604082015260600190565b602080825260159082015274135a5b9d1a5b99c81a5cc81b9bdd081c185d5cd959605a1b604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b6001600160a01b038116811461416f57600080fd5b5056fea264697066735822122080c4b8398d3967fc1dc4314a40cc0cb71b1fc51b134aecdaf154d8a7b631fc4564736f6c634300060c0033
Deployed Bytecode Sourcemap
46791:29207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61117:8;:6;:8::i;:::-;;46791:29207;;;;;56230:411;;;;;;;;;;;;;:::i;:::-;;1805:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75240:125;;;;;;;;;;;;;:::i;49583:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51762:158::-;;;;;;;;;;-1:-1:-1;51762:158:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2283:63::-;;;;;;;;;;-1:-1:-1;2283:63:0;;;;;:::i;:::-;;:::i;58289:1072::-;;;;;;;;;;;;;:::i;59515:812::-;;;;;;;;;;-1:-1:-1;59515:812:0;;;;;:::i;:::-;;:::i;57288:121::-;;;;;;;;;;-1:-1:-1;57288:121:0;;;;;:::i;:::-;;:::i;50097:96::-;;;;;;;;;;;;;:::i;778:78::-;;;;;;;;;;;;;:::i;2413:46::-;;;;;;;;;;-1:-1:-1;2413:46:0;;;;;:::i;:::-;;:::i;52593:399::-;;;;;;;;;;-1:-1:-1;52593:399:0;;;;;:::i;:::-;;:::i;40569:114::-;;;;;;;;;;-1:-1:-1;40569:114:0;;;;;:::i;:::-;;:::i;72990:297::-;;;;;;;;;;-1:-1:-1;72990:297:0;;;;;:::i;:::-;;:::i;40945:227::-;;;;;;;;;;-1:-1:-1;40945:227:0;;;;;:::i;:::-;;:::i;49944:76::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42154:209::-;;;;;;;;;;-1:-1:-1;42154:209:0;;;;;:::i;:::-;;:::i;1109:23::-;;;;;;;;;;;;;:::i;695:76::-;;;;;;;;;;;;;:::i;1933:24::-;;;;;;;;;;;;;:::i;863:100::-;;;;;;;;;;;;;:::i;53531:220::-;;;;;;;;;;-1:-1:-1;53531:220:0;;;;;:::i;:::-;;:::i;330:66::-;;;;;;;;;;;;;:::i;403:60::-;;;;;;;;;;;;;:::i;75736:259::-;;;;;;;;;;;;;:::i;60489:582::-;;;:::i;24935:86::-;;;;;;;;;;;;;:::i;2609:30::-;;;;;;;;;;;;;:::i;2149:51::-;;;;;;;;;;-1:-1:-1;2149:51:0;;;;;:::i;:::-;;:::i;1032:27::-;;;;;;;;;;;;;:::i;50286:113::-;;;;;;;;;;-1:-1:-1;50286:113:0;;;;;:::i;:::-;;:::i;73712:320::-;;;;;;;;;;-1:-1:-1;73712:320:0;;;;;:::i;:::-;;:::i;75047:120::-;;;;;;;;;;;;;:::i;40242:138::-;;;;;;;;;;-1:-1:-1;40242:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39203:139::-;;;;;;;;;;-1:-1:-1;39203:139:0;;;;;:::i;:::-;;:::i;49741:87::-;;;;;;;;;;;;;:::i;37948:49::-;;;;;;;;;;;;;:::i;50829:164::-;;;;;;;;;;-1:-1:-1;50829:164:0;;;;;:::i;:::-;;:::i;539:78::-;;;;;;;;;;;;;:::i;74593:383::-;;;;;;;;;;-1:-1:-1;74593:383:0;;;;;:::i;:::-;;:::i;57495:443::-;;;;;;;;;;;;;:::i;470:62::-;;;;;;;;;;;;;:::i;624:64::-;;;;;;;;;;;;;:::i;54594:131::-;;;;;;;;;;-1:-1:-1;54594:131:0;;;;;:::i;:::-;;:::i;53902:568::-;;;;;;;;;;-1:-1:-1;53902:568:0;;;;;:::i;:::-;;:::i;39516:127::-;;;;;;;;;;-1:-1:-1;39516:127:0;;;;;:::i;:::-;;:::i;73382:208::-;;;:::i;56731:416::-;;;;;;;;;;;;;:::i;41417:230::-;;;;;;;;;;-1:-1:-1;41417:230:0;;;;;:::i;:::-;;:::i;75420:259::-;;;;;;;;;;;;;:::i;58091:95::-;;;;;;;;;;-1:-1:-1;58091:95:0;;;;;:::i;:::-;;:::i;51263:139::-;;;;;;;;;;-1:-1:-1;51263:139:0;;;;;:::i;:::-;;:::i;2691:23::-;;;;;;;;;;;;;:::i;2507:25::-;;;;;;;;;;;;;:::i;72403:449::-;;;;;;;;;;-1:-1:-1;72403:449:0;;;;;:::i;:::-;;:::i;49074:444::-;;;;;;;;;;-1:-1:-1;49074:444:0;;;;;:::i;:::-;;:::i;74148:302::-;;;;;;;;;;-1:-1:-1;74148:302:0;;;;;:::i;:::-;;:::i;53114:308::-;;;;;;;;;;-1:-1:-1;53114:308:0;;;;;:::i;:::-;;:::i;54923:1190::-;;;;;;;;;;-1:-1:-1;54923:1190:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2022:61::-;;;;;;;;;;-1:-1:-1;2022:61:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;60489:582::-;60545:4;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;;;;;;;;;60579:10:::1;60615:9;60645:12:::0;60637:37:::1;;;;-1:-1:-1::0;;;60637:37:0::1;;;;;;;:::i;:::-;60687:16;60706:30;60728:7;60706:21;:30::i;:::-;60687:49:::0;-1:-1:-1;60751:16:0;60747:70:::1;;-1:-1:-1::0;60798:7:0;60747:70:::1;60829:32;60841:6;60849:11;60829;:32::i;:::-;-1:-1:-1::0;60890:15:0::1;::::0;:28:::1;::::0;60910:7;60890:19:::1;:28::i;:::-;60872:15;:46:::0;60936:41:::1;::::0;-1:-1:-1;;;;;60936:41:0;::::1;::::0;60953:1:::1;::::0;60936:41:::1;::::0;::::1;::::0;60965:11;;60936:41:::1;:::i;:::-;;;;;;;;61003:6;-1:-1:-1::0;;;;;60993:39:0::1;;61011:7;61020:11;60993:39;;;;;;;:::i;:::-;;;;;;;;61052:11:::0;-1:-1:-1;;;60489:582:0;:::o;56230:411::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;56302:16:::1;56329:305;56369:10;56350:30;::::0;;;:18:::1;:30;::::0;;;;:37;56336:51;::::1;56329:305;;;56452:10;56433:30;::::0;;;:18:::1;:30;::::0;;;;:43;;56409:68:::1;::::0;56433:30;56464:11;;56433:43;::::1;;;;;;;;;;;;;;;56409:68;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:23;:68::i;:::-;56404:169;;56512:18;:11:::0;56528:1:::1;56512:15;:18::i;:::-;56498:32;;56549:8;;56404:169;56589:33;56610:11;56589:20;:33::i;:::-;56329:305;;;-1:-1:-1::0;21177:1:0;22296:7;:22;56230:411::o;1805:26::-;;;;:::o;75240:125::-;75286:32;508:24;75307:10;75286:7;:32::i;:::-;75278:56;;;;-1:-1:-1;;;75278:56:0;;;;;;;:::i;:::-;75347:10;:8;:10::i;:::-;75240:125::o;49583:91::-;49646:20;;;;;;;;;;;;-1:-1:-1;;;49646:20:0;;;;49583:91;:::o;51762:158::-;51834:4;51851:37;51860:10;51872:7;51881:6;51851:8;:37::i;:::-;-1:-1:-1;51908:4:0;51762:158;;;;;:::o;2283:63::-;;;;;;;;;;;;;:::o;58289:1072::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;25261:8:::1;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1::0;;;25252:38:0::1;;;;;;;:::i;:::-;58445:10:::2;58367:23;58426:30:::0;;;:18:::2;:30;::::0;;;;:37;58367:23;58495:559:::2;58506:11;58502:1;:15;58495:559;;;58534:34;;:::i;:::-;58590:10;58571:30;::::0;;;:18:::2;:30;::::0;;;;:33;;58602:1;;58571:33;::::2;;;;;;;;;;;;;;;58534:70;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;58626:25;58637:13;58626:10;:25::i;:::-;58621:106;;58676:8;:1:::0;58682::::2;58676:5;:8::i;:::-;58672:12;;58703:8;;;58621:106;58787:25;::::0;::::2;::::0;58764:49:::2;::::0;:18;;:22:::2;:49::i;:::-;58885:10;58866:30;::::0;;;:18:::2;:30;::::0;;;;58897:37;;58743:70;;-1:-1:-1;58866:30:0;58897:44:::2;::::0;58939:1:::2;58897:41;:44::i;:::-;58866:76;;;;;;;;;;;;;;;;;;58830:18;:30;58849:10;-1:-1:-1::0;;;;;58830:30:0::2;-1:-1:-1::0;;;;;58830:30:0::2;;;;;;;;;;;;58861:1;58830:33;;;;;;;;;::::0;;;::::2;::::0;;;:112;;:33:::2;::::0;;::::2;;:112:::0;;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;;58976:10:::2;58957:30:::0;;:18:::2;:30:::0;;;;;;:36;;;::::2;;;;;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;58957:36:0;;;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;;;;;59024:18:::2;::::0;:11;;:15:::2;:18::i;:::-;59010:32;;58495:559;;;;59070:22:::0;;59066:288:::2;;59163:10;59143:31;::::0;;;:19:::2;:31;::::0;;;;;:55:::2;::::0;59179:18;59143:35:::2;:55::i;:::-;59129:10;59109:31;::::0;;;:19:::2;:31;::::0;;;;:89;;;;59213:56:::2;::::0;59231:4:::2;::::0;59250:18;59213:9:::2;:56::i;:::-;59311:10;-1:-1:-1::0;;;;;59291:51:0::2;;59323:18;59291:51;;;;;;:::i;:::-;;;;;;;;59066:288;-1:-1:-1::0;;21177:1:0;22296:7;:22;-1:-1:-1;58289:1072:0:o;59515:812::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;25261:8:::1;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1::0;;;25252:38:0::1;;;;;;;:::i;:::-;59650:10:::2;59631:30;::::0;;;:18:::2;:30;::::0;;;;:37;59617:51;::::2;59609:84;;;;-1:-1:-1::0;;;59609:84:0::2;;;;;;;:::i;:::-;59706:34;;:::i;:::-;59762:10;59743:30;::::0;;;:18:::2;:30;::::0;;;;:43;;59774:11;;59743:43;::::2;;;;;;;;;;;;;;;59706:80;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;59807:25;59818:13;59807:10;:25::i;:::-;59799:67;;;;-1:-1:-1::0;;;59799:67:0::2;;;;;;;:::i;:::-;59898:25;::::0;;::::2;::::0;59988:10:::2;59879:16;59968:31:::0;;;:19:::2;:31:::0;;;;;;;;:48:::2;::::0;59898:25;59968:35:::2;:48::i;:::-;59954:10;59934:31;::::0;;;:19:::2;:31;::::0;;;;;;;:82;;;;60075:18:::2;:30:::0;;;60106:37;;-1:-1:-1;;60106:41:0;;;60075:73;::::2;;;;;;;;;;;;;;;60029:18;:30;60048:10;-1:-1:-1::0;;;;;60029:30:0::2;-1:-1:-1::0;;;;;60029:30:0::2;;;;;;;;;;;;60060:11;60029:43;;;;;;;;;::::0;;;::::2;::::0;;;:119;;:43:::2;::::0;;::::2;;:119:::0;;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;;60178:10:::2;60159:30:::0;;:18:::2;:30:::0;;;;;;:36;;;::::2;;;;;::::0;;;::::2;::::0;;::::2;-1:-1:-1::0;;60159:36:0;;;;;::::2;;::::0;;;::::2;;::::0;;;60208:49:::2;60226:4;60233:10;60245:11:::0;60208:9:::2;:49::i;:::-;60295:10;-1:-1:-1::0;;;;;60275:44:0::2;;60307:11;60275:44;;;;;;:::i;57288:121::-:0;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;57368:33:::1;57389:11:::0;57368:20:::1;:33::i;50097:96::-:0;50174:11;;50097:96;:::o;778:78::-;824:32;778:78;:::o;2413:46::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2413:46:0;:::o;52593:399::-;-1:-1:-1;;;;;52729:18:0;;52688:4;52729:18;;;:10;:18;;;;;;;;52748:10;52729:30;;;;;;;;52778:26;;;;52770:72;;;;-1:-1:-1;;;52770:72:0;;;;;;;:::i;:::-;52855:36;52865:6;52873:9;52884:6;52855:9;:36::i;:::-;52902:58;52911:6;52919:10;52931:28;:16;52952:6;52931:20;:28::i;:::-;52902:8;:58::i;:::-;-1:-1:-1;52980:4:0;;52593:399;-1:-1:-1;;;;52593:399:0:o;40569:114::-;40626:7;40653:12;;;:6;:12;;;;;:22;;;40569:114;;;;:::o;72990:297::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;73062:34:::1;370:26;73085:10;73062:7;:34::i;:::-;73054:60;;;;-1:-1:-1::0;;;73054:60:0::1;;;;;;;:::i;:::-;73128:12;73146:10;-1:-1:-1::0;;;;;73146:15:0::1;73170:6;73146:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73127:55;;;73201:7;73193:40;;;;-1:-1:-1::0;;;73193:40:0::1;;;;;;;:::i;:::-;73260:10;-1:-1:-1::0;;;;;73251:28:0::1;;73272:6;73251:28;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;21177:1:0;22296:7;:22;72990:297::o;40945:227::-;41037:12;;;;:6;:12;;;;;:22;;;41029:45;;41061:12;:10;:12::i;41029:45::-;41021:105;;;;-1:-1:-1;;;41021:105:0;;;;;;;:::i;:::-;41139:25;41150:4;41156:7;41139:10;:25::i;:::-;40945:227;;:::o;49944:76::-;50010:2;49944:76;:::o;42154:209::-;42252:12;:10;:12::i;:::-;-1:-1:-1;;;;;42241:23:0;:7;-1:-1:-1;;;;;42241:23:0;;42233:83;;;;-1:-1:-1;;;42233:83:0;;;;;;;:::i;:::-;42329:26;42341:4;42347:7;42329:11;:26::i;1109:23::-;;;;:::o;695:76::-;740:31;695:76;:::o;1933:24::-;;;;:::o;863:100::-;920:43;863:100;:::o;53531:220::-;53601:4;53622:11;;53637:1;53622:16;53618:57;;;-1:-1:-1;53662:1:0;53655:8;;53618:57;53694:49;53731:11;;53694:32;53710:15;;53694:11;:15;;:32;;;;:::i;:::-;:36;;:49::i;330:66::-;370:26;330:66;:::o;403:60::-;440:23;403:60;:::o;75736:259::-;75789:40;824:32;75818:10;75789:7;:40::i;:::-;75781:72;;;;-1:-1:-1;;;75781:72:0;;;;;;;:::i;:::-;75872:13;;;;75864:47;;;;-1:-1:-1;;;75864:47:0;;;;;;;:::i;:::-;75924:13;:21;;-1:-1:-1;;75924:21:0;;;75961:26;;;;;;75976:10;;75961:26;:::i;:::-;;;;;;;;75736:259::o;24935:86::-;25006:7;;;;24935:86;:::o;2609:30::-;;;;:::o;2149:51::-;;;;;;;;;;;;;:::o;1032:27::-;;;;:::o;50286:113::-;-1:-1:-1;;;;;50376:15:0;50352:4;50376:15;;;:6;:15;;;;;;;50286:113::o;73712:320::-;73791:39;37993:4;73819:10;73791:7;:39::i;:::-;73783:70;;;;-1:-1:-1;;;73783:70:0;;;;;;;:::i;:::-;73891:14;;;73916:34;;;;73968:56;;;;;;73891:14;;73933:17;;73968:56;:::i;:::-;;;;;;;;73712:320;;:::o;75047:120::-;75092:31;440:23;75112:10;75092:7;:31::i;:::-;75084:54;;;;-1:-1:-1;;;75084:54:0;;;;;;;:::i;:::-;75151:8;:6;:8::i;40242:138::-;40315:7;40342:12;;;:6;:12;;;;;:30;;40366:5;40342:23;:30::i;:::-;40335:37;40242:138;-1:-1:-1;;;40242:138:0:o;39203:139::-;39272:4;39296:12;;;:6;:12;;;;;:38;;39326:7;39296:29;:38::i;49741:87::-;49806:14;;;;;;;;;;;;-1:-1:-1;;;49806:14:0;;;;49741:87;:::o;37948:49::-;37993:4;37948:49;:::o;50829:164::-;50904:4;50921:40;50931:10;50943:9;50954:6;50921:9;:40::i;539:78::-;585:32;539:78;:::o;74593:383::-;74680:51;920:43;74720:10;74680:7;:51::i;:::-;74672:94;;;;-1:-1:-1;;;74672:94:0;;;;;;;:::i;:::-;74808:18;;;74837:42;;;;74897:71;;;;;;74808:18;;74858:21;;74897:71;:::i;57495:443::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;57591:10:::1;57546:23;57572:30:::0;;;:18:::1;:30;::::0;;;;:37;;57643:288:::1;57654:18;57650:1;:22;57643:288;;;57739:10;57720:30;::::0;;;:18:::1;:30;::::0;;;;:33;;57694:60:::1;::::0;57720:30;57751:1;;57720:33;::::1;;;;;;;;;;;;;;;57694:60;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:25;:60::i;:::-;57689:141;;57779:8;:1:::0;57785::::1;57779:5;:8::i;:::-;57775:12;;57806:8;;57689:141;57846:10;57854:1;57846:7;:10::i;:::-;57894:25;:18:::0;57917:1:::1;57894:22;:25::i;:::-;57873:46;;57643:288;;;-1:-1:-1::0;;21177:1:0;22296:7;:22;57495:443::o;470:62::-;508:24;470:62;:::o;624:64::-;663:25;624:64;:::o;54594:131::-;-1:-1:-1;;;;;54686:24:0;54662:4;54686:24;;;:18;:24;;;;;:31;;54594:131::o;53902:568::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;25261:8:::1;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1::0;;;25252:38:0::1;;;;;;;:::i;:::-;54012:1:::2;53998:11;:15;53990:49;;;;-1:-1:-1::0;;;53990:49:0::2;;;;;;;:::i;:::-;54080:10;54073:18;::::0;;;:6:::2;:18;::::0;;;;;54058:33;::::2;;54050:69;;;;-1:-1:-1::0;;;54050:69:0::2;;;;;;;:::i;:::-;54186:10;54166:31;::::0;;;:19:::2;:31;::::0;;;;;:48:::2;::::0;54202:11;54166:35:::2;:48::i;:::-;54152:10;54132:31;::::0;;;:19:::2;:31;::::0;;;;:82;;;;54225:49:::2;::::0;54255:4:::2;54262:11:::0;54225:9:::2;:49::i;:::-;54306:10;54287:30;::::0;;;:18:::2;:30;::::0;;;;;;;54323:80;;;;::::2;::::0;;54351:15:::2;54323:80:::0;;;;::::2;::::0;;;54287:117;;::::2;::::0;;::::2;::::0;;;;;;;;;;;::::2;::::0;;::::2;;::::0;;;;;;;;::::2;::::0;54422:40;::::2;::::0;::::2;::::0;54381:11;;54422:40:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;21177:1:0;22296:7;:22;53902:568::o;39516:127::-;39579:7;39606:12;;;:6;:12;;;;;:29;;:27;:29::i;73382:208::-;73437:33;663:25;73459:10;73437:7;:33::i;:::-;73429:58;;;;-1:-1:-1;;;73429:58:0;;;;;;;:::i;:::-;73518:1;73506:9;:13;73498:36;;;;-1:-1:-1;;;73498:36:0;;;;;;;:::i;:::-;73560:10;-1:-1:-1;;;;;73552:30:0;;73572:9;73552:30;;;;;;:::i;:::-;;;;;;;;73382:208::o;56731:416::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;56806:16:::1;56833:307;56873:10;56854:30;::::0;;;:18:::1;:30;::::0;;;;:37;56840:51;::::1;56833:307;;;56958:10;56939:30;::::0;;;:18:::1;:30;::::0;;;;:43;;56913:70:::1;::::0;56939:30;56970:11;;56939:43;::::1;;;;56913:70;56908:171;;57018:18;:11:::0;57034:1:::1;57018:15;:18::i;:::-;57004:32;;57055:8;;56908:171;57095:33;57116:11;57095:20;:33::i;:::-;56833:307;;41417:230:::0;41510:12;;;;:6;:12;;;;;:22;;;41502:45;;41534:12;:10;:12::i;41502:45::-;41494:106;;;;-1:-1:-1;;;41494:106:0;;;;;;;:::i;75420:259::-;75472:39;740:31;75500:10;75472:7;:39::i;:::-;75464:70;;;;-1:-1:-1;;;75464:70:0;;;;;;;:::i;:::-;75554:13;;;;75553:14;75545:52;;;;-1:-1:-1;;;75545:52:0;;;;;;;:::i;:::-;75610:13;:20;;-1:-1:-1;;75610:20:0;75626:4;75610:20;;;75646:25;;;;;;75660:10;;75646:25;:::i;58091:95::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;58158:20:::1;58166:11:::0;58158:7:::1;:20::i;51263:139::-:0;-1:-1:-1;;;;;51368:17:0;;;51344:4;51368:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;51263:139::o;2691:23::-;;;;:::o;2507:25::-;;;;;;:::o;72403:449::-;21221:1;21984:7;;:19;;21976:63;;;;-1:-1:-1;;;21976:63:0;;;;;;;:::i;:::-;21221:1;22117:7;:18;72480:40:::1;585:32;72509:10;72480:7;:40::i;:::-;72472:72;;;;-1:-1:-1::0;;;72472:72:0::1;;;;;;;:::i;:::-;72575:15;::::0;:27:::1;::::0;72595:6;72575:19:::1;:27::i;:::-;72557:15;:45:::0;72615:33:::1;:31;:33::i;:::-;72713:27;72735:4;72713:21;:27::i;:::-;72694:15;72659:51;::::0;;;:34:::1;:51;::::0;;;;;:81;;;;72751:32:::1;:54:::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;72823:21;::::1;::::0;::::1;::::0;72837:6;;72823:21:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;21177:1:0;22296:7;:22;72403:449::o;49074:444::-;18828:13;;;;;;;;:33;;;18845:16;:14;:16::i;:::-;18828:50;;;-1:-1:-1;18866:12:0;;;;18865:13;18828:50;18820:109;;;;-1:-1:-1;;;18820:109:0;;;;;;;:::i;:::-;18942:19;18965:13;;;;;;18964:14;18989:101;;;;19024:13;:20;;-1:-1:-1;;;;19024:20:0;;;;;19059:19;19040:4;19059:19;;;18989:101;49166:42:::1;37993:4;49197:10;49166;:42::i;:::-;49221:14;:32:::0;;;49269:41:::1;::::0;::::1;::::0;::::1;::::0;49291:1:::1;::::0;49238:15;;49269:41:::1;:::i;:::-;;;;;;;;49323:12;:28:::0;;;49367:37:::1;::::0;::::1;::::0;::::1;::::0;49387:1:::1;::::0;49338:13;;49367:37:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;49417:18:0::1;:29:::0;;;49462:48:::1;::::0;::::1;::::0;::::1;::::0;49488:1:::1;::::0;49443:2;49462:48:::1;:::i;:::-;;;;;;;;19120:14:::0;19116:68;;;19167:5;19151:21;;-1:-1:-1;;19151:21:0;;;19116:68;49074:444;;;:::o;74148:302::-;74223:39;37993:4;74251:10;74223:7;:39::i;:::-;74215:70;;;;-1:-1:-1;;;74215:70:0;;;;;;;:::i;:::-;74321:12;;;74344:30;;;;74392:50;;;;;;74321:12;;74359:15;;74392:50;:::i;53114:308::-;53183:4;53204:15;;53223:1;53204:20;53200:61;;;-1:-1:-1;53248:1:0;53241:8;;53200:61;53273:11;53287:48;53319:15;;53287:27;53302:11;;53287:10;:14;;:27;;;;:::i;:48::-;53273:62;;53363:1;53354:6;:10;53346:42;;;;-1:-1:-1;;;53346:42:0;;;;;;;:::i;54923:1190::-;-1:-1:-1;;;;;55150:24:0;;;;;;:18;:24;;;;;:31;55057:22;;;;55143:38;;55135:75;;;;-1:-1:-1;;;55135:75:0;;;;;;;:::i;:::-;55236:2;55229:4;:9;55221:62;;;;-1:-1:-1;;;55221:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55305:24:0;;;;;;:18;:24;;;;;:31;55300:36;;55296:105;;;-1:-1:-1;;;;;55358:24:0;;;;;;:18;:24;;;;;:31;;-1:-1:-1;55296:105:0;55413:46;55482:12;:2;55489:4;55482:6;:12::i;:::-;55462:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;55413:82:0;-1:-1:-1;55506:27:0;55547:12;:2;55554:4;55547:6;:12::i;:::-;55536:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55536:24:0;;55506:54;;55578:6;55573:473;55594:12;:2;55601:4;55594:6;:12::i;:::-;55590:1;:16;55573:473;;;-1:-1:-1;;;;;55666:24:0;;;;;;:18;:24;;;;;55691:11;:4;55700:1;55691:8;:11::i;:::-;55666:37;;;;;;;;;;;;;;;;;;55637:66;;;;;;;;;;;;;;;;;;;;;;;;;:23;55661:1;55637:26;;;;;;;;;;;;;:66;;;;55724:53;55750:23;55774:1;55750:26;;;;;;;;;;;;;;55724:25;:53::i;:::-;55720:315;;;55799:12;55813:17;55834:71;55868:23;55892:1;55868:26;;;;;;;;;;;;;;:36;;;55834:33;:71::i;:::-;55798:107;;;;55932:7;55924:43;;;;-1:-1:-1;;;55924:43:0;;;;;;;:::i;:::-;56007:12;55988:13;56002:1;55988:16;;;;;;;;;;;;;:31;;;;;55720:315;;;55612:8;:1;55618;55612:5;:8::i;:::-;55608:12;;55573:473;;;-1:-1:-1;56066:23:0;;;;-1:-1:-1;54923:1190:0;-1:-1:-1;;;;54923:1190:0:o;2022:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2022:61:0;-1:-1:-1;2022:61:0;:::o;11028:422::-;11395:20;11434:8;;;11028:422::o;64158:703::-;64248:4;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;64274:13:::1;::::0;::::1;;64273:14;64265:41;;;;-1:-1:-1::0;;;64265:41:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64325:23:0;::::1;64317:60;;;;-1:-1:-1::0;;;64317:60:0::1;;;;;;;:::i;:::-;64410:1;64396:11;:15;64388:43;;;;-1:-1:-1::0;;;64388:43:0::1;;;;;;;:::i;:::-;64444:15;64462:34;64484:11;64462:21;:34::i;:::-;64444:52;;64550:18;;64515:31;64535:10;64515:15;;:19;;:31;;;;:::i;:::-;:53;;64507:96;;;;-1:-1:-1::0;;;64507:96:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64620:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;64616:87:::1;;64673:11;::::0;:18:::1;::::0;64689:1:::1;64673:15;:18::i;:::-;64659:11;:32:::0;64616:87:::1;64729:11;::::0;:28:::1;::::0;64745:11;64729:15:::1;:28::i;:::-;64715:11;:42:::0;-1:-1:-1;;;;;64788:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;:34:::1;::::0;64810:11;64788:21:::1;:34::i;:::-;-1:-1:-1::0;;;;;64768:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;:54;-1:-1:-1;;64842:11:0::1;::::0;64158:703;;;;:::o;5553:179::-;5611:7;5643:5;;;5667:6;;;;5659:46;;;;-1:-1:-1;;;5659:46:0;;;;;;;:::i;65990:186::-;66134:14;;66106:23;;66082:4;;66153:15;;66106:43;;:27;:43::i;:::-;:62;;;65990:186;-1:-1:-1;;65990:186:0:o;67043:954::-;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;67166:10:::1;67147:30;::::0;;;:18:::1;:30;::::0;;;;:37;67133:51;::::1;67125:77;;;;-1:-1:-1::0;;;67125:77:0::1;;;;;;;:::i;:::-;67215:34;;:::i;:::-;67271:10;67252:30;::::0;;;:18:::1;:30;::::0;;;;:43;;67283:11;;67252:43;::::1;;;;;;;;;;;;;;;67215:80;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;67317:25;67328:13;67317:10;:25::i;:::-;67316:26;67308:64;;;;-1:-1:-1::0;;;67308:64:0::1;;;;;;;:::i;:::-;67404:25;::::0;;::::1;::::0;67465:23;;67539:10:::1;67385:16;67520:30:::0;;;:18:::1;:30:::0;;;;;;;:37;67404:25;;67465:23;-1:-1:-1;;67520:41:0;67505:56;::::1;67501:208;;67643:10;67624:30;::::0;;;:18:::1;:30;::::0;;;;67655:37;;-1:-1:-1;;67655:41:0;;;67624:73;::::1;;;;;;;;;;;;;;;67578:18;:30;67597:10;-1:-1:-1::0;;;;;67578:30:0::1;-1:-1:-1::0;;;;;67578:30:0::1;;;;;;;;;;;;67609:11;67578:43;;;;;;;;;::::0;;;::::1;::::0;;;:119;;:43:::1;::::0;;::::1;;:119:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;67501:208:::1;67740:10;67721:30;::::0;;;:18:::1;:30;::::0;;;;:36;;;::::1;;;;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;67721:36:0;;;;;::::1;;::::0;;;::::1;;::::0;;;;;;;67824:10:::1;67804:31:::0;;:19:::1;:31:::0;;;;;;:48:::1;::::0;67840:11;67804:35:::1;:48::i;:::-;67790:10;67770:31;::::0;;;:19:::1;:31;::::0;;;;:82;;;;67863:49:::1;::::0;67881:4:::1;::::0;67900:11;67863:9:::1;:49::i;:::-;67946:10;-1:-1:-1::0;;;;;67930:59:0::1;;67958:17;67977:11;67930:59;;;;;;;:::i;:::-;;;;;;;;25301:1;;;67043:954:::0;:::o;25994:120::-;25538:8;:6;:8::i;:::-;25530:41;;;;-1:-1:-1;;;25530:41:0;;;;;;;:::i;:::-;26053:7:::1;:15:::0;;-1:-1:-1;;26053:15:0::1;::::0;;26084:22:::1;26093:12;:10;:12::i;:::-;26084:22;;;;;;:::i;62228:328::-:0;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62333:19:0;::::1;62325:57;;;;-1:-1:-1::0;;;62325:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62401:21:0;::::1;62393:57;;;;-1:-1:-1::0;;;62393:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62463:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;;;;:35;;;62516:32;::::1;::::0;::::1;::::0;62492:6;;62516:32:::1;:::i;:::-;;;;;;;;62228:328:::0;;;:::o;66712:190::-;66863:12;;66843:14;;66815:23;;66791:4;;66879:15;;66815:61;;:43;;:27;:43::i;:::-;:47;;:61::i;:::-;:79;;66712:190;-1:-1:-1;;66712:190:0:o;6015:158::-;6073:7;6106:1;6101;:6;;6093:49;;;;-1:-1:-1;;;6093:49:0;;;;;;;:::i;:::-;-1:-1:-1;6160:5:0;;;6015:158::o;61708:190::-;61795:42;61811:6;61819:9;61830:6;61795:15;:42::i;:::-;61872:9;-1:-1:-1;;;;;61855:35:0;61864:6;-1:-1:-1;;;;;61855:35:0;;61883:6;61855:35;;;;;;:::i;23225:106::-;23313:10;23225:106;:::o;43397:188::-;43471:12;;;;:6;:12;;;;;:33;;43496:7;43471:24;:33::i;:::-;43467:111;;;43553:12;:10;:12::i;:::-;-1:-1:-1;;;;;43526:40:0;43544:7;-1:-1:-1;;;;;43526:40:0;43538:4;43526:40;;;;;;;;;;43397:188;;:::o;43593:192::-;43668:12;;;;:6;:12;;;;;:36;;43696:7;43668:27;:36::i;:::-;43664:114;;;43753:12;:10;:12::i;:::-;-1:-1:-1;;;;;43726:40:0;43744:7;-1:-1:-1;;;;;43726:40:0;43738:4;43726:40;;;;;;;;;;43593:192;;:::o;6432:220::-;6490:7;6514:6;6510:20;;-1:-1:-1;6529:1:0;6522:8;;6510:20;6553:5;;;6557:1;6553;:5;:1;6577:5;;;;;:10;6569:56;;;;-1:-1:-1;;;6569:56:0;;;;;;;:::i;7130:153::-;7188:7;7220:1;7216;:5;7208:44;;;;-1:-1:-1;;;7208:44:0;;;;;;;:::i;:::-;7274:1;7270;:5;;;;;;;7130:153;-1:-1:-1;;;7130:153:0:o;25735:118::-;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;25795:7:::1;:14:::0;;-1:-1:-1;;25795:14:0::1;25805:4;25795:14;::::0;;25825:20:::1;25832:12;:10;:12::i;34131:158::-:0;34205:7;34256:22;34260:3;34272:5;34256:3;:22::i;33417:167::-;33497:4;33521:55;33531:3;-1:-1:-1;;;;;33551:23:0;;33521:9;:55::i;66323:262::-;66417:4;66442:38;66466:13;66442:23;:38::i;:::-;66441:39;:136;;;;;66562:15;66497:61;66545:12;;66497:43;66525:14;;66497:13;:23;;;:27;;:43;;;;:::i;68157:1376::-;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;68281:10:::1;68262:30;::::0;;;:18:::1;:30;::::0;;;;:37;68241:58;::::1;68233:99;;;;-1:-1:-1::0;;;68233:99:0::1;;;;;;;:::i;:::-;68345:34;;:::i;:::-;68401:10;68382:30;::::0;;;:18:::1;:30;::::0;;;;:50;;68413:18;;68382:50;::::1;;;;;;;;;;;;;;;68345:87;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;68453:40;68479:13;68453:25;:40::i;:::-;68445:85;;;;-1:-1:-1::0;;;68445:85:0::1;;;;;;;:::i;:::-;68544:12;68558:17:::0;68579:58:::1;68613:13;:23;;;68579:33;:58::i;:::-;68543:94;;;;68656:7;68648:43;;;;-1:-1:-1::0;;;68648:43:0::1;;;;;;;:::i;:::-;68723:25;::::0;::::1;::::0;68776:23;;68704:16:::1;68828:39;68862:4;68828:29;:12:::0;68723:25;68828:16:::1;:29::i;:39::-;68810:57;;68902:11;68888:10;:25;;68880:59;;;;-1:-1:-1::0;;;68880:59:0::1;;;;;;;:::i;:::-;69006:10;68986:31;::::0;;;:19:::1;:31;::::0;;;;;:48:::1;::::0;69022:11;68986:35:::1;:48::i;:::-;68972:10;68952:31;::::0;;;:19:::1;:31;::::0;;;;:82;69045:39:::1;69065:4;69072:11:::0;69045::::1;:39::i;:::-;-1:-1:-1::0;69115:15:0::1;::::0;:31:::1;::::0;69135:10;69115:19:::1;:31::i;:::-;69097:15;:49:::0;69231:10:::1;69212:30;::::0;;;:18:::1;:30;::::0;;;;69243:37;;:44:::1;::::0;69285:1:::1;69243:41;:44::i;:::-;69212:76;;;;;;;;;;;;;;;;;;69159:18;:30;69178:10;-1:-1:-1::0;;;;;69159:30:0::1;-1:-1:-1::0;;;;;69159:30:0::1;;;;;;;;;;;;69190:18;69159:50;;;;;;;;;::::0;;;::::1;::::0;;;:129;;:50:::1;::::0;;::::1;;:129:::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;69318:10:::1;69299:30:::0;;:18:::1;:30:::0;;;;;;:36;;;::::1;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;69299:36:0;;;;;::::1;;::::0;;;::::1;;::::0;;;69362:40:::1;::::0;:10:::1;::::0;69386;;69362:40:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69348:54;;;;;69421:7;69413:40;;;;-1:-1:-1::0;;;69413:40:0::1;;;;;;;:::i;:::-;69478:10;-1:-1:-1::0;;;;;69471:54:0::1;;69490:9;69501:11;69514:10;69471:54;;;;;;;;:::i;:::-;;;;;;;;25301:1;;;;;;68157:1376:::0;:::o;33670:117::-;33733:7;33760:19;33768:3;33760:7;:19::i;70931:892::-;70998:32;:39;70994:83;;71059:7;;70994:83;71089:15;71119:24;71146:45;71184:6;71146:33;71166:12;;71146:15;:19;;:33;;;;:::i;:::-;:37;;:45::i;:::-;71119:72;;71204:201;71224:32;:39;71211:52;;:135;;;;;71327:19;71280:32;71313:10;71280:44;;;;;;;;;;;;;;;;:66;71211:135;71204:201;;;71376:17;:10;71391:1;71376:14;:17::i;:::-;71363:30;;71204:201;;;71421:15;71417:54;;71453:7;;;;71417:54;71488:6;71483:208;71504:32;:39;:55;;71548:10;71504:43;:55::i;:::-;71500:1;:59;71483:208;;;71628:32;71661:17;:1;71667:10;71661:5;:17::i;:::-;71628:51;;;;;;;;;;;;;;;;71590:32;71623:1;71590:35;;;;;;;;;;;;;;;;;:89;71565:8;:1;71571;71565:5;:8::i;:::-;71561:12;;71483:208;;;-1:-1:-1;71717:1:0;71703:113;71725:10;71720:1;:15;71703:113;;71766:32;:38;;;;;;;;;;;;;;;;;;;;;;;;71741:8;71747:1;71741;:5;;:8;;;;:::i;:::-;71737:12;;71703:113;;19284:125;19332:4;19357:44;19395:4;19357:29;:44::i;:::-;19356:45;19349:52;;19284:125;:::o;69735:1099::-;69850:32;:39;69823:4;;;;69846:94;;-1:-1:-1;69919:5:0;;-1:-1:-1;69919:5:0;69911:17;;69846:94;70006:32;:39;70116:14;;69952:8;;;;-1:-1:-1;;70006:43:0;;;;69952:8;;70096:35;;:15;;:19;:35::i;:::-;70062:69;;70144:653;70158:4;70151:3;:11;70144:653;;70185:20;70203:1;70185:13;:4;70194:3;70185:8;:13::i;:20::-;70179:26;;70267;70226:32;70259:3;70226:37;;;;;;;;;;;;;;;;:67;70222:564;;70332:32;:39;70318:10;:3;70326:1;70318:7;:10::i;:::-;:53;:151;;;-1:-1:-1;70443:26:0;70396:32;70429:10;:3;70437:1;70429:7;:10::i;:::-;70396:44;;;;;;;;;;;;;;;;:73;70318:151;70314:288;;;70502:4;70508:34;:73;70543:32;70576:3;70543:37;;;;;;;;;;;;;;;;70508:73;;;;;;;;;;;;70494:88;;;;;;;;;;70314:288;70628:10;:3;70636:1;70628:7;:10::i;:::-;70622:16;;70222:564;;;70664:8;70660:126;;70701:4;70707;70693:19;;;;;;;;;;70660:126;70760:10;:3;70768:1;70760:7;:10::i;:::-;70753:17;;70660:126;70144:653;;;70817:5;70824:1;70809:17;;;;;;;;69735:1099;;;;:::o;62893:844::-;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63013:20:0;::::1;63005:63;;;;-1:-1:-1::0;;;63005:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63087:23:0;::::1;63079:64;;;;-1:-1:-1::0;;;63079:64:0::1;;;;;;;:::i;:::-;63172:9;-1:-1:-1::0;;;;;63162:19:0::1;:6;-1:-1:-1::0;;;;;63162:19:0::1;;;63154:48;;;;-1:-1:-1::0;;;63154:48:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63242:14:0;::::1;63215:24;63242:14:::0;;;:6:::1;:14;::::0;;;;;63275:34;;::::1;;63267:78;;;;-1:-1:-1::0;;;63267:78:0::1;;;;;;;:::i;:::-;63378:1;63364:11;:15;63356:47;;;;-1:-1:-1::0;;;63356:47:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63420:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;63416:87:::1;;63473:11;::::0;:18:::1;::::0;63489:1:::1;63473:15;:18::i;:::-;63459:11;:32:::0;63416:87:::1;63532:36;:19:::0;63556:11;63532:23:::1;:36::i;:::-;-1:-1:-1::0;;;;;63515:14:0;;::::1;;::::0;;;:6:::1;:14;::::0;;;;;:53;;;;63599:17;;::::1;::::0;;;;:34:::1;::::0;63621:11;63599:21:::1;:34::i;:::-;-1:-1:-1::0;;;;;63579:17:0;;::::1;;::::0;;;:6:::1;:17;::::0;;;;;:54;;;;63650:14;;::::1;::::0;;;;63646:84:::1;;63700:11;::::0;:18:::1;::::0;63716:1:::1;63700:15;:18::i;:::-;63686:11;:32:::0;63646:84:::1;25301:1;62893:844:::0;;;:::o;32845:152::-;32915:4;32939:50;32944:3;-1:-1:-1;;;;;32964:23:0;;32939:4;:50::i;33173:158::-;33246:4;33270:53;33278:3;-1:-1:-1;;;;;33298:23:0;;33270:7;:53::i;30797:204::-;30892:18;;30864:7;;30892:26;-1:-1:-1;30884:73:0;;;;-1:-1:-1;;;30884:73:0;;;;;;;:::i;:::-;30975:3;:11;;30987:5;30975:18;;;;;;;;;;;;;;;;30968:25;;30797:204;;;;:::o;30129:129::-;30202:4;30226:19;;;:12;;;;;:19;;;;;;:24;;;30129:129::o;65248:597::-;65336:4;25261:8;:6;:8::i;:::-;25260:9;25252:38;;;;-1:-1:-1;;;25252:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65361:21:0;::::1;65353:60;;;;-1:-1:-1::0;;;65353:60:0::1;;;;;;;:::i;:::-;65446:1;65432:11;:15;65424:43;;;;-1:-1:-1::0;;;65424:43:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;65501:15:0;::::1;65480:18;65501:15:::0;;;:6:::1;:15;::::0;;;;;65535:28;;::::1;;65527:68;;;;-1:-1:-1::0;;;65527:68:0::1;;;;;;;:::i;:::-;65622:11;::::0;:28:::1;::::0;65638:11;65622:15:::1;:28::i;:::-;65608:11;:42:::0;65679:30:::1;:13:::0;65697:11;65679:17:::1;:30::i;:::-;-1:-1:-1::0;;;;;65661:15:0;::::1;;::::0;;;:6:::1;:15;::::0;;;;:48;;;65722:85:::1;;65777:11;::::0;:18:::1;::::0;65793:1:::1;65777:15;:18::i;:::-;65763:11;:32:::0;65722:85:::1;-1:-1:-1::0;;65826:11:0::1;::::0;65248:597;;;;:::o;30344:109::-;30427:18;;30344:109::o;27909:414::-;27972:4;27994:21;28004:3;28009:5;27994:9;:21::i;:::-;27989:327;;-1:-1:-1;28032:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;28215:18;;28193:19;;;:12;;;:19;;;;;;:40;;;;28248:11;;27989:327;-1:-1:-1;28299:5:0;28292:12;;28499:1544;28565:4;28704:19;;;:12;;;:19;;;;;;28740:15;;28736:1300;;29175:18;;-1:-1:-1;;29126:14:0;;;;29175:22;;;;29102:21;;29175:3;;:22;;29462;;;;;;;;;;;;;;29442:42;;29608:9;29579:3;:11;;29591:13;29579:26;;;;;;;;;;;;;;;;;;;:38;;;;29685:23;;;29727:1;29685:12;;;:23;;;;;;29711:17;;;29685:43;;29837:17;;29685:3;;29837:17;;;;;;;;;;;;;;;;;;;;;;29932:3;:12;;:19;29945:5;29932:19;;;;;;;;;;;29925:26;;;29975:4;29968:11;;;;;;;;28736:1300;30019:5;30012:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;55685:54;;56861:35;;56851:2;;56910:1;;56900:12;416:241;;520:2;508:9;499:7;495:23;491:32;488:2;;;-1:-1;;526:12;488:2;588:53;633:7;609:22;588:53;:::i;664:366::-;;;785:2;773:9;764:7;760:23;756:32;753:2;;;-1:-1;;791:12;753:2;853:53;898:7;874:22;853:53;:::i;:::-;843:63;;961:53;1006:7;943:2;986:9;982:22;961:53;:::i;:::-;951:63;;747:283;;;;;:::o;1037:491::-;;;;1175:2;1163:9;1154:7;1150:23;1146:32;1143:2;;;-1:-1;;1181:12;1143:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1233:63;-1:-1;1333:2;1372:22;;72:20;97:33;72:20;97:33;:::i;:::-;1137:391;;1341:63;;-1:-1;;;1441:2;1480:22;;;;346:20;;1137:391::o;1535:366::-;;;1656:2;1644:9;1635:7;1631:23;1627:32;1624:2;;;-1:-1;;1662:12;1624:2;1724:53;1769:7;1745:22;1724:53;:::i;:::-;1714:63;1814:2;1853:22;;;;346:20;;-1:-1;;;1618:283::o;1908:491::-;;;;2046:2;2034:9;2025:7;2021:23;2017:32;2014:2;;;-1:-1;;2052:12;2014:2;2114:53;2159:7;2135:22;2114:53;:::i;:::-;2104:63;2204:2;2243:22;;346:20;;-1:-1;2312:2;2351:22;;;346:20;;2008:391;-1:-1;;;2008:391::o;2406:241::-;;2510:2;2498:9;2489:7;2485:23;2481:32;2478:2;;;-1:-1;;2516:12;2478:2;-1:-1;209:20;;2472:175;-1:-1;2472:175::o;2654:366::-;;;2775:2;2763:9;2754:7;2750:23;2746:32;2743:2;;;-1:-1;;2781:12;2743:2;222:6;209:20;2833:63;;2933:2;2976:9;2972:22;72:20;97:33;124:5;97:33;:::i;:::-;2941:63;;;;2737:283;;;;;:::o;3027:366::-;;;3148:2;3136:9;3127:7;3123:23;3119:32;3116:2;;;-1:-1;;3154:12;3116:2;-1:-1;;209:20;;;3306:2;3345:22;;;346:20;;-1:-1;3110:283::o;4316:173::-;6692:37;;4478:4;4469:14;;4396:93::o;26770:379::-;27134:10;26958:191::o;27156:222::-;-1:-1;;;;;55685:54;;;;4717:37;;27283:2;27268:18;;27254:124::o;27630:741::-;27941:2;27955:47;;;54055:12;;27926:18;;;54774:19;;;27630:741;;27941:2;54823:4;;54814:14;;;;53723;;;27630:741;5407:344;5432:6;5429:1;5426:13;5407:344;;;5493:13;;26145:23;;6692:37;;26312:16;;26306:23;26383:14;;;6692:37;4287:14;;;;54486;;;;5454:1;5447:9;5407:344;;;5411:14;;;28228:9;28222:4;28218:20;54823:4;28202:9;28198:18;28191:48;28253:108;;;6005:5;54055:12;6024:86;6103:6;6098:3;6024:86;:::i;:::-;6017:93;;54823:4;6181:5;53723:14;6193:21;;-1:-1;6220:260;6245:6;6242:1;6239:13;6220:260;;;6333:63;6392:3;6312:6;6306:13;6333:63;:::i;:::-;6326:70;-1:-1;54486:14;;;;5454:1;6260:9;6220:260;;;-1:-1;28245:116;;27912:459;-1:-1;;;;;;;27912:459::o;28378:210::-;55518:13;;55511:21;6575:34;;28499:2;28484:18;;28470:118::o;28595:222::-;6692:37;;;28722:2;28707:18;;28693:124::o;28824:349::-;6820:58;;;29159:2;29144:18;;6692:37;28987:2;28972:18;;28958:215::o;29180:310::-;;29327:2;;29348:17;29341:47;7035:5;54055:12;54786:6;29327:2;29316:9;29312:18;54774:19;-1:-1;56493:101;56507:6;56504:1;56501:13;56493:101;;;56574:11;;;;;56568:18;56555:11;;;54814:14;56555:11;56548:39;56522:10;;56493:101;;;56609:6;56606:1;56603:13;56600:2;;;-1:-1;54814:14;56665:6;29316:9;56656:16;;56649:27;56600:2;-1:-1;56781:7;56765:14;-1:-1;;56761:28;7193:39;;;;54814:14;7193:39;;29298:192;-1:-1;;;29298:192::o;29497:416::-;29697:2;29711:47;;;7469:2;29682:18;;;54774:19;-1:-1;;;54814:14;;;7485:38;7542:12;;;29668:245::o;29920:416::-;30120:2;30134:47;;;7793:2;30105:18;;;54774:19;-1:-1;;;54814:14;;;7809:34;7862:12;;;30091:245::o;30343:416::-;30543:2;30557:47;;;8113:2;30528:18;;;54774:19;8149:34;54814:14;;;8129:55;-1:-1;;;8204:12;;;8197:26;8242:12;;;30514:245::o;30766:416::-;30966:2;30980:47;;;8493:2;30951:18;;;54774:19;8529:34;54814:14;;;8509:55;-1:-1;;;8584:12;;;8577:25;8621:12;;;30937:245::o;31189:416::-;31389:2;31403:47;;;8872:2;31374:18;;;54774:19;8908:34;54814:14;;;8888:55;-1:-1;;;8963:12;;;8956:39;9014:12;;;31360:245::o;31612:416::-;31812:2;31826:47;;;9265:2;31797:18;;;54774:19;-1:-1;;;54814:14;;;9281:43;9343:12;;;31783:245::o;32035:416::-;32235:2;32249:47;;;9594:2;32220:18;;;54774:19;-1:-1;;;54814:14;;;9610:36;9665:12;;;32206:245::o;32458:416::-;32658:2;32672:47;;;9916:2;32643:18;;;54774:19;9952:32;54814:14;;;9932:53;10004:12;;;32629:245::o;32881:416::-;33081:2;33095:47;;;10255:2;33066:18;;;54774:19;-1:-1;;;54814:14;;;10271:41;10331:12;;;33052:245::o;33304:416::-;33504:2;33518:47;;;10582:2;33489:18;;;54774:19;-1:-1;;;54814:14;;;10598:37;10654:12;;;33475:245::o;33727:416::-;33927:2;33941:47;;;10905:2;33912:18;;;54774:19;10941:28;54814:14;;;10921:49;10989:12;;;33898:245::o;34150:416::-;34350:2;34364:47;;;11240:2;34335:18;;;54774:19;11276:26;54814:14;;;11256:47;11322:12;;;34321:245::o;34573:416::-;34773:2;34787:47;;;11573:2;34758:18;;;54774:19;11609:25;54814:14;;;11589:46;11654:12;;;34744:245::o;34996:416::-;35196:2;35210:47;;;11905:2;35181:18;;;54774:19;11941:29;54814:14;;;11921:50;11990:12;;;35167:245::o;35419:416::-;35619:2;35633:47;;;12241:2;35604:18;;;54774:19;-1:-1;;;54814:14;;;12257:36;12312:12;;;35590:245::o;35842:416::-;36042:2;36056:47;;;12563:2;36027:18;;;54774:19;12599:32;54814:14;;;12579:53;12651:12;;;36013:245::o;36265:416::-;36465:2;36479:47;;;12902:2;36450:18;;;54774:19;-1:-1;;;54814:14;;;12918:42;12979:12;;;36436:245::o;36688:416::-;36888:2;36902:47;;;13230:2;36873:18;;;54774:19;13266:32;54814:14;;;13246:53;13318:12;;;36859:245::o;37111:416::-;37311:2;37325:47;;;13569:2;37296:18;;;54774:19;13605:28;54814:14;;;13585:49;13653:12;;;37282:245::o;37534:416::-;37734:2;37748:47;;;13904:2;37719:18;;;54774:19;13940:34;54814:14;;;13920:55;-1:-1;;;13995:12;;;13988:40;14047:12;;;37705:245::o;37957:416::-;38157:2;38171:47;;;38142:18;;;54774:19;14334:34;54814:14;;;14314:55;14388:12;;;38128:245::o;38380:416::-;38580:2;38594:47;;;14639:2;38565:18;;;54774:19;-1:-1;;;54814:14;;;14655:39;14713:12;;;38551:245::o;38803:416::-;39003:2;39017:47;;;14964:2;38988:18;;;54774:19;15000:32;54814:14;;;14980:53;15052:12;;;38974:245::o;39226:416::-;39426:2;39440:47;;;15303:2;39411:18;;;54774:19;15339:34;54814:14;;;15319:55;-1:-1;;;15394:12;;;15387:38;15444:12;;;39397:245::o;39649:416::-;39849:2;39863:47;;;15695:2;39834:18;;;54774:19;15731:34;54814:14;;;15711:55;-1:-1;;;15786:12;;;15779:32;15830:12;;;39820:245::o;40072:416::-;40272:2;40286:47;;;16081:2;40257:18;;;54774:19;-1:-1;;;54814:14;;;16097:42;16158:12;;;40243:245::o;40495:416::-;40695:2;40709:47;;;16409:2;40680:18;;;54774:19;16445:30;54814:14;;;16425:51;16495:12;;;40666:245::o;40918:416::-;41118:2;41132:47;;;16746:2;41103:18;;;54774:19;16782:29;54814:14;;;16762:50;16831:12;;;41089:245::o;41341:416::-;41541:2;41555:47;;;17082:2;41526:18;;;54774:19;17118:34;54814:14;;;17098:55;-1:-1;;;17173:12;;;17166:25;17210:12;;;41512:245::o;41764:416::-;41964:2;41978:47;;;17461:2;41949:18;;;54774:19;-1:-1;;;54814:14;;;17477:39;17535:12;;;41935:245::o;42187:416::-;42387:2;42401:47;;;17786:2;42372:18;;;54774:19;-1:-1;;;54814:14;;;17802:35;17856:12;;;42358:245::o;42610:416::-;42810:2;42824:47;;;18107:2;42795:18;;;54774:19;-1:-1;;;54814:14;;;18123:43;18185:12;;;42781:245::o;43033:416::-;43233:2;43247:47;;;18436:2;43218:18;;;54774:19;18472:25;54814:14;;;18452:46;18517:12;;;43204:245::o;43456:416::-;43656:2;43670:47;;;18768:2;43641:18;;;54774:19;-1:-1;;;54814:14;;;18784:35;18838:12;;;43627:245::o;43879:416::-;44079:2;44093:47;;;19089:2;44064:18;;;54774:19;-1:-1;;;54814:14;;;19105:33;19157:12;;;44050:245::o;44302:416::-;44502:2;44516:47;;;19408:2;44487:18;;;54774:19;19444:33;54814:14;;;19424:54;19497:12;;;44473:245::o;44725:416::-;44925:2;44939:47;;;19748:2;44910:18;;;54774:19;-1:-1;;;54814:14;;;19764:43;19826:12;;;44896:245::o;45148:416::-;45348:2;45362:47;;;20382:2;45333:18;;;54774:19;-1:-1;;;54814:14;;;20398:42;20459:12;;;45319:245::o;45571:416::-;45771:2;45785:47;;;20710:2;45756:18;;;54774:19;20746:25;54814:14;;;20726:46;20791:12;;;45742:245::o;45994:416::-;46194:2;46208:47;;;21042:2;46179:18;;;54774:19;21078:27;54814:14;;;21058:48;21125:12;;;46165:245::o;46417:416::-;46617:2;46631:47;;;21376:2;46602:18;;;54774:19;21412:30;54814:14;;;21392:51;21462:12;;;46588:245::o;46840:416::-;47040:2;47054:47;;;21713:2;47025:18;;;54774:19;21749:27;54814:14;;;21729:48;21796:12;;;47011:245::o;47263:416::-;47463:2;47477:47;;;22047:2;47448:18;;;54774:19;-1:-1;;;54814:14;;;22063:42;22124:12;;;47434:245::o;47686:416::-;47886:2;47900:47;;;22375:2;47871:18;;;54774:19;-1:-1;;;54814:14;;;22391:44;22454:12;;;47857:245::o;48109:416::-;48309:2;48323:47;;;22705:2;48294:18;;;54774:19;22741:26;54814:14;;;22721:47;22787:12;;;48280:245::o;48532:416::-;48732:2;48746:47;;;23038:2;48717:18;;;54774:19;23074:27;54814:14;;;23054:48;23121:12;;;48703:245::o;48955:416::-;49155:2;49169:47;;;23372:2;49140:18;;;54774:19;-1:-1;;;54814:14;;;23388:38;23445:12;;;49126:245::o;49378:416::-;49578:2;49592:47;;;23696:2;49563:18;;;54774:19;-1:-1;;;54814:14;;;23712:41;23772:12;;;49549:245::o;49801:416::-;50001:2;50015:47;;;24023:2;49986:18;;;54774:19;24059:33;54814:14;;;24039:54;24112:12;;;49972:245::o;50224:416::-;50424:2;50438:47;;;24363:2;50409:18;;;54774:19;24399:31;54814:14;;;24379:52;24450:12;;;50395:245::o;50647:416::-;50847:2;50861:47;;;24701:2;50832:18;;;54774:19;-1:-1;;;54814:14;;;24717:33;24769:12;;;50818:245::o;51070:416::-;51270:2;51284:47;;;25020:2;51255:18;;;54774:19;25056:34;54814:14;;;25036:55;-1:-1;;;25111:12;;;25104:39;25162:12;;;51241:245::o;51493:416::-;51693:2;51707:47;;;25413:2;51678:18;;;54774:19;-1:-1;;;54814:14;;;25429:44;25492:12;;;51664:245::o;51916:416::-;52116:2;52130:47;;;25743:2;52101:18;;;54774:19;-1:-1;;;54814:14;;;25759:44;25822:12;;;52087:245::o;52908:444::-;6692:37;;;53255:2;53240:18;;6692:37;;;;53338:2;53323:18;;6692:37;53091:2;53076:18;;53062:290::o;53359:214::-;55901:4;55890:16;;;;26723:35;;53482:2;53467:18;;53453:120::o;56802:117::-;-1:-1;;;;;55685:54;;56861:35;;56851:2;;56910:1;;56900:12;56851:2;56845:74;:::o
Swarm Source
ipfs://80c4b8398d3967fc1dc4314a40cc0cb71b1fc51b134aecdaf154d8a7b631fc45
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.