Contract Overview
Balance:
0 MATIC
Token:
My Name Tag:
Not Available
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8bfe39e64B32CF86B1eAB96406A67EbfA0521EDe
Contract Name:
DexilonTest_v11
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-04-21 */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint16); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } /** * @dev Collection of functions related to the address type */ library Address { /** * @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; 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Partial interface for a Chainlink Aggregator. */ interface AggregatorV3Interface { // latestRoundData should raise "No data present" // if he do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function latestRoundData() external view returns ( uint160 roundId, int answer, uint256 startedAt, uint256 updatedAt, uint160 answeredInRound ); } contract DexilonTest_v11 { using SafeERC20 for IERC20; struct userAssetParameters { string assetName; int256 assetBalance; uint256 assetLockedBalance; uint256 assetPrice; uint16 assetLeverage; } struct tradingArrayIndexed { bool isBuy; uint32 makerIndex; uint32 takerIndex; uint32 assetIndex; uint256 assetAmount; uint256 assetRate; uint256 tradeFee; uint16 makerLeverage; uint16 takerLeverage; string tradeId; } struct tradingArray { bool isBuy; address makerAddress; address takerAddress; string assetName; uint256 assetAmount; uint256 assetRate; uint256 tradeFee; uint16 makerLeverage; uint16 takerLeverage; string tradeId; } struct FeesArray { address userAddress; int feeAmount; } mapping(address => uint256) internal usersAvailableBalances; mapping(address => mapping (string => userAssetParameters)) internal usersAssetsData; mapping(address => uint256) public usersIndex; mapping(uint256 => address) public indexedAddresses; mapping(string => bool) internal checkAsset; uint256 public usersCount; string[] internal assetsNames; address payable public owner; event Deposit( address indexed depositor, uint256 amountUSDC, uint256 timestamp ); event Withdraw( address indexed user, uint256 amountUSDC, uint256 timestamp ); event Trade( bool isBuy, address indexed maker, address indexed taker, string asset, uint256 assetAmount, uint256 assetRate, uint256 tradeFee, uint16 makerLeverage, uint16 takerLeverage, string tradeId, uint256 timestamp ); uint8 internal constant DECIMALS_USDC = 6; uint8 internal constant DECIMALS_BTC = 18; int internal constant BTC_UNIT_FACTOR = int(10**DECIMALS_BTC); int internal constant ROUNDING_FACTOR = int(10**(DECIMALS_BTC-DECIMALS_USDC)); // Chainlink price feed for BTC/USD AggregatorV3Interface internal btcToUsdPriceFeed = AggregatorV3Interface(0x007A22900a3B98143368Bd5906f8E17e9867581b); // Chainlink price feed for USDC/USD AggregatorV3Interface internal usdcToUsdPriceFeed = AggregatorV3Interface(0x572dDec9087154dC5dfBB1546Bb62713147e0Ab0); // USDC test token (Mumbai Testnet) IERC20 internal depositToken = IERC20(0x7592A72A46D3165Dcc7BF0802D70812Af19471B3); constructor(address USDC_address) { owner = payable(msg.sender); // Base stable coin depositToken = IERC20(USDC_address); // Supported assets assetsNames = ['BTC', 'ETH', 'SOL', 'ADA', 'NEAR', 'MATIC', 'LUNA', 'DOGE']; for (uint16 i=0; i<assetsNames.length; i++) { checkAsset[assetsNames[i]] = true; } // Initiating user index usersIndex[owner] = 0; indexedAddresses[0] = owner; usersCount = 1; } modifier onlyOwner() { require(msg.sender == owner); _; } function addNewSupportedAsset(string memory _newAssetName) public onlyOwner returns (bool) { require(checkAsset[_newAssetName] == false, "Asset already exists!"); assetsNames.push(_newAssetName); checkAsset[_newAssetName] = true; return true; } /** * @notice Convert btc to usdc by Chainlink market price */ function btcToUsdcMarketConvert(int assetAmount) public view returns (int) { (, int signedBtcToUsdPrice, , , ) = btcToUsdPriceFeed.latestRoundData(); (, int signedUsdcToUsdPrice, , , ) = usdcToUsdPriceFeed.latestRoundData(); return (signedBtcToUsdPrice*assetAmount/signedUsdcToUsdPrice)/int(10**(DECIMALS_BTC - DECIMALS_USDC)); } /** * @dev Deposit token into contract and open user account * @param amountUSDC Amount of token in smallest units */ function deposit(uint256 amountUSDC) public { depositToken.safeTransferFrom(msg.sender, address(this), amountUSDC); usersAvailableBalances[msg.sender] += amountUSDC * uint(ROUNDING_FACTOR); /// indexing users if (usersIndex[msg.sender] == 0 && msg.sender != owner) { usersIndex[msg.sender] = usersCount; indexedAddresses[usersCount] = msg.sender; usersCount += 1; } emit Deposit(msg.sender, amountUSDC, block.timestamp); } /// @notice calculate total locked balance for all assets function calculateTotalLocked(address userAddress) internal view returns(uint256 totalLocked) { totalLocked = 0; for (uint16 i=0; i < assetsNames.length; i++) { totalLocked += usersAssetsData[userAddress][assetsNames[i]].assetLockedBalance; } } /** * @dev Read all balances for the user * @param user Address of the user is the id of account */ function getUserBalances(address user) public view returns (uint256 , uint256 , userAssetParameters[] memory ) { uint256 availableBalance = usersAvailableBalances[user] / uint(ROUNDING_FACTOR); uint256 lockedBalance = calculateTotalLocked(user) / uint(ROUNDING_FACTOR); userAssetParameters[] memory userAssets = new userAssetParameters[](assetsNames.length); for (uint256 i=0; i < assetsNames.length; i++) { userAssets[i] = _setOutputDecimalsForAsset(usersAssetsData[user][assetsNames[i]]); } return (availableBalance, lockedBalance, userAssets); } /** * @dev convert locked balance and asset price to USDC decimals * @param assetData struct userAssetParameters for current asset of the user */ function _setOutputDecimalsForAsset(userAssetParameters memory assetData) internal pure returns (userAssetParameters memory assetDataModified) { // struct userAssetParameters { // 0 string assetName; // 1 int256 assetBalance; // 2 uint256 assetLockedBalance; // 3 uint256 assetPrice; // 4 uint16 assetLeverage; } assetDataModified.assetName = assetData.assetName; assetDataModified.assetBalance = assetData.assetBalance; // BTC decimals assetDataModified.assetLockedBalance = assetData.assetLockedBalance / uint(ROUNDING_FACTOR); // USDC decimals assetDataModified.assetPrice = assetData.assetPrice / uint(ROUNDING_FACTOR); // USDC decimals assetDataModified.assetLeverage = assetData.assetLeverage; } /** * @dev transfer amount to the user * @param userAddress transfer to this address * @param amountUSDC amount of the deposited token in smallest units */ function withdraw(address userAddress, uint256 amountUSDC) public onlyOwner { require(usersAvailableBalances[userAddress] >= amountUSDC * uint(ROUNDING_FACTOR), 'Insufficient balance!'); depositToken.safeTransfer(userAddress, amountUSDC); usersAvailableBalances[userAddress] -= amountUSDC * uint(ROUNDING_FACTOR); emit Withdraw(userAddress, amountUSDC, block.timestamp); } /// @dev development ONLY function withdrawAll() public onlyOwner { depositToken.safeTransfer(owner, depositToken.balanceOf(address(this))); if (address(this).balance > 0) { owner.transfer(address(this).balance); } } /// @dev development ONLY function resetUserAccount(address userAddress, uint256 userAvailableBalance, uint256 userLockedBalance, string memory asset, int256 userAssetBalance, uint16 leverage) public onlyOwner { usersAvailableBalances[userAddress] = userAvailableBalance; userAssetParameters memory zeroParameters; zeroParameters.assetName = ''; zeroParameters.assetBalance = 0; zeroParameters.assetLockedBalance = 0; zeroParameters.assetPrice = 0; zeroParameters.assetLeverage = 1; for (uint16 i=0; i<assetsNames.length; i++) { usersAssetsData[userAddress][assetsNames[i]] = zeroParameters; usersAssetsData[userAddress][assetsNames[i]].assetName = assetsNames[i]; usersAssetsData[userAddress][assetsNames[i]].assetLeverage = leverage; } usersAssetsData[userAddress][asset].assetBalance = userAssetBalance; usersAssetsData[userAddress][asset].assetLockedBalance = userLockedBalance; if (userAssetBalance != 0){ usersAssetsData[userAddress][asset].assetPrice = uint((int(userLockedBalance * leverage) * BTC_UNIT_FACTOR) / abs(userAssetBalance));} } /** * @dev trade between a maker and a taker * @param isBuy true if this is a buy order trade, false if a sell order trade * @param maker the address of the user who created the order * @param taker the address of the user who accepted the order * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL') * @param assetAmount the amount of the asset in Wei (smallest unit) * @param assetRate price of 1 asset coin in the smallest unit of USDC * @param tradeFee absolute fee amount in the smallest unit of USDC from taker to maker * @param makerLeverage leverage of the maker for the asset * @param takerLeverage leverage of the taker for the asset * @param tradeId incoming id of the trade as as string **/ function trade( bool isBuy, address maker, address taker, string memory asset, uint256 assetAmount, uint256 assetRate, uint256 tradeFee, uint16 makerLeverage, uint16 takerLeverage, string memory tradeId ) public onlyOwner { require(checkAsset[asset], string(abi.encodePacked('Unknown Asset! TradeId:', tradeId))); updateUserLeverage(maker, asset, makerLeverage, tradeId); updateUserLeverage(taker, asset, takerLeverage, tradeId); updateUserBalances(maker, asset, (isBuy ? int(1) : int(-1))*int(assetAmount), int(assetRate), int(tradeFee), tradeId); updateUserBalances(taker, asset, (isBuy ? int(-1) : int(1))*int(assetAmount), int(assetRate), -int(tradeFee), tradeId); emit Trade(isBuy, maker, taker, asset, assetAmount, assetRate, tradeFee, makerLeverage, takerLeverage, tradeId, block.timestamp); } /** * @dev update the balances of one of the traders * @param user user address whose balances are updated * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL') * @param assetAmount the amount of the asset in Wei (smallest unit) * @param assetRate price of 1 asset coin in the smallest unit of USDC * @param tradeFee absolute fee amount in the smallest unit of USDC * @param tradeId incoming id of the trade as as string **/ function updateUserBalances( address user, string memory asset, int assetAmount, int assetRate, int tradeFee, string memory tradeId ) internal { int assetBalance = usersAssetsData[user][asset].assetBalance; int lockedBalance = int(usersAssetsData[user][asset].assetLockedBalance); int assetPrice = int(usersAssetsData[user][asset].assetPrice); int leverage = int(uint256(usersAssetsData[user][asset].assetLeverage)) * BTC_UNIT_FACTOR; int availableBalance = int(usersAvailableBalances[user]) + tradeFee * ROUNDING_FACTOR; if(bytes(usersAssetsData[user][asset].assetName).length == 0){ usersAssetsData[user][asset].assetName = asset;} assetRate = assetRate * ROUNDING_FACTOR; require(assetRate > 0, string(abi.encodePacked('Zero Rate! TradeId:', tradeId))); if (((assetAmount > 0 && assetBalance < 0) || (assetAmount < 0 && assetBalance > 0)) && abs(assetAmount) > abs(assetBalance)) { availableBalance = availableBalance + abs(assetBalance)*assetPrice/(leverage) - assetBalance*(assetPrice - assetRate)/(BTC_UNIT_FACTOR); lockedBalance = lockedBalance - abs(assetBalance*assetPrice/(leverage)); assetAmount = assetAmount + assetBalance; assetBalance = 0; } if (assetBalance == 0 || (assetBalance < 0 && assetAmount < 0) || (assetBalance > 0 && assetAmount > 0)) { availableBalance = availableBalance - abs(assetAmount*assetRate/(leverage)); lockedBalance = lockedBalance + abs(assetAmount*assetRate/(leverage)); assetPrice = (assetBalance*assetPrice + assetAmount*assetRate) / (assetBalance + assetAmount); } else { // (assetBalance > 0 && assetAmount < 0) // (assetBalance < 0 && assetAmount > 0) availableBalance = availableBalance + abs(assetAmount)*assetPrice/(leverage) + assetAmount*(assetPrice - assetRate)/(BTC_UNIT_FACTOR); lockedBalance = lockedBalance - abs(assetAmount*assetPrice/(leverage)); } require(availableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId))); require(lockedBalance >= 0, string(abi.encodePacked('LockedBalance < 0! TradeId:', tradeId))); usersAvailableBalances[user] = uint256(availableBalance); usersAssetsData[user][asset].assetLockedBalance = uint256(lockedBalance); usersAssetsData[user][asset].assetPrice = uint256(assetPrice); usersAssetsData[user][asset].assetBalance = assetBalance + assetAmount; } /** * @dev update available balance and asset locked balance for new leverage * @param user user address whose balances are updated * @param asset string id of the supported asset ('BTC','ETH','XRP','SOL') * @param assetLeverage leverage of the user for the asset * @param tradeId incoming id of the trade as as string **/ function updateUserLeverage( address user, string memory asset, uint16 assetLeverage, string memory tradeId ) internal { int newAvailableBalance; int newLockedBalance; require(assetLeverage > 0, string(abi.encodePacked('Zero Leverage! TradeId:', tradeId))); if (usersAssetsData[user][asset].assetLockedBalance == 0) { usersAssetsData[user][asset].assetLeverage = assetLeverage; } if (usersAssetsData[user][asset].assetLeverage != assetLeverage){ newLockedBalance = ((int(usersAssetsData[user][asset].assetPrice) * abs(int(usersAssetsData[user][asset].assetBalance))) / int(uint256(assetLeverage))) / BTC_UNIT_FACTOR; newAvailableBalance = int(usersAvailableBalances[user]) - (newLockedBalance - int(usersAssetsData[user][asset].assetLockedBalance)); require(newAvailableBalance >= 0, string(abi.encodePacked('Insufficient balance! TradeId:', tradeId))); usersAvailableBalances[user] = uint256(newAvailableBalance); usersAssetsData[user][asset].assetLockedBalance = uint256(newLockedBalance); usersAssetsData[user][asset].assetLeverage = assetLeverage; } } // struct tradingArrayIndexed { // bool isBuy; // uint32 makerIndex; // uint32 takerIndex; // uint32 assetIndex; // uint256 assetAmount; // uint256 assetRate; // uint256 tradeFee; // uint16 makerLeverage; // uint16 takerLeverage; // string tradeId; // } /** * @dev Batch trading with indexes for users * @param batchTradingArray array of structs tradingArrayIndexed **/ function batchTradeIndexed(tradingArrayIndexed[] memory batchTradingArray) public onlyOwner { uint256 max = batchTradingArray.length; for (uint256 i=0; i < max; i++) { trade( batchTradingArray[i].isBuy, indexedAddresses[batchTradingArray[i].makerIndex], indexedAddresses[batchTradingArray[i].takerIndex], assetsNames[batchTradingArray[i].assetIndex], batchTradingArray[i].assetAmount, batchTradingArray[i].assetRate, batchTradingArray[i].tradeFee, batchTradingArray[i].makerLeverage, batchTradingArray[i].takerLeverage, batchTradingArray[i].tradeId ); } } // struct tradingArray { // bool isBuy; // address makerAddress; // address takerAddress; // string assetName; // uint256 assetAmount; // uint256 assetRate; // uint256 tradeFee; // uint16 makerLeverage; // uint16 takerLeverage; // string tradeId; // } /** * @dev Batch trading with addresses * @param batchTradingArray array of structs tradingArray **/ function batchTrade(tradingArray[] memory batchTradingArray) public onlyOwner { uint256 max = batchTradingArray.length; for (uint256 i=0; i < max; i++) { trade( batchTradingArray[i].isBuy, batchTradingArray[i].makerAddress, batchTradingArray[i].takerAddress, batchTradingArray[i].assetName, batchTradingArray[i].assetAmount, batchTradingArray[i].assetRate, batchTradingArray[i].tradeFee, batchTradingArray[i].makerLeverage, batchTradingArray[i].takerLeverage, batchTradingArray[i].tradeId ); } } /** * @notice Batch pay funding rate fees * @dev feeAmount should have 18 decimals * @param batchFees array of structs feesArray (userAddress, feeAmount) **/ function batchFundingRateFees(FeesArray[] memory batchFees) public onlyOwner { uint256 max = batchFees.length; for (uint256 i=0; i < max; i++) { if (batchFees[i].feeAmount < 0 ) { require(usersAvailableBalances[batchFees[i].userAddress] >= uint(-batchFees[i].feeAmount), "Not enough balance!"); usersAvailableBalances[batchFees[i].userAddress] -= uint(-batchFees[i].feeAmount); } else { usersAvailableBalances[batchFees[i].userAddress] += uint(batchFees[i].feeAmount); } } } function abs(int x) private pure returns (int) { return x >= 0 ? x : -x; } }
[{"inputs":[{"internalType":"address","name":"USDC_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"string","name":"asset","type":"string"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradeFee","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"indexed":false,"internalType":"string","name":"tradeId","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUSDC","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"string","name":"_newAssetName","type":"string"}],"name":"addNewSupportedAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"int256","name":"feeAmount","type":"int256"}],"internalType":"struct DexilonTest_v11.FeesArray[]","name":"batchFees","type":"tuple[]"}],"name":"batchFundingRateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"makerAddress","type":"address"},{"internalType":"address","name":"takerAddress","type":"address"},{"internalType":"string","name":"assetName","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v11.tradingArray[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"uint32","name":"makerIndex","type":"uint32"},{"internalType":"uint32","name":"takerIndex","type":"uint32"},{"internalType":"uint32","name":"assetIndex","type":"uint32"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"internalType":"struct DexilonTest_v11.tradingArrayIndexed[]","name":"batchTradingArray","type":"tuple[]"}],"name":"batchTradeIndexed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"assetAmount","type":"int256"}],"name":"btcToUsdcMarketConvert","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"int256","name":"assetBalance","type":"int256"},{"internalType":"uint256","name":"assetLockedBalance","type":"uint256"},{"internalType":"uint256","name":"assetPrice","type":"uint256"},{"internalType":"uint16","name":"assetLeverage","type":"uint16"}],"internalType":"struct DexilonTest_v11.userAssetParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"userAvailableBalance","type":"uint256"},{"internalType":"uint256","name":"userLockedBalance","type":"uint256"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"int256","name":"userAssetBalance","type":"int256"},{"internalType":"uint16","name":"leverage","type":"uint16"}],"name":"resetUserAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"string","name":"asset","type":"string"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"assetRate","type":"uint256"},{"internalType":"uint256","name":"tradeFee","type":"uint256"},{"internalType":"uint16","name":"makerLeverage","type":"uint16"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"string","name":"tradeId","type":"string"}],"name":"trade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amountUSDC","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600880546001600160a01b0319908116727a22900a3b98143368bd5906f8e17e9867581b1790915560098054821673572ddec9087154dc5dfbb1546bb62713147e0ab0179055600a8054909116737592a72a46d3165dcc7bf0802d70812af19471b31790553480156200007657600080fd5b50604051620036963803806200369683398101604081905262000099916200041b565b60078054336001600160a01b031991821617909155600a80549091166001600160a01b0383161790556040805161014081018252600361010082018181526242544360e81b6101208401528252825180840184528181526208aa8960eb1b60208083019190915280840191909152835180850185528281526214d3d360ea1b8183015283850152835180850185529182526241444160e81b828201526060830191909152825180840184526004808252632722a0a960e11b8284015260808401919091528351808501855260058152644d4154494360d81b8184015260a084015283518085018552818152634c554e4160e01b8184015260c08401528351808501909452835263444f474560e01b9083015260e0810191909152620001c3906006906008620002b2565b5060005b60065461ffff8216101562000242576001600460068361ffff1681548110620001f457620001f46200044d565b906000526020600020016040516200020d9190620004a0565b908152604051908190036020019020805491151560ff1990921691909117905580620002398162000544565b915050620001c7565b5050600780546001600160a01b0390811660009081526002602090815260408220829055925490805260039092527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80546001600160a01b03191692909116919091179055600160055562000575565b82805482825590600052602060002090810192821562000304579160200282015b82811115620003045782518051620002f391849160209091019062000316565b5091602001919060010190620002d3565b5062000312929150620003a1565b5090565b828054620003249062000463565b90600052602060002090601f01602090048101928262000348576000855562000393565b82601f106200036357805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039357825182559160200191906001019062000376565b5062000312929150620003c2565b8082111562000312576000620003b88282620003d9565b50600101620003a1565b5b80821115620003125760008155600101620003c3565b508054620003e79062000463565b6000825580601f10620003f8575050565b601f016020900490600052602060002090810190620004189190620003c2565b50565b6000602082840312156200042e57600080fd5b81516001600160a01b03811681146200044657600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200047857607f821691505b602082108114156200049a57634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c915080831680620004bd57607f831692505b6020808410821415620004de57634e487b7160e01b86526022600452602486fd5b818015620004f55760018114620005075762000536565b60ff1986168952848901965062000536565b60008a81526020902060005b868110156200052e5781548b82015290850190830162000513565b505084890196505b509498975050505050505050565b600061ffff808316818114156200056b57634e487b7160e01b600052601160045260246000fd5b6001019392505050565b61311180620005856000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638e2f229f11610097578063bec321a411610066578063bec321a414610225578063c845d9b714610238578063e4de0f5a1461024b578063f3fef3a31461025e57600080fd5b80638e2f229f146101ad578063abd3f612146101cd578063b6b55f25146101ef578063bb7661b71461020257600080fd5b80637022002b116100d35780637022002b1461016c578063853828b61461017f5780638a82fac5146101875780638da5cb5b1461019a57600080fd5b80632972a248146100fa57806363c7b3dc1461010f5780636ba13a8214610155575b600080fd5b61010d6101083660046123a3565b610271565b005b61013861011d36600461251f565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e60055481565b60405190815260200161014c565b61010d61017a366004612558565b6104e5565b61010d610833565b61010d6101953660046125d4565b610915565b600754610138906001600160a01b031681565b61015e6101bb3660046126aa565b60026020526000908152604090205481565b6101e06101db3660046126aa565b610a6b565b60405161014c9392919061271f565b61010d6101fd36600461251f565b610ca7565b6102156102103660046127c6565b610dba565b604051901515815260200161014c565b61010d6102333660046127fb565b610ebb565b61010d610246366004612976565b610f7e565b61015e61025936600461251f565b61117d565b61010d61026c366004612a2a565b6112bc565b6007546001600160a01b0316331461028857600080fd5b805160005b818110156104e0576104ce8382815181106102aa576102aa612a56565b602002602001015160000151600360008685815181106102cc576102cc612a56565b60200260200101516020015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b03166003600087868151811061031657610316612a56565b60200260200101516040015163ffffffff16815260200190815260200160002060009054906101000a90046001600160a01b0316600687868151811061035e5761035e612a56565b60200260200101516060015163ffffffff168154811061038057610380612a56565b90600052602060002001805461039590612a6c565b80601f01602080910402602001604051908101604052809291908181526020018280546103c190612a6c565b801561040e5780601f106103e35761010080835404028352916020019161040e565b820191906000526020600020905b8154815290600101906020018083116103f157829003601f168201915b505050505087868151811061042557610425612a56565b60200260200101516080015188878151811061044357610443612a56565b602002602001015160a0015189888151811061046157610461612a56565b602002602001015160c001518a898151811061047f5761047f612a56565b602002602001015160e001518b8a8151811061049d5761049d612a56565b602002602001015161010001518c8b815181106104bc576104bc612a56565b60200260200101516101200151610915565b806104d881612ab7565b91505061028d565b505050565b6007546001600160a01b031633146104fc57600080fd5b6001600160a01b038616600090815260208190526040902085905561051f6120f5565b60408051602080820183526000808352918452830181905290820181905260608201819052600160808301525b60065461ffff8216101561072b576001600160a01b0388166000908152600160205260409020600680548492919061ffff851690811061058e5761058e612a56565b906000526020600020016040516105a59190612ad2565b908152602001604051809103902060008201518160000190805190602001906105cf929190612128565b506020820151600182015560408201516002820155606082015160038201556080909101516004909101805461ffff191661ffff928316179055600680549091831690811061062057610620612a56565b90600052602060002001600160008a6001600160a01b03166001600160a01b0316815260200190815260200160002060068361ffff168154811061066657610666612a56565b9060005260206000200160405161067d9190612ad2565b908152602001604051809103902060000190805461069a90612a6c565b6106a59291906121ac565b506001600160a01b0388166000908152600160205260409020600680548592919061ffff85169081106106da576106da612a56565b906000526020600020016040516106f19190612ad2565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790558061072381612b6e565b91505061054c565b506001600160a01b038716600090815260016020526040908190209051849190610756908790612b90565b9081526020016040518091039020600101819055508460016000896001600160a01b03166001600160a01b031681526020019081526020016000208560405161079f9190612b90565b90815260405190819003602001902060020155821561082a576107c1836113ff565b6107cd6012600a612c90565b6107db61ffff851688612c9f565b6107e59190612cbe565b6107ef9190612d59565b6001600160a01b038816600090815260016020526040908190209051610816908790612b90565b908152604051908190036020019020600301555b50505050505050565b6007546001600160a01b0316331461084a57600080fd5b600754600a546040516370a0823160e01b81523060048201526108d2926001600160a01b039081169216906370a0823190602401602060405180830381865afa15801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190612d87565b600a546001600160a01b0316919061141f565b4715610913576007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610911573d6000803e3d6000fd5b505b565b6007546001600160a01b0316331461092c57600080fd5b60048760405161093c9190612b90565b908152604051602091819003820181205460ff169161095d91849101612da0565b604051602081830303815290604052906109935760405162461bcd60e51b815260040161098a9190612de5565b60405180910390fd5b506109a089888584611482565b6109ac88888484611482565b6109d48988888d6109bf576000196109c2565b60015b6109cc9190612cbe565b8888866117a7565b610a048888888d6109e65760016109ea565b6000195b6109f49190612cbe565b886109fe89612df8565b866117a7565b876001600160a01b0316896001600160a01b03167fa725452d7afd3dff5a0c9925ebcf78f3eafb33c3f2460f8f7d2c057897e020fa8c8a8a8a8a8a8a8a42604051610a5799989796959493929190612e15565b60405180910390a350505050505050505050565b600080606081610a7d60066012612e83565b610a8890600a612c90565b6001600160a01b038616600090815260208190526040902054610aab9190612ea6565b90506000610abb60066012612e83565b610ac690600a612c90565b610acf87611d5b565b610ad99190612ea6565b60065490915060009067ffffffffffffffff811115610afa57610afa61223c565b604051908082528060200260200182016040528015610b3357816020015b610b206120f5565b815260200190600190039081610b185790505b50905060005b600654811015610c99576001600160a01b038816600090815260016020526040902060068054610c6992919084908110610b7557610b75612a56565b90600052602060002001604051610b8c9190612ad2565b90815260200160405180910390206040518060a0016040529081600082018054610bb590612a6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610be190612a6c565b8015610c2e5780601f10610c0357610100808354040283529160200191610c2e565b820191906000526020600020905b815481529060010190602001808311610c1157829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260049091015461ffff16608090910152611deb565b828281518110610c7b57610c7b612a56565b60200260200101819052508080610c9190612ab7565b915050610b39565b509196909550909350915050565b600a54610cbf906001600160a01b0316333084611e6b565b610ccb60066012612e83565b610cd690600a612c90565b610ce09082612c9f565b3360009081526020819052604081208054909190610cff908490612eba565b909155505033600090815260026020526040902054158015610d2c57506007546001600160a01b03163314155b15610d7d57600580543360008181526002602090815260408083208590559382526003905291822080546001600160a01b031916909117905581546001929190610d77908490612eba565b90915550505b6040805182815242602082015233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a250565b6007546000906001600160a01b03163314610dd457600080fd5b600482604051610de49190612b90565b9081526040519081900360200190205460ff1615610e3c5760405162461bcd60e51b8152602060048201526015602482015274417373657420616c7265616479206578697374732160581b604482015260640161098a565b600680546001810182556000919091528251610e7f917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01906020850190612128565b506001600483604051610e929190612b90565b908152604051908190036020019020805491151560ff199092169190911790555060015b919050565b6007546001600160a01b03163314610ed257600080fd5b805160005b818110156104e057610f6c838281518110610ef457610ef4612a56565b602002602001015160000151848381518110610f1257610f12612a56565b602002602001015160200151858481518110610f3057610f30612a56565b602002602001015160400151868581518110610f4e57610f4e612a56565b60200260200101516060015187868151811061042557610425612a56565b80610f7681612ab7565b915050610ed7565b6007546001600160a01b03163314610f9557600080fd5b805160005b818110156104e0576000838281518110610fb657610fb6612a56565b60200260200101516020015112156110f757828181518110610fda57610fda612a56565b602002602001015160200151610fef90612df8565b60008085848151811061100457611004612a56565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000205410156110755760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f7567682062616c616e63652160681b604482015260640161098a565b82818151811061108757611087612a56565b60200260200101516020015161109c90612df8565b6000808584815181106110b1576110b1612a56565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546110ec9190612ed2565b9091555061116b9050565b82818151811061110957611109612a56565b60200260200101516020015160008085848151811061112a5761112a612a56565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111659190612eba565b90915550505b8061117581612ab7565b915050610f9a565b600080600860009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f79190612ee9565b5050509150506000600960009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190612ee9565b5050509150506006601261128a9190612e83565b61129590600a612c90565b816112a08685612cbe565b6112aa9190612d59565b6112b49190612d59565b949350505050565b6007546001600160a01b031633146112d357600080fd5b6112df60066012612e83565b6112ea90600a612c90565b6112f49082612c9f565b6001600160a01b03831660009081526020819052604090205410156113535760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e742062616c616e63652160581b604482015260640161098a565b600a5461136a906001600160a01b0316838361141f565b61137660066012612e83565b61138190600a612c90565b61138b9082612c9f565b6001600160a01b038316600090815260208190526040812080549091906113b3908490612ed2565b9091555050604080518281524260208201526001600160a01b038416917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a25050565b6000808212156114175761141282612df8565b611419565b815b92915050565b6040516001600160a01b0383166024820152604481018290526104e090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ea9565b60008060008461ffff16118360405160200161149e9190612f41565b604051602081830303815290604052906114cb5760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b0386166000908152600160205260409081902090516114f3908790612b90565b90815260200160405180910390206002015460001415611560576001600160a01b038616600090815260016020526040908190209051859190611537908890612b90565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790555b6001600160a01b03861660009081526001602052604090819020905161ffff8616919061158e908890612b90565b9081526040519081900360200190206004015461ffff161461179f576115b66012600a612c90565b6001600160a01b03871660009081526001602052604090819020905161ffff8716916115fe916115e7908a90612b90565b9081526020016040518091039020600101546113ff565b6001600160a01b038916600090815260016020526040908190209051611625908a90612b90565b9081526020016040518091039020600301546116419190612cbe565b61164b9190612d59565b6116559190612d59565b6001600160a01b03871660009081526001602052604090819020905191925090611680908790612b90565b9081526020016040518091039020600201548161169d9190612f79565b6001600160a01b0387166000908152602081905260409020546116c09190612f79565b91506000821215836040516020016116d89190612fb8565b604051602081830303815290604052906117055760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b038616600090815260208181526040808320859055600190915290819020905182919061173b908890612b90565b9081526040805160209281900383018120600201939093556001600160a01b0389166000908152600190925290208591611776908890612b90565b908152604051908190036020019020600401805461ffff9290921661ffff199092169190911790555b505050505050565b6001600160a01b03861660009081526001602052604080822090516117cd908890612b90565b9081526020016040518091039020600101549050600060016000896001600160a01b03166001600160a01b03168152602001908152602001600020876040516118169190612b90565b9081526040805160209281900383018120600201546001600160a01b038c1660009081526001909452918320919350611850908a90612b90565b90815260405190819003602001902060030154905060006118736012600a612c90565b6001600160a01b038b1660009081526001602052604090819020905161189a908c90612b90565b908152604051908190036020019020600401546118bb919061ffff16612cbe565b905060006118cb60066012612e83565b6118d690600a612c90565b6118e09088612cbe565b6001600160a01b038c166000908152602081905260409020546119039190612ffd565b6001600160a01b038c166000908152600160205260409081902090519192509061192e908c90612b90565b908152604051908190036020019020805461194890612a6c565b151590506119a0576001600160a01b038b166000908152600160205260409081902090518b919061197a908390612b90565b9081526020016040518091039020600001908051906020019061199e929190612128565b505b6119ac60066012612e83565b6119b790600a612c90565b6119c19089612cbe565b975060008813866040516020016119d8919061303e565b60405160208183030381529060405290611a055760405162461bcd60e51b815260040161098a9190612de5565b50600089138015611a165750600085125b80611a2c5750600089128015611a2c5750600085135b8015611a475750611a3c856113ff565b611a458a6113ff565b135b15611ae557611a586012600a612c90565b611a628985612f79565b611a6c9087612cbe565b611a769190612d59565b8284611a81886113ff565b611a8b9190612cbe565b611a959190612d59565b611a9f9083612ffd565b611aa99190612f79565b9050611ac882611ab98588612cbe565b611ac39190612d59565b6113ff565b611ad29085612f79565b9350611ade858a612ffd565b9850600094505b841580611afd5750600085128015611afd5750600089125b80611b135750600085138015611b135750600089135b15611b8557611b2682611ab98a8c612cbe565b611b309082612f79565b9050611b4082611ab98a8c612cbe565b611b4a9085612ffd565b9350611b568986612ffd565b611b60898b612cbe565b611b6a8588612cbe565b611b749190612ffd565b611b7e9190612d59565b9250611bff565b611b916012600a612c90565b611b9b8985612f79565b611ba5908b612cbe565b611baf9190612d59565b8284611bba8c6113ff565b611bc49190612cbe565b611bce9190612d59565b611bd89083612ffd565b611be29190612ffd565b9050611bf282611ab9858c612cbe565b611bfc9085612f79565b93505b600081121586604051602001611c159190612fb8565b60405160208183030381529060405290611c425760405162461bcd60e51b815260040161098a9190612de5565b50600084121586604051602001611c599190613079565b60405160208183030381529060405290611c865760405162461bcd60e51b815260040161098a9190612de5565b506001600160a01b038b166000908152602081815260408083208490556001909152908190209051859190611cbc908d90612b90565b9081526040805160209281900383018120600201939093556001600160a01b038e166000908152600190925290208491611cf7908d90612b90565b90815260405190819003602001902060030155611d148986612ffd565b6001600160a01b038c16600090815260016020526040908190209051611d3b908d90612b90565b908152604051908190036020019020600101555050505050505050505050565b6000805b60065461ffff82161015611de5576001600160a01b03831660009081526001602052604090206006805461ffff8416908110611d9d57611d9d612a56565b90600052602060002001604051611db49190612ad2565b90815260200160405180910390206002015482611dd19190612eba565b915080611ddd81612b6e565b915050611d5f565b50919050565b611df36120f5565b8151815260208083015190820152611e0d60066012612e83565b611e1890600a612c90565b8260400151611e279190612ea6565b6040820152611e3860066012612e83565b611e4390600a612c90565b8260600151611e529190612ea6565b606082015260809182015161ffff169181019190915290565b6040516001600160a01b0380851660248301528316604482015260648101829052611ea39085906323b872dd60e01b9060840161144b565b50505050565b6000611efe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f7b9092919063ffffffff16565b8051909150156104e05780806020019051810190611f1c91906130be565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161098a565b6060611f8a8484600085611f94565b90505b9392505050565b606082471015611ff55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161098a565b843b6120435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161098a565b600080866001600160a01b0316858760405161205f9190612b90565b60006040518083038185875af1925050503d806000811461209c576040519150601f19603f3d011682016040523d82523d6000602084013e6120a1565b606091505b50915091506120b18282866120bc565b979650505050505050565b606083156120cb575081611f8d565b8251156120db5782518084602001fd5b8160405162461bcd60e51b815260040161098a9190612de5565b6040518060a0016040528060608152602001600081526020016000815260200160008152602001600061ffff1681525090565b82805461213490612a6c565b90600052602060002090601f016020900481019282612156576000855561219c565b82601f1061216f57805160ff191683800117855561219c565b8280016001018555821561219c579182015b8281111561219c578251825591602001919060010190612181565b506121a8929150612227565b5090565b8280546121b890612a6c565b90600052602060002090601f0160209004810192826121da576000855561219c565b82601f106121eb578054855561219c565b8280016001018555821561219c57600052602060002091601f016020900482015b8281111561219c57825482559160010191906001019061220c565b5b808211156121a85760008155600101612228565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff811182821017156122765761227661223c565b60405290565b6040805190810167ffffffffffffffff811182821017156122765761227661223c565b604051601f8201601f1916810167ffffffffffffffff811182821017156122c8576122c861223c565b604052919050565b600067ffffffffffffffff8211156122ea576122ea61223c565b5060051b60200190565b801515811461091157600080fd5b8035610eb6816122f4565b803563ffffffff81168114610eb657600080fd5b803561ffff81168114610eb657600080fd5b600082601f83011261234457600080fd5b813567ffffffffffffffff81111561235e5761235e61223c565b612371601f8201601f191660200161229f565b81815284602083860101111561238657600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156123b657600080fd5b823567ffffffffffffffff808211156123ce57600080fd5b818501915085601f8301126123e257600080fd5b81356123f56123f0826122d0565b61229f565b81815260059190911b8301840190848101908883111561241457600080fd5b8585015b83811015612512578035858111156124305760008081fd5b8601610140818c03601f19018113156124495760008081fd5b612451612252565b61245c8a8401612302565b8152604061246b81850161230d565b8b830152606061247c81860161230d565b828401526080915061248f82860161230d565b818401525060a0808501358284015260c0915081850135818401525060e0808501358284015261010091506124c5828601612321565b908301526101206124d7858201612321565b838301529284013592898411156124f057600091508182fd5b6124fe8f8d86880101612333565b908301525085525050918601918601612418565b5098975050505050505050565b60006020828403121561253157600080fd5b5035919050565b6001600160a01b038116811461091157600080fd5b8035610eb681612538565b60008060008060008060c0878903121561257157600080fd5b863561257c81612538565b95506020870135945060408701359350606087013567ffffffffffffffff8111156125a657600080fd5b6125b289828a01612333565b935050608087013591506125c860a08801612321565b90509295509295509295565b6000806000806000806000806000806101408b8d0312156125f457600080fd5b6125fd8b612302565b995061260b60208c0161254d565b985061261960408c0161254d565b975060608b013567ffffffffffffffff8082111561263657600080fd5b6126428e838f01612333565b985060808d0135975060a08d0135965060c08d0135955061266560e08e01612321565b94506126746101008e01612321565b93506101208d013591508082111561268b57600080fd5b506126988d828e01612333565b9150509295989b9194979a5092959850565b6000602082840312156126bc57600080fd5b8135611f8d81612538565b60005b838110156126e25781810151838201526020016126ca565b83811115611ea35750506000910152565b6000815180845261270b8160208601602086016126c7565b601f01601f19169290920160200192915050565b600060608083018684526020868186015260408381870152828751808552608094508488019150848160051b890101848a0160005b838110156127b457607f198b8403018552815160a0815181865261277a828701826126f3565b838b0151878c0152898401518a8801528c8401518d880152928b015161ffff16958b01959095525094870194925090860190600101612754565b50909c9b505050505050505050505050565b6000602082840312156127d857600080fd5b813567ffffffffffffffff8111156127ef57600080fd5b6112b484828501612333565b6000602080838503121561280e57600080fd5b823567ffffffffffffffff8082111561282657600080fd5b818501915085601f83011261283a57600080fd5b81356128486123f0826122d0565b81815260059190911b8301840190848101908883111561286757600080fd5b8585015b838110156125125780358581111561288257600080fd5b8601610140818c03601f190181131561289a57600080fd5b6128a2612252565b6128ad8a8401612302565b81526128bb6040840161254d565b8a8201526128cb6060840161254d565b6040820152608080840135898111156128e45760008081fd5b6128f28f8d83880101612333565b60608401525060a0808501358284015260c0915081850135818401525060e080850135828401526101009150612929828601612321565b9083015261012061293b858201612321565b8383015292840135928984111561295457600091508182fd5b6129628f8d86880101612333565b90830152508552505091860191860161286b565b6000602080838503121561298957600080fd5b823567ffffffffffffffff8111156129a057600080fd5b8301601f810185136129b157600080fd5b80356129bf6123f0826122d0565b81815260069190911b820183019083810190878311156129de57600080fd5b928401925b828410156120b157604084890312156129fc5760008081fd5b612a0461227c565b8435612a0f81612538565b815284860135868201528252604090930192908401906129e3565b60008060408385031215612a3d57600080fd5b8235612a4881612538565b946020939093013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680612a8057607f821691505b60208210811415611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612acb57612acb612aa1565b5060010190565b600080835481600182811c915080831680612aee57607f831692505b6020808410821415612b0e57634e487b7160e01b86526022600452602486fd5b818015612b225760018114612b3357612b60565b60ff19861689528489019650612b60565b60008a81526020902060005b86811015612b585781548b820152908501908301612b3f565b505084890196505b509498975050505050505050565b600061ffff80831681811415612b8657612b86612aa1565b6001019392505050565b60008251612ba28184602087016126c7565b9190910192915050565b600181815b80851115612be7578160001904821115612bcd57612bcd612aa1565b80851615612bda57918102915b93841c9390800290612bb1565b509250929050565b600082612bfe57506001611419565b81612c0b57506000611419565b8160018114612c215760028114612c2b57612c47565b6001915050611419565b60ff841115612c3c57612c3c612aa1565b50506001821b611419565b5060208310610133831016604e8410600b8410161715612c6a575081810a611419565b612c748383612bac565b8060001904821115612c8857612c88612aa1565b029392505050565b6000611f8d60ff841683612bef565b6000816000190483118215151615612cb957612cb9612aa1565b500290565b60006001600160ff1b0381841382841380821686840486111615612ce457612ce4612aa1565b600160ff1b6000871282811687830589121615612d0357612d03612aa1565b60008712925087820587128484161615612d1f57612d1f612aa1565b87850587128184161615612d3557612d35612aa1565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b600082612d6857612d68612d43565b600160ff1b821460001984141615612d8257612d82612aa1565b500590565b600060208284031215612d9957600080fd5b5051919050565b7f556e6b6e6f776e2041737365742120547261646549643a000000000000000000815260008251612dd88160178501602087016126c7565b9190910160170192915050565b602081526000611f8d60208301846126f3565b6000600160ff1b821415612e0e57612e0e612aa1565b5060000390565b60006101208b15158352806020840152612e318184018c6126f3565b905089604084015288606084015287608084015261ffff80881660a085015280871660c08501525082810360e0840152612e6b81866126f3565b915050826101008301529a9950505050505050505050565b600060ff821660ff841680821015612e9d57612e9d612aa1565b90039392505050565b600082612eb557612eb5612d43565b500490565b60008219821115612ecd57612ecd612aa1565b500190565b600082821015612ee457612ee4612aa1565b500390565b600080600080600060a08688031215612f0157600080fd5b8551612f0c81612538565b809550506020860151935060408601519250606086015191506080860151612f3381612538565b809150509295509295909350565b7f5a65726f204c657665726167652120547261646549643a000000000000000000815260008251612dd88160178501602087016126c7565b60008083128015600160ff1b850184121615612f9757612f97612aa1565b6001600160ff1b0384018313811615612fb257612fb2612aa1565b50500390565b7f496e73756666696369656e742062616c616e63652120547261646549643a0000815260008251612ff081601e8501602087016126c7565b91909101601e0192915050565b600080821280156001600160ff1b038490038513161561301f5761301f612aa1565b600160ff1b839003841281161561303857613038612aa1565b50500190565b722d32b937902930ba3290902a3930b232a4b21d60691b81526000825161306c8160138501602087016126c7565b9190910160130192915050565b7f4c6f636b656442616c616e6365203c20302120547261646549643a00000000008152600082516130b181601b8501602087016126c7565b91909101601b0192915050565b6000602082840312156130d057600080fd5b8151611f8d816122f456fea264697066735822122065cdfd7cde1f41e9b0140f4d6939f2734beedf92add5141baed74f06afc3cb3064736f6c634300080a00330000000000000000000000007592a72a46d3165dcc7bf0802d70812af19471b3
Deployed ByteCode Sourcemap
13403:19572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30046:791;;;;;;:::i;:::-;;:::i;:::-;;14611:51;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;14611:51:0;;;;;;-1:-1:-1;;;;;5092:32:1;;;5074:51;;5062:2;5047:18;14611:51:0;;;;;;;;14727:25;;;;;;;;;5282::1;;;5270:2;5255:18;14727:25:0;5136:177:1;21289:1373:0;;;;;;:::i;:::-;;:::i;21005:245::-;;;:::i;23464:986::-;;;;;;:::i;:::-;;:::i;14801:28::-;;;;;-1:-1:-1;;;;;14801:28:0;;;14559:45;;;;;;:::i;:::-;;;;;;;;;;;;;;18710:644;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;17681:534::-;;;;;;:::i;:::-;;:::i;16786:289::-;;;;;;:::i;:::-;;:::i;:::-;;;10427:14:1;;10420:22;10402:41;;10390:2;10375:18;16786:289:0;10262:187:1;31318:731:0;;;;;;:::i;:::-;;:::i;32240:634::-;;;;;;:::i;:::-;;:::i;17161:371::-;;;;;;:::i;:::-;;:::i;20531:435::-;;;;;;:::i;:::-;;:::i;30046:791::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;30165:24;;30151:11:::1;30202:628;30224:3;30220:1;:7;30202:628;;;30249:569;30273:17;30291:1;30273:20;;;;;;;;:::i;:::-;;;;;;;:26;;;30318:16;:49;30335:17;30353:1;30335:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30318:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30318:49:0::1;30386:16;:49;30403:17;30421:1;30403:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30386:49;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30386:49:0::1;30454:11;30466:17;30484:1;30466:20;;;;;;;;:::i;:::-;;;;;;;:31;;;30454:44;;;;;;;;;;:::i;:::-;;;;;;;;30249:569;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30517:17;30535:1;30517:20;;;;;;;;:::i;:::-;;;;;;;:32;;;30568:17;30586:1;30568:20;;;;;;;;:::i;:::-;;;;;;;:30;;;30617:17;30635:1;30617:20;;;;;;;;:::i;:::-;;;;;;;:29;;;30665:17;30683:1;30665:20;;;;;;;;:::i;:::-;;;;;;;:34;;;30718:17;30736:1;30718:20;;;;;;;;:::i;:::-;;;;;;;:34;;;30771:17;30789:1;30771:20;;;;;;;;:::i;:::-;;;;;;;:28;;;30249:5;:569::i;:::-;30229:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30202:628;;;;30138:699;30046:791:::0;:::o;21289:1373::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;-1:-1:-1;;;;;21640:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;:58;;;21719:41:::1;;:::i;:::-;21771:29;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;21771:29:0;;;;;;21811:27;::::1;:31:::0;;;21853:33;;::::1;:37:::0;;;21901:25:::1;::::0;::::1;:29:::0;;;21972:1:::1;21941:28;::::0;::::1;:32:::0;21986:302:::1;22005:11;:18:::0;22003:20:::1;::::0;::::1;;21986:302;;;-1:-1:-1::0;;;;;22045:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;22074:11:::1;:14:::0;;22092;;22045:28;22074:11;:14:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22045:44;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;22045:61:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;22045:61:0::1;;::::0;;::::1;;::::0;;22178:11:::1;:14:::0;;:11;;:14;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22121:15;:28;22137:11;-1:-1:-1::0;;;;;22121:28:0::1;-1:-1:-1::0;;;;;22121:28:0::1;;;;;;;;;;;;22150:11;22162:1;22150:14;;;;;;;;;;:::i;:::-;;;;;;;;22121:44;;;;;;:::i;:::-;;;;;;;;;;;;;:54;;:71;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;22207:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;22236:11:::1;:14:::0;;22268:8;;22207:28;22236:11;:14:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;22207:44;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:58:::1;;:69:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;22207:69:0;;::::1;::::0;;;::::1;::::0;;22025:3;::::1;::::0;::::1;:::i;:::-;;;;21986:302;;;-1:-1:-1::0;;;;;;22300:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;22351:16;;22300:28;:35:::1;::::0;22329:5;;22300:35:::1;:::i;:::-;;;;;;;;;;;;;:48;;:67;;;;22435:17;22378:15;:28;22394:11;-1:-1:-1::0;;;;;22378:28:0::1;-1:-1:-1::0;;;;;22378:28:0::1;;;;;;;;;;;;22407:5;22378:35;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:54:::1;;:74:::0;22467:21;;22463:190:::1;;22629:21;22633:16;22629:3;:21::i;:::-;15581:16;15522:2;15581;:16;:::i;:::-;22563:28;;::::0;::::1;:17:::0;:28:::1;:::i;:::-;22559:52;;;;:::i;:::-;22558:92;;;;:::i;:::-;-1:-1:-1::0;;;;;22504:28:0;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;:35;;::::1;::::0;22533:5;;22504:35:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:46:::1;;:147:::0;22463:190:::1;21629:1033;21289:1373:::0;;;;;;:::o;21005:245::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;21082:5:::1;::::0;21089:12:::1;::::0;:37:::1;::::0;-1:-1:-1;;;21089:37:0;;21120:4:::1;21089:37;::::0;::::1;5074:51:1::0;21056:71:0::1;::::0;-1:-1:-1;;;;;21082:5:0;;::::1;::::0;21089:12:::1;::::0;:22:::1;::::0;5047:18:1;;21089:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21056:12;::::0;-1:-1:-1;;;;;21056:12:0::1;::::0;:71;:25:::1;:71::i;:::-;21152:21;:25:::0;21148:95:::1;;21194:5;::::0;:37:::1;::::0;-1:-1:-1;;;;;21194:5:0;;::::1;::::0;21209:21:::1;21194:37:::0;::::1;;;::::0;:5:::1;:37:::0;:5;:37;21209:21;21194:5;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21148:95;21005:245::o:0;23464:986::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;23810:10:::1;23821:5;23810:17;;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;;::::0;23836:52:::1;::::0;23880:7;;23836:52:::1;;:::i;:::-;;;;;;;;;;;;;23802:88;;;;;-1:-1:-1::0;;;23802:88:0::1;;;;;;;;:::i;:::-;;;;;;;;;;23903:56;23922:5;23929;23936:13;23951:7;23903:18;:56::i;:::-;23970;23989:5;23996;24003:13;24018:7;23970:18;:56::i;:::-;24047:117;24066:5;24073;24111:11;24081:5;:24;;-1:-1:-1::0;;24081:24:0::1;;;24093:1;24081:24;24080:43;;;;:::i;:::-;24129:9;24145:8;24156:7;24047:18;:117::i;:::-;24175:118;24194:5;24201;24239:11;24209:5;:24;;24231:1;24209:24;;;-1:-1:-1::0;;24209:24:0::1;24208:43;;;;:::i;:::-;24257:9:::0;24269:14:::1;24274:8:::0;24269:14:::1;:::i;:::-;24285:7;24175:18;:118::i;:::-;24339:5;-1:-1:-1::0;;;;;24319:123:0::1;24332:5;-1:-1:-1::0;;;;;24319:123:0::1;;24325:5;24346;24353:11;24366:9;24377:8;24387:13;24402;24417:7;24426:15;24319:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;23464:986:::0;;;;;;;;;;:::o;18710:644::-;18780:7;;18800:28;18780:7;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;-1:-1:-1;;;;;18875:28:0;;:22;:28;;;;;;;;;;;:52;;;;:::i;:::-;18848:79;-1:-1:-1;18938:21:0;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;18962:26;18983:4;18962:20;:26::i;:::-;:50;;;;:::i;:::-;19093:11;:18;18938:74;;-1:-1:-1;19025:39:0;;19067:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;19025:87;;19130:9;19125:155;19147:11;:18;19143:22;;19125:155;;;-1:-1:-1;;;;;19230:21:0;;;;;;:15;:21;;;;;19252:11;:14;;19203:65;;19230:21;19252:11;19264:1;;19252:14;;;;;;:::i;:::-;;;;;;;;19230:37;;;;;;:::i;:::-;;;;;;;;;;;;;19203:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19203:65:0;;;-1:-1:-1;;19203:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;:65::i;:::-;19187:10;19198:1;19187:13;;;;;;;;:::i;:::-;;;;;;:81;;;;19167:3;;;;;:::i;:::-;;;;19125:155;;;-1:-1:-1;19300:16:0;;19318:13;;-1:-1:-1;19300:16:0;;-1:-1:-1;18710:644:0;-1:-1:-1;;18710:644:0:o;17681:534::-;17736:12;;:68;;-1:-1:-1;;;;;17736:12:0;17766:10;17786:4;17793:10;17736:29;:68::i;:::-;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;17863:34;;:10;:34;:::i;:::-;17848:10;17825:22;:34;;;;;;;;;;:72;;:34;;:22;:72;;;;;:::i;:::-;;;;-1:-1:-1;;17953:10:0;17942:22;;;;:10;:22;;;;;;:27;:50;;;;-1:-1:-1;17987:5:0;;-1:-1:-1;;;;;17987:5:0;17973:10;:19;;17942:50;17938:204;;;18034:10;;;18020;18009:22;;;;:10;:22;;;;;;;;:35;;;18059:28;;;:16;:28;;;;;:41;;-1:-1:-1;;;;;;18059:41:0;;;;;;18115:15;;18059:41;;18034:10;18009:22;18115:15;;18059:41;;18115:15;:::i;:::-;;;;-1:-1:-1;;17938:204:0;18159:48;;;22435:25:1;;;18191:15:0;22491:2:1;22476:18;;22469:34;18167:10:0;;18159:48;;22408:18:1;18159:48:0;;;;;;;17681:534;:::o;16786:289::-;16752:5;;16871:4;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;16898:10:::1;16909:13;16898:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:34;16890:68;;;::::0;-1:-1:-1;;;16890:68:0;;22716:2:1;16890:68:0::1;::::0;::::1;22698:21:1::0;22755:2;22735:18;;;22728:30;-1:-1:-1;;;22774:18:1;;;22767:51;22835:18;;16890:68:0::1;22514:345:1::0;16890:68:0::1;16971:11;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;16971:31:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;17041:4;17013:10;17024:13;17013:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32;;;::::1;;-1:-1:-1::0;;17013:32:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;17013:32:0;16769:1:::1;16786:289:::0;;;:::o;31318:731::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;31423:24;;31409:11:::1;31460:582;31482:3;31478:1;:7;31460:582;;;31507:523;31531:17;31549:1;31531:20;;;;;;;;:::i;:::-;;;;;;;:26;;;31576:17;31594:1;31576:20;;;;;;;;:::i;:::-;;;;;;;:33;;;31628:17;31646:1;31628:20;;;;;;;;:::i;:::-;;;;;;;:33;;;31680:17;31698:1;31680:20;;;;;;;;:::i;:::-;;;;;;;:30;;;31729:17;31747:1;31729:20;;;;;;;;:::i;31507:523::-;31487:3:::0;::::1;::::0;::::1;:::i;:::-;;;;31460:582;;32240:634:::0;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;32344:16;;32330:11:::1;32373:494;32395:3;32391:1;:7;32373:494;;;32449:1;32424:9;32434:1;32424:12;;;;;;;;:::i;:::-;;;;;;;:22;;;:26;32420:436;;;32540:9;32550:1;32540:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32539:23;;;:::i;:::-;32482:22;:48:::0;32505:9:::1;32515:1;32505:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32482:48:0::1;-1:-1:-1::0;;;;;32482:48:0::1;;;;;;;;;;;;;:81;;32474:139;;;::::0;-1:-1:-1;;;32474:139:0;;23066:2:1;32474:139:0::1;::::0;::::1;23048:21:1::0;23105:2;23085:18;;;23078:30;-1:-1:-1;;;23124:18:1;;;23117:49;23183:18;;32474:139:0::1;22864:343:1::0;32474:139:0::1;32690:9;32700:1;32690:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32689:23;;;:::i;:::-;32632:22;:48:::0;32655:9:::1;32665:1;32655:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32632:48:0::1;-1:-1:-1::0;;;;;32632:48:0::1;;;;;;;;;;;;;:81;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32420:436:0::1;::::0;-1:-1:-1;32420:436:0::1;;32815:9;32825:1;32815:12;;;;;;;;:::i;:::-;;;;;;;:22;;;32758;:48:::0;32781:9:::1;32791:1;32781:12;;;;;;;;:::i;:::-;;;;;;;:24;;;-1:-1:-1::0;;;;;32758:48:0::1;-1:-1:-1::0;;;;;32758:48:0::1;;;;;;;;;;;;;:80;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32420:436:0::1;32400:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32373:494;;17161:371:::0;17231:3;17250:23;17283:17;;;;;;;;;-1:-1:-1;;;;;17283:17:0;-1:-1:-1;;;;;17283:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17247:71;;;;;;17332:24;17366:18;;;;;;;;;-1:-1:-1;;;;;17366:18:0;-1:-1:-1;;;;;17366:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17329:73;;;;;;15475:1;15522:2;17494:28;;;;:::i;:::-;17489:34;;:2;:34;:::i;:::-;17463:20;17431:31;17451:11;17431:19;:31;:::i;:::-;:52;;;;:::i;:::-;17430:94;;;;:::i;:::-;17423:101;17161:371;-1:-1:-1;;;;17161:371:0:o;20531:435::-;16752:5;;-1:-1:-1;;;;;16752:5:0;16738:10;:19;16730:28;;;;;;15654:26:::1;15475:1;15522:2;15654:26;:::i;:::-;15649:32;::::0;:2:::1;:32;:::i;:::-;20675:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;20636:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;;:73:::1;;20628:107;;;::::0;-1:-1:-1;;;20628:107:0;;24118:2:1;20628:107:0::1;::::0;::::1;24100:21:1::0;24157:2;24137:18;;;24130:30;-1:-1:-1;;;24176:18:1;;;24169:51;24237:18;;20628:107:0::1;23916:345:1::0;20628:107:0::1;20748:12;::::0;:50:::1;::::0;-1:-1:-1;;;;;20748:12:0::1;20774:11:::0;20787:10;20748:25:::1;:50::i;:::-;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;::::0;:2:::1;:32;:::i;:::-;20848:34;::::0;:10;:34:::1;:::i;:::-;-1:-1:-1::0;;;;;20809:35:0;::::1;:22;:35:::0;;;::::1;::::0;;;;;;:73;;:35;;:22;:73:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20908:50:0::1;::::0;;22435:25:1;;;20942:15:0::1;22491:2:1::0;22476:18;;22469:34;-1:-1:-1;;;;;20908:50:0;::::1;::::0;::::1;::::0;22408:18:1;20908:50:0::1;;;;;;;20531:435:::0;;:::o;32882:88::-;32924:3;32952:1;32947;:6;;:15;;32960:2;32961:1;32960:2;:::i;:::-;32947:15;;;32956:1;32947:15;32940:22;32882:88;-1:-1:-1;;32882:88:0:o;9555:211::-;9699:58;;-1:-1:-1;;;;;24458:32:1;;9699:58:0;;;24440:51:1;24507:18;;;24500:34;;;9672:86:0;;9692:5;;-1:-1:-1;;;9722:23:0;24413:18:1;;9699:58:0;;;;-1:-1:-1;;9699:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9699:58:0;-1:-1:-1;;;;;;9699:58:0;;;;;;;;;;9672:19;:86::i;28221:1324::-;28394:23;28430:20;28503:1;28487:13;:17;;;28557:7;28513:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;28479:88;;;;;-1:-1:-1;;;28479:88:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;28584:21:0;;;;;;:15;:21;;;;;;;:28;;;;28606:5;;28584:28;:::i;:::-;;;;;;;;;;;;;:47;;;28635:1;28584:52;28580:143;;;-1:-1:-1;;;;;28653:21:0;;;;;;:15;:21;;;;;;;:28;;28698:13;;28653:21;:28;;28675:5;;28653:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;;;;;;;-1:-1:-1;;28653:58:0;;;;;;;;;28580:143;-1:-1:-1;;;;;28739:21:0;;;;;;:15;:21;;;;;;;:28;;:59;;;;:21;:28;;28761:5;;28739:28;:::i;:::-;;;;;;;;;;;;;;:42;;;;;:59;28735:803;;15581:16;15522:2;15581;:16;:::i;:::-;-1:-1:-1;;;;;28910:21:0;;;;;;:15;:21;;;;;;;:28;;28961:22;;;;28902:51;;28910:28;;28932:5;;28910:28;:::i;:::-;;;;;;;;;;;;;:41;;;28902:3;:51::i;:::-;-1:-1:-1;;;;;28841:21:0;;;;;;:15;:21;;;;;;;:28;;;;28863:5;;28841:28;:::i;:::-;;;;;;;;;;;;;:39;;;28837:116;;;;:::i;:::-;28836:148;;;;:::i;:::-;28835:168;;;;:::i;:::-;-1:-1:-1;;;;;29118:21:0;;;;;;:15;:21;;;;;;;:28;;28816:187;;-1:-1:-1;29118:21:0;:28;;29140:5;;29118:28;:::i;:::-;;;;;;;;;;;;;:47;;;29095:16;:71;;;;:::i;:::-;-1:-1:-1;;;;;29044:28:0;;:22;:28;;;;;;;;;;;29040:127;;;;:::i;:::-;29018:149;;29215:1;29192:19;:24;;29276:7;29225:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;29184:102;;;;;-1:-1:-1;;;29184:102:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29304:28:0;;:22;:28;;;;;;;;;;;:59;;;29378:15;:21;;;;;;;:28;;29436:16;;29378:21;:28;;29400:5;;29378:28;:::i;:::-;;;;;;;;;;;;;;;;:47;;:75;;;;-1:-1:-1;;;;;29468:21:0;;;;;;:15;:21;;;;;29513:13;;29468:28;;29490:5;;29468:28;:::i;:::-;;;;;;;;;;;;;;:42;;:58;;;;;;;-1:-1:-1;;29468:58:0;;;;;;;;;28735:803;28381:1164;;28221:1324;;;;:::o;24952:2903::-;-1:-1:-1;;;;;25184:21:0;;25165:16;25184:21;;;:15;:21;;;;;;:28;;;;25206:5;;25184:28;:::i;:::-;;;;;;;;;;;;;:41;;;25165:60;;25236:17;25260:15;:21;25276:4;-1:-1:-1;;;;;25260:21:0;-1:-1:-1;;;;;25260:21:0;;;;;;;;;;;;25282:5;25260:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:47;;;-1:-1:-1;;;;;25340:21:0;;25319:14;25340:21;;;:15;:21;;;;;;25260:47;;-1:-1:-1;25340:28:0;;25362:5;;25340:28;:::i;:::-;;;;;;;;;;;;;;:39;;;;-1:-1:-1;25391:12:0;15581:16;15522:2;15581;:16;:::i;:::-;-1:-1:-1;;;;;25418:21:0;;;;;;:15;:21;;;;;;;:28;;;;25440:5;;25418:28;:::i;:::-;;;;;;;;;;;;;;:42;;;25406:74;;;25418:42;;25406:74;:::i;:::-;25391:89;-1:-1:-1;25491:20:0;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;25550:26;;:8;:26;:::i;:::-;-1:-1:-1;;;;;25518:28:0;;:22;:28;;;;;;;;;;;25514:62;;;;:::i;:::-;-1:-1:-1;;;;;25598:21:0;;;;;;:15;:21;;;;;;;:28;;25491:85;;-1:-1:-1;25598:21:0;:28;;25620:5;;25598:28;:::i;:::-;;;;;;;;;;;;;;25592:52;;;;;:::i;:::-;:57;25589:124;;-1:-1:-1;25589:124:0;;-1:-1:-1;;;;;25665:21:0;;;;;;:15;:21;;;;;;;:28;;25706:5;;25665:21;:28;;25706:5;;25665:28;:::i;:::-;;;;;;;;;;;;;:38;;:46;;;;;;;;;;;;:::i;:::-;;25589:124;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;25737:27;;:9;:27;:::i;:::-;25725:39;;25797:1;25785:9;:13;25847:7;25807:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;25777:80;;;;;-1:-1:-1;;;25777:80:0;;;;;;;;:::i;:::-;;25898:1;25884:11;:15;:35;;;;;25918:1;25903:12;:16;25884:35;25883:94;;;;25955:1;25941:11;:15;:35;;;;;25975:1;25960:12;:16;25941:35;25882:153;;;;;26018:17;26022:12;26018:3;:17::i;:::-;25999:16;26003:11;25999:3;:16::i;:::-;:36;25882:153;25878:544;;;15581:16;15522:2;15581;:16;:::i;:::-;26197:22;26210:9;26197:10;:22;:::i;:::-;26183:37;;:12;:37;:::i;:::-;:55;;;;:::i;:::-;26153:8;26141:10;26123:17;26127:12;26123:3;:17::i;:::-;:28;;;;:::i;:::-;:39;;;;:::i;:::-;26085:77;;:16;:77;:::i;:::-;:153;;;;:::i;:::-;26066:172;-1:-1:-1;26285:39:0;26314:8;26289:23;26302:10;26289:12;:23;:::i;:::-;:34;;;;:::i;:::-;26285:3;:39::i;:::-;26269:55;;:13;:55;:::i;:::-;26253:71;-1:-1:-1;26353:26:0;26367:12;26353:11;:26;:::i;:::-;26339:40;;26409:1;26394:16;;25878:544;26464:17;;;:77;;;26520:1;26505:12;:16;:35;;;;;26539:1;26525:11;:15;26505:35;26464:136;;;;26579:1;26564:12;:16;:35;;;;;26598:1;26584:11;:15;26564:35;26460:851;;;26674:37;26701:8;26678:21;26690:9;26678:11;:21;:::i;26674:37::-;26638:73;;:16;:73;:::i;:::-;26619:92;-1:-1:-1;26758:37:0;26785:8;26762:21;26774:9;26762:11;:21;:::i;26758:37::-;26742:53;;:13;:53;:::i;:::-;26726:69;-1:-1:-1;26876:26:0;26891:11;26876:12;:26;:::i;:::-;26850:21;26862:9;26850:11;:21;:::i;:::-;26824:23;26837:10;26824:12;:23;:::i;:::-;:47;;;;:::i;:::-;26823:80;;;;:::i;:::-;26810:93;;26460:851;;;15581:16;15522:2;15581;:16;:::i;:::-;27173:22;27186:9;27173:10;:22;:::i;:::-;27160:36;;:11;:36;:::i;:::-;:54;;;;:::i;:::-;27131:8;27119:10;27102:16;27106:11;27102:3;:16::i;:::-;:27;;;;:::i;:::-;:38;;;;:::i;:::-;27065:75;;:16;:75;:::i;:::-;:149;;;;:::i;:::-;27046:168;-1:-1:-1;27261:38:0;27289:8;27265:22;27277:10;27265:11;:22;:::i;27261:38::-;27245:54;;:13;:54;:::i;:::-;27229:70;;26460:851;27359:1;27339:16;:21;;27420:7;27369:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;27331:99;;;;;-1:-1:-1;;;27331:99:0;;;;;;;;:::i;:::-;;27466:1;27449:13;:18;;27524:7;27476:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;27441:93;;;;;-1:-1:-1;;;27441:93:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27555:28:0;;:22;:28;;;;;;;;;;;:56;;;27622:15;:21;;;;;;;:28;;27680:13;;27622:21;:28;;27644:5;;27622:28;:::i;:::-;;;;;;;;;;;;;;;;:47;;:72;;;;-1:-1:-1;;;;;27705:21:0;;;;;;:15;:21;;;;;27755:10;;27705:28;;27727:5;;27705:28;:::i;:::-;;;;;;;;;;;;;;:39;;:61;27821:26;27836:11;27821:12;:26;:::i;:::-;-1:-1:-1;;;;;27777:21:0;;;;;;:15;:21;;;;;;;:28;;;;27799:5;;27777:28;:::i;:::-;;;;;;;;;;;;;;:41;;:70;-1:-1:-1;;;;;;;;;;;24952:2903:0:o;18290:289::-;18363:19;18426:8;18421:151;18442:11;:18;18438:22;;;;18421:151;;;-1:-1:-1;;;;;18497:28:0;;;;;;:15;:28;;;;;18526:11;:14;;;;;;;;;;;;:::i;:::-;;;;;;;;18497:44;;;;;;:::i;:::-;;;;;;;;;;;;;:63;;;18482:78;;;;;:::i;:::-;;-1:-1:-1;18462:3:0;;;;:::i;:::-;;;;18421:151;;;;18290:289;;;:::o;19531:806::-;19628:44;;:::i;:::-;19937:19;;19907:49;;20000:22;;;;;19967:30;;;:55;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;20088:9;:28;;;:52;;;;:::i;:::-;20049:36;;;:91;15654:26;15475:1;15522:2;15654:26;:::i;:::-;15649:32;;:2;:32;:::i;:::-;20199:9;:20;;;:44;;;;:::i;:::-;20168:28;;;:75;20305:23;;;;;20271:57;;:31;;;:57;;;;20168:17;19531:806::o;9774:248::-;9945:68;;-1:-1:-1;;;;;27140:15:1;;;9945:68:0;;;27122:34:1;27192:15;;27172:18;;;27165:43;27224:18;;;27217:34;;;9918:96:0;;9938:5;;-1:-1:-1;;;9968:27:0;27057:18:1;;9945:68:0;26882:375:1;9918:96:0;9774:248;;;;:::o;12128:716::-;12552:23;12578:69;12606:4;12578:69;;;;;;;;;;;;;;;;;12586:5;-1:-1:-1;;;;;12578:27:0;;;:69;;;;;:::i;:::-;12662:17;;12552:95;;-1:-1:-1;12662:21:0;12658:179;;12759:10;12748:30;;;;;;;;;;;;:::i;:::-;12740:85;;;;-1:-1:-1;;;12740:85:0;;27714:2:1;12740:85:0;;;27696:21:1;27753:2;27733:18;;;27726:30;27792:34;27772:18;;;27765:62;-1:-1:-1;;;27843:18:1;;;27836:40;27893:19;;12740:85:0;27512:406:1;4504:229:0;4641:12;4673:52;4695:6;4703:4;4709:1;4712:12;4673:21;:52::i;:::-;4666:59;;4504:229;;;;;;:::o;5624:510::-;5794:12;5852:5;5827:21;:30;;5819:81;;;;-1:-1:-1;;;5819:81:0;;28125:2:1;5819:81:0;;;28107:21:1;28164:2;28144:18;;;28137:30;28203:34;28183:18;;;28176:62;-1:-1:-1;;;28254:18:1;;;28247:36;28300:19;;5819:81:0;27923:402:1;5819:81:0;2021:20;;5911:60;;;;-1:-1:-1;;;5911:60:0;;28532:2:1;5911:60:0;;;28514:21:1;28571:2;28551:18;;;28544:30;28610:31;28590:18;;;28583:59;28659:18;;5911:60:0;28330:353:1;5911:60:0;5985:12;5999:23;6026:6;-1:-1:-1;;;;;6026:11:0;6045:5;6052:4;6026:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5984:73;;;;6075:51;6092:7;6101:10;6113:12;6075:16;:51::i;:::-;6068:58;5624:510;-1:-1:-1;;;;;;;5624:510:0:o;8310:712::-;8460:12;8489:7;8485:530;;;-1:-1:-1;8520:10:0;8513:17;;8485:530;8634:17;;:21;8630:374;;8832:10;8826:17;8893:15;8880:10;8876:2;8872:19;8865:44;8630:374;8975:12;8968:20;;-1:-1:-1;;;8968:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;297:18;282:34;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:257::-;478:4;472:11;;;510:17;;557:18;542:34;;578:22;;;539:62;536:88;;;604:18;;:::i;668:275::-;739:2;733:9;804:2;785:13;;-1:-1:-1;;781:27:1;769:40;;839:18;824:34;;860:22;;;821:62;818:88;;;886:18;;:::i;:::-;922:2;915:22;668:275;;-1:-1:-1;668:275:1:o;948:202::-;1027:4;1060:18;1052:6;1049:30;1046:56;;;1082:18;;:::i;:::-;-1:-1:-1;1127:1:1;1123:14;1139:4;1119:25;;948:202::o;1155:118::-;1241:5;1234:13;1227:21;1220:5;1217:32;1207:60;;1263:1;1260;1253:12;1278:128;1343:20;;1372:28;1343:20;1372:28;:::i;1411:163::-;1478:20;;1538:10;1527:22;;1517:33;;1507:61;;1564:1;1561;1554:12;1579:159;1646:20;;1706:6;1695:18;;1685:29;;1675:57;;1728:1;1725;1718:12;1743:531;1786:5;1839:3;1832:4;1824:6;1820:17;1816:27;1806:55;;1857:1;1854;1847:12;1806:55;1893:6;1880:20;1919:18;1915:2;1912:26;1909:52;;;1941:18;;:::i;:::-;1985:55;2028:2;2009:13;;-1:-1:-1;;2005:27:1;2034:4;2001:38;1985:55;:::i;:::-;2065:2;2056:7;2049:19;2111:3;2104:4;2099:2;2091:6;2087:15;2083:26;2080:35;2077:55;;;2128:1;2125;2118:12;2077:55;2193:2;2186:4;2178:6;2174:17;2167:4;2158:7;2154:18;2141:55;2241:1;2216:16;;;2234:4;2212:27;2205:38;;;;2220:7;1743:531;-1:-1:-1;;;1743:531:1:o;2279:2459::-;2399:6;2430:2;2473;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2529:9;2516:23;2558:18;2599:2;2591:6;2588:14;2585:34;;;2615:1;2612;2605:12;2585:34;2653:6;2642:9;2638:22;2628:32;;2698:7;2691:4;2687:2;2683:13;2679:27;2669:55;;2720:1;2717;2710:12;2669:55;2756:2;2743:16;2779:79;2795:62;2854:2;2795:62;:::i;:::-;2779:79;:::i;:::-;2892:15;;;2974:1;2970:10;;;;2962:19;;2958:28;;;2923:12;;;;2998:19;;;2995:39;;;3030:1;3027;3020:12;2995:39;3062:2;3058;3054:11;3074:1634;3090:6;3085:3;3082:15;3074:1634;;;3176:3;3163:17;3212:2;3199:11;3196:19;3193:109;;;3256:1;3285:2;3281;3274:14;3193:109;3325:20;;3368:6;3398:16;;;-1:-1:-1;;3394:30:1;3390:39;-1:-1:-1;3387:129:1;;;3470:1;3499:2;3495;3488:14;3387:129;3542:22;;:::i;:::-;3591:28;3615:2;3611;3607:11;3591:28;:::i;:::-;3584:5;3577:43;3643:2;3681:30;3707:2;3703;3699:11;3681:30;:::i;:::-;3676:2;3669:5;3665:14;3658:54;3736:2;3774:31;3800:3;3796:2;3792:12;3774:31;:::i;:::-;3769:2;3762:5;3758:14;3751:55;3830:3;3819:14;;3870:31;3896:3;3892:2;3888:12;3870:31;:::i;:::-;3864:3;3857:5;3853:15;3846:56;;3926:3;3987;3983:2;3979:12;3966:26;3960:3;3953:5;3949:15;3942:51;4017:3;4006:14;;4078:3;4074:2;4070:12;4057:26;4051:3;4044:5;4040:15;4033:51;;4108:3;4169;4165:2;4161:12;4148:26;4142:3;4135:5;4131:15;4124:51;4199:3;4188:14;;4239:31;4265:3;4261:2;4257:12;4239:31;:::i;:::-;4222:15;;;4215:56;4295:3;4335:31;4353:12;;;4335:31;:::i;:::-;4318:15;;;4311:56;4409:11;;;4396:25;;4437:16;;;4434:109;;;4495:1;4484:12;;4525:3;4520;4513:16;4434:109;4580:54;4626:7;4621:2;4610:8;4606:2;4602:17;4598:26;4580:54;:::i;:::-;4563:15;;;4556:79;-1:-1:-1;4648:18:1;;-1:-1:-1;;4686:12:1;;;;3107;;3074:1634;;;-1:-1:-1;4727:5:1;2279:2459;-1:-1:-1;;;;;;;;2279:2459:1:o;4743:180::-;4802:6;4855:2;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;-1:-1:-1;4894:23:1;;4743:180;-1:-1:-1;4743:180:1:o;5318:131::-;-1:-1:-1;;;;;5393:31:1;;5383:42;;5373:70;;5439:1;5436;5429:12;5454:134;5522:20;;5551:31;5522:20;5551:31;:::i;5593:735::-;5705:6;5713;5721;5729;5737;5745;5798:3;5786:9;5777:7;5773:23;5769:33;5766:53;;;5815:1;5812;5805:12;5766:53;5854:9;5841:23;5873:31;5898:5;5873:31;:::i;:::-;5923:5;-1:-1:-1;5975:2:1;5960:18;;5947:32;;-1:-1:-1;6026:2:1;6011:18;;5998:32;;-1:-1:-1;6081:2:1;6066:18;;6053:32;6108:18;6097:30;;6094:50;;;6140:1;6137;6130:12;6094:50;6163;6205:7;6196:6;6185:9;6181:22;6163:50;:::i;:::-;6153:60;;;6260:3;6249:9;6245:19;6232:33;6222:43;;6284:38;6317:3;6306:9;6302:19;6284:38;:::i;:::-;6274:48;;5593:735;;;;;;;;:::o;6333:1114::-;6488:6;6496;6504;6512;6520;6528;6536;6544;6552;6560;6613:3;6601:9;6592:7;6588:23;6584:33;6581:53;;;6630:1;6627;6620:12;6581:53;6653:26;6669:9;6653:26;:::i;:::-;6643:36;;6698:38;6732:2;6721:9;6717:18;6698:38;:::i;:::-;6688:48;;6755:38;6789:2;6778:9;6774:18;6755:38;:::i;:::-;6745:48;;6844:2;6833:9;6829:18;6816:32;6867:18;6908:2;6900:6;6897:14;6894:34;;;6924:1;6921;6914:12;6894:34;6947:50;6989:7;6980:6;6969:9;6965:22;6947:50;:::i;:::-;6937:60;;7044:3;7033:9;7029:19;7016:33;7006:43;;7096:3;7085:9;7081:19;7068:33;7058:43;;7148:3;7137:9;7133:19;7120:33;7110:43;;7172:38;7205:3;7194:9;7190:19;7172:38;:::i;:::-;7162:48;;7229:38;7262:3;7251:9;7247:19;7229:38;:::i;:::-;7219:48;;7320:3;7309:9;7305:19;7292:33;7276:49;;7350:2;7340:8;7337:16;7334:36;;;7366:1;7363;7356:12;7334:36;;7389:52;7433:7;7422:8;7411:9;7407:24;7389:52;:::i;:::-;7379:62;;;6333:1114;;;;;;;;;;;;;:::o;7676:247::-;7735:6;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7843:9;7830:23;7862:31;7887:5;7862:31;:::i;7928:258::-;8000:1;8010:113;8024:6;8021:1;8018:13;8010:113;;;8100:11;;;8094:18;8081:11;;;8074:39;8046:2;8039:10;8010:113;;;8141:6;8138:1;8135:13;8132:48;;;-1:-1:-1;;8176:1:1;8158:16;;8151:27;7928:258::o;8191:::-;8233:3;8271:5;8265:12;8298:6;8293:3;8286:19;8314:63;8370:6;8363:4;8358:3;8354:14;8347:4;8340:5;8336:16;8314:63;:::i;:::-;8431:2;8410:15;-1:-1:-1;;8406:29:1;8397:39;;;;8438:4;8393:50;;8191:258;-1:-1:-1;;8191:258:1:o;8454:1476::-;8724:4;8753:2;8793;8782:9;8778:18;8823:6;8812:9;8805:25;8849:2;8887:6;8882:2;8871:9;8867:18;8860:34;8913:2;8951;8946;8935:9;8931:18;8924:30;8974:6;9009;9003:13;9040:6;9032;9025:22;9066:3;9056:13;;9100:2;9089:9;9085:18;9078:25;;9162:2;9152:6;9149:1;9145:14;9134:9;9130:30;9126:39;9200:2;9192:6;9188:15;9221:1;9231:670;9245:6;9242:1;9239:13;9231:670;;;9338:3;9334:8;9322:9;9314:6;9310:22;9306:37;9301:3;9294:50;9373:6;9367:13;9403:4;9446:2;9440:9;9477:2;9469:6;9462:18;9507:48;9551:2;9543:6;9539:15;9525:12;9507:48;:::i;:::-;9598:11;;;9592:18;9575:15;;;9568:43;9654:11;;;9648:18;9631:15;;;9624:43;9710:11;;;9704:18;9687:15;;;9680:43;9770:11;;;9764:18;9784:6;9760:31;9743:15;;;9736:56;;;;-1:-1:-1;9879:12:1;;;;9493:62;-1:-1:-1;9844:15:1;;;;9267:1;9260:9;9231:670;;;-1:-1:-1;9918:6:1;;8454:1476;-1:-1:-1;;;;;;;;;;;;8454:1476:1:o;9935:322::-;10004:6;10057:2;10045:9;10036:7;10032:23;10028:32;10025:52;;;10073:1;10070;10063:12;10025:52;10113:9;10100:23;10146:18;10138:6;10135:30;10132:50;;;10178:1;10175;10168:12;10132:50;10201;10243:7;10234:6;10223:9;10219:22;10201:50;:::i;10454:2452::-;10567:6;10598:2;10641;10629:9;10620:7;10616:23;10612:32;10609:52;;;10657:1;10654;10647:12;10609:52;10697:9;10684:23;10726:18;10767:2;10759:6;10756:14;10753:34;;;10783:1;10780;10773:12;10753:34;10821:6;10810:9;10806:22;10796:32;;10866:7;10859:4;10855:2;10851:13;10847:27;10837:55;;10888:1;10885;10878:12;10837:55;10924:2;10911:16;10947:79;10963:62;11022:2;10963:62;:::i;10947:79::-;11060:15;;;11142:1;11138:10;;;;11130:19;;11126:28;;;11091:12;;;;11166:19;;;11163:39;;;11198:1;11195;11188:12;11163:39;11230:2;11226;11222:11;11242:1634;11258:6;11253:3;11250:15;11242:1634;;;11344:3;11331:17;11380:2;11367:11;11364:19;11361:39;;;11396:1;11393;11386:12;11361:39;11423:20;;11466:6;11496:16;;;-1:-1:-1;;11492:30:1;11488:39;-1:-1:-1;11485:59:1;;;11540:1;11537;11530:12;11485:59;11570:22;;:::i;:::-;11619:28;11643:2;11639;11635:11;11619:28;:::i;:::-;11612:5;11605:43;11684:31;11711:2;11707;11703:11;11684:31;:::i;:::-;11679:2;11672:5;11668:14;11661:55;11752:31;11779:2;11775;11771:11;11752:31;:::i;:::-;11747:2;11740:5;11736:14;11729:55;11807:3;11860:2;11856;11852:11;11839:25;11893:2;11883:8;11880:16;11877:106;;;11937:1;11966:2;11962;11955:14;11877:106;12019:54;12065:7;12060:2;12049:8;12045:2;12041:17;12037:26;12019:54;:::i;:::-;12014:2;12007:5;12003:14;11996:78;;12097:3;12157:2;12153;12149:11;12136:25;12131:2;12124:5;12120:14;12113:49;12186:3;12175:14;;12246:3;12242:2;12238:12;12225:26;12220:2;12213:5;12209:14;12202:50;;12276:3;12337;12333:2;12329:12;12316:26;12310:3;12303:5;12299:15;12292:51;12367:3;12356:14;;12407:31;12433:3;12429:2;12425:12;12407:31;:::i;:::-;12390:15;;;12383:56;12463:3;12503:31;12521:12;;;12503:31;:::i;:::-;12486:15;;;12479:56;12577:11;;;12564:25;;12605:16;;;12602:109;;;12663:1;12652:12;;12693:3;12688;12681:16;12602:109;12748:54;12794:7;12789:2;12778:8;12774:2;12770:17;12766:26;12748:54;:::i;:::-;12731:15;;;12724:79;-1:-1:-1;12816:18:1;;-1:-1:-1;;12854:12:1;;;;11275;;11242:1634;;12911:1294;13021:6;13052:2;13095;13083:9;13074:7;13070:23;13066:32;13063:52;;;13111:1;13108;13101:12;13063:52;13151:9;13138:23;13184:18;13176:6;13173:30;13170:50;;;13216:1;13213;13206:12;13170:50;13239:22;;13292:4;13284:13;;13280:27;-1:-1:-1;13270:55:1;;13321:1;13318;13311:12;13270:55;13357:2;13344:16;13380:79;13396:62;13455:2;13396:62;:::i;13380:79::-;13493:15;;;13575:1;13571:10;;;;13563:19;;13559:28;;;13524:12;;;;13599:19;;;13596:39;;;13631:1;13628;13621:12;13596:39;13655:11;;;;13675:500;13691:6;13686:3;13683:15;13675:500;;;13773:4;13767:3;13758:7;13754:17;13750:28;13747:118;;;13819:1;13848:2;13844;13837:14;13747:118;13891:22;;:::i;:::-;13954:3;13941:17;13971:33;13996:7;13971:33;:::i;:::-;14017:22;;14088:12;;;14075:26;14059:14;;;14052:50;14115:18;;13717:4;13708:14;;;;14153:12;;;;13675:500;;14574:315;14642:6;14650;14703:2;14691:9;14682:7;14678:23;14674:32;14671:52;;;14719:1;14716;14709:12;14671:52;14758:9;14745:23;14777:31;14802:5;14777:31;:::i;:::-;14827:5;14879:2;14864:18;;;;14851:32;;-1:-1:-1;;;14574:315:1:o;14894:127::-;14955:10;14950:3;14946:20;14943:1;14936:31;14986:4;14983:1;14976:15;15010:4;15007:1;15000:15;15026:380;15105:1;15101:12;;;;15148;;;15169:61;;15223:4;15215:6;15211:17;15201:27;;15169:61;15276:2;15268:6;15265:14;15245:18;15242:38;15239:161;;;15322:10;15317:3;15313:20;15310:1;15303:31;15357:4;15354:1;15347:15;15385:4;15382:1;15375:15;15411:127;15472:10;15467:3;15463:20;15460:1;15453:31;15503:4;15500:1;15493:15;15527:4;15524:1;15517:15;15543:135;15582:3;-1:-1:-1;;15603:17:1;;15600:43;;;15623:18;;:::i;:::-;-1:-1:-1;15670:1:1;15659:13;;15543:135::o;15809:1099::-;15937:3;15966:1;15999:6;15993:13;16029:3;16051:1;16079:9;16075:2;16071:18;16061:28;;16139:2;16128:9;16124:18;16161;16151:61;;16205:4;16197:6;16193:17;16183:27;;16151:61;16231:2;16279;16271:6;16268:14;16248:18;16245:38;16242:165;;;-1:-1:-1;;;16306:33:1;;16362:4;16359:1;16352:15;16392:4;16313:3;16380:17;16242:165;16423:18;16450:104;;;;16568:1;16563:320;;;;16416:467;;16450:104;-1:-1:-1;;16483:24:1;;16471:37;;16528:16;;;;-1:-1:-1;16450:104:1;;16563:320;15756:1;15749:14;;;15793:4;15780:18;;16658:1;16672:165;16686:6;16683:1;16680:13;16672:165;;;16764:14;;16751:11;;;16744:35;16807:16;;;;16701:10;;16672:165;;;16676:3;;16866:6;16861:3;16857:16;16850:23;;16416:467;-1:-1:-1;16899:3:1;;15809:1099;-1:-1:-1;;;;;;;;15809:1099:1:o;16913:197::-;16951:3;16979:6;17020:2;17013:5;17009:14;17047:2;17038:7;17035:15;17032:41;;;17053:18;;:::i;:::-;17102:1;17089:15;;16913:197;-1:-1:-1;;;16913:197:1:o;17115:276::-;17246:3;17284:6;17278:13;17300:53;17346:6;17341:3;17334:4;17326:6;17322:17;17300:53;:::i;:::-;17369:16;;;;;17115:276;-1:-1:-1;;17115:276:1:o;17396:422::-;17485:1;17528:5;17485:1;17542:270;17563:7;17553:8;17550:21;17542:270;;;17622:4;17618:1;17614:6;17610:17;17604:4;17601:27;17598:53;;;17631:18;;:::i;:::-;17681:7;17671:8;17667:22;17664:55;;;17701:16;;;;17664:55;17780:22;;;;17740:15;;;;17542:270;;;17546:3;17396:422;;;;;:::o;17823:806::-;17872:5;17902:8;17892:80;;-1:-1:-1;17943:1:1;17957:5;;17892:80;17991:4;17981:76;;-1:-1:-1;18028:1:1;18042:5;;17981:76;18073:4;18091:1;18086:59;;;;18159:1;18154:130;;;;18066:218;;18086:59;18116:1;18107:10;;18130:5;;;18154:130;18191:3;18181:8;18178:17;18175:43;;;18198:18;;:::i;:::-;-1:-1:-1;;18254:1:1;18240:16;;18269:5;;18066:218;;18368:2;18358:8;18355:16;18349:3;18343:4;18340:13;18336:36;18330:2;18320:8;18317:16;18312:2;18306:4;18303:12;18299:35;18296:77;18293:159;;;-1:-1:-1;18405:19:1;;;18437:5;;18293:159;18484:34;18509:8;18503:4;18484:34;:::i;:::-;18554:6;18550:1;18546:6;18542:19;18533:7;18530:32;18527:58;;;18565:18;;:::i;:::-;18603:20;;17823:806;-1:-1:-1;;;17823:806:1:o;18634:140::-;18692:5;18721:47;18762:4;18752:8;18748:19;18742:4;18721:47;:::i;18779:168::-;18819:7;18885:1;18881;18877:6;18873:14;18870:1;18867:21;18862:1;18855:9;18848:17;18844:45;18841:71;;;18892:18;;:::i;:::-;-1:-1:-1;18932:9:1;;18779:168::o;18952:553::-;18991:7;-1:-1:-1;;;;;19061:9:1;;;19089;;;19114:11;;;19133:10;;;19127:17;;19110:35;19107:61;;;19148:18;;:::i;:::-;-1:-1:-1;;;19224:1:1;19217:9;;19242:11;;;19262;;;19255:19;;19238:37;19235:63;;;19278:18;;:::i;:::-;19324:1;19321;19317:9;19307:19;;19371:1;19367:2;19362:11;19359:1;19355:19;19350:2;19346;19342:11;19338:37;19335:63;;;19378:18;;:::i;:::-;19443:1;19439:2;19434:11;19431:1;19427:19;19422:2;19418;19414:11;19410:37;19407:63;;;19450:18;;:::i;:::-;-1:-1:-1;;;19490:9:1;;;;;18952:553;-1:-1:-1;;;18952:553:1:o;19510:127::-;19571:10;19566:3;19562:20;19559:1;19552:31;19602:4;19599:1;19592:15;19626:4;19623:1;19616:15;19642:193;19681:1;19707;19697:35;;19712:18;;:::i;:::-;-1:-1:-1;;;19748:18:1;;-1:-1:-1;;19768:13:1;;19744:38;19741:64;;;19785:18;;:::i;:::-;-1:-1:-1;19819:10:1;;19642:193::o;19840:184::-;19910:6;19963:2;19951:9;19942:7;19938:23;19934:32;19931:52;;;19979:1;19976;19969:12;19931:52;-1:-1:-1;20002:16:1;;19840:184;-1:-1:-1;19840:184:1:o;20029:442::-;20291:25;20286:3;20279:38;20261:3;20346:6;20340:13;20362:62;20417:6;20412:2;20407:3;20403:12;20396:4;20388:6;20384:17;20362:62;:::i;:::-;20444:16;;;;20462:2;20440:25;;20029:442;-1:-1:-1;;20029:442:1:o;20476:220::-;20625:2;20614:9;20607:21;20588:4;20645:45;20686:2;20675:9;20671:18;20663:6;20645:45;:::i;20701:136::-;20736:3;-1:-1:-1;;;20757:22:1;;20754:48;;;20782:18;;:::i;:::-;-1:-1:-1;20822:1:1;20818:13;;20701:136::o;20842:956::-;21188:4;21217:3;21261:6;21254:14;21247:22;21236:9;21229:41;21306:2;21301;21290:9;21286:18;21279:30;21332:45;21373:2;21362:9;21358:18;21350:6;21332:45;:::i;:::-;21318:59;;21413:6;21408:2;21397:9;21393:18;21386:34;21456:6;21451:2;21440:9;21436:18;21429:34;21500:6;21494:3;21483:9;21479:19;21472:35;21526:6;21581:2;21573:6;21569:15;21563:3;21552:9;21548:19;21541:44;21634:2;21626:6;21622:15;21616:3;21605:9;21601:19;21594:44;;21687:9;21679:6;21675:22;21669:3;21658:9;21654:19;21647:51;21715:33;21741:6;21733;21715:33;:::i;:::-;21707:41;;;21785:6;21779:3;21768:9;21764:19;21757:35;20842:956;;;;;;;;;;;;:::o;21803:195::-;21841:4;21878;21875:1;21871:12;21910:4;21907:1;21903:12;21935:3;21930;21927:12;21924:38;;;21942:18;;:::i;:::-;21979:13;;;21803:195;-1:-1:-1;;;21803:195:1:o;22003:120::-;22043:1;22069;22059:35;;22074:18;;:::i;:::-;-1:-1:-1;22108:9:1;;22003:120::o;22128:128::-;22168:3;22199:1;22195:6;22192:1;22189:13;22186:39;;;22205:18;;:::i;:::-;-1:-1:-1;22241:9:1;;22128:128::o;23212:125::-;23252:4;23280:1;23277;23274:8;23271:34;;;23285:18;;:::i;:::-;-1:-1:-1;23322:9:1;;23212:125::o;23342:569::-;23447:6;23455;23463;23471;23479;23532:3;23520:9;23511:7;23507:23;23503:33;23500:53;;;23549:1;23546;23539:12;23500:53;23581:9;23575:16;23600:31;23625:5;23600:31;:::i;:::-;23650:5;23640:15;;;23695:2;23684:9;23680:18;23674:25;23664:35;;23739:2;23728:9;23724:18;23718:25;23708:35;;23783:2;23772:9;23768:18;23762:25;23752:35;;23832:3;23821:9;23817:19;23811:26;23846:33;23871:7;23846:33;:::i;:::-;23898:7;23888:17;;;23342:569;;;;;;;;:::o;24545:442::-;24807:25;24802:3;24795:38;24777:3;24862:6;24856:13;24878:62;24933:6;24928:2;24923:3;24919:12;24912:4;24904:6;24900:17;24878:62;:::i;24992:267::-;25031:4;25060:9;;;25085:10;;-1:-1:-1;;;25104:19:1;;25097:27;;25081:44;25078:70;;;25128:18;;:::i;:::-;-1:-1:-1;;;;;25175:27:1;;25168:35;;25160:44;;25157:70;;;25207:18;;:::i;:::-;-1:-1:-1;;25244:9:1;;24992:267::o;25264:449::-;25526:32;25521:3;25514:45;25496:3;25588:6;25582:13;25604:62;25659:6;25654:2;25649:3;25645:12;25638:4;25630:6;25626:17;25604:62;:::i;:::-;25686:16;;;;25704:2;25682:25;;25264:449;-1:-1:-1;;25264:449:1:o;25718:265::-;25757:3;25785:9;;;25810:10;;-1:-1:-1;;;;;25829:27:1;;;25822:35;;25806:52;25803:78;;;25861:18;;:::i;:::-;-1:-1:-1;;;25908:19:1;;;25901:27;;25893:36;;25890:62;;;25932:18;;:::i;:::-;-1:-1:-1;;25968:9:1;;25718:265::o;25988:438::-;-1:-1:-1;;;26245:3:1;26238:34;26220:3;26301:6;26295:13;26317:62;26372:6;26367:2;26362:3;26358:12;26351:4;26343:6;26339:17;26317:62;:::i;:::-;26399:16;;;;26417:2;26395:25;;25988:438;-1:-1:-1;;25988:438:1:o;26431:446::-;26693:29;26688:3;26681:42;26663:3;26752:6;26746:13;26768:62;26823:6;26818:2;26813:3;26809:12;26802:4;26794:6;26790:17;26768:62;:::i;:::-;26850:16;;;;26868:2;26846:25;;26431:446;-1:-1:-1;;26431:446:1:o;27262:245::-;27329:6;27382:2;27370:9;27361:7;27357:23;27353:32;27350:52;;;27398:1;27395;27388:12;27350:52;27430:9;27424:16;27449:28;27471:5;27449:28;:::i
Swarm Source
ipfs://65cdfd7cde1f41e9b0140f4d6939f2734beedf92add5141baed74f06afc3cb30
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|