Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PositionMarket
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-02-28
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
// This interface defines basic ERC20 token functionalities, including transfer and balance queries.
interface IERC20 {
/**
* @dev Transfers a specified amount of tokens from one address to another.
* @param from The address from which tokens are transferred.
* @param to The address to which tokens are transferred.
* @param amount The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation was successful.
*/
function transferFrom(address from, address to, uint amount) external returns (bool);
/**
* @dev Transfers a specified amount of tokens to a specified address.
* @param to The address to which tokens are transferred.
* @param amount The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation was successful.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the token balance of a specified address.
* @param account The address whose token balance will be retrieved.
* @return The number of tokens held by the given address.
*/
function balanceOf(address account) external view returns (uint);
}
// This interface defines a function for getting the latest price answer from an oracle.
interface IAggregator {
/**
* @dev Returns the latest price answer.
* @return int256 The latest price.
*/
function latestAnswer() external view returns (int256);
}
contract PositionMarket {
// Data structure for storing information about currency pair oracles
uint private currencyPairCount;
// Data structure for storing information about metal pair oracles
uint private metalPairCount;
// Mapping storing addresses of oracles for default trading tokens
mapping(address => address) private defaultTradingTokenOracles;
// Variable storing the address of the current default trading token
address private defaultTradingToken;
// Minimum timestamp set by the owner
uint256 private minimumTimestamp;
// Mapping of oracles for various currencies
mapping(string => address) private currencyOracles;
// A counter to keep track of the number of positions created.
// It's used as a unique identifier for each new position.
uint256 private positionCounter;
// A mapping from a position's unique identifier (uint256) to its corresponding Position struct.
// This structure stores detailed information about each position.
mapping(uint256 => Position) private positions;
// A percentage fee that is charged on the profit made from a position.
// This fee is taken when the profit is realized and is calculated as a percentage of the profit.
uint256 private profitFeePercentage;
// The address of the contract owner.
// This address has special permissions within the contract, like setting fees or modifying key parameters.
address private owner;
// Mapping storing price pairs and their oracles
mapping(string => PricePair) private pricePairs;
// Tracks if the initial setup of the contract has been completed
// Ensures that setup logic is executed only once
bool private isSetup;
// Represents the paused state of the contract
// When true, certain functions of the contract are disabled
bool private _paused;
// Stores the block number at which the contract was setup.
uint private setupBlock;
// Flag to prevent reentrant calls.
bool private locked;
// A variable returning the current name of the contract.
string private contractName;
// Event emitted when the default token is deposited by the owner
event DefaultTokenDepositedByOwner(address indexed owner, uint256 amount);
// Event emitted when the default token is withdrawn by the owner
event DefaultTokenWithdrawnByOwner(address indexed owner, uint256 amount);
// Event emitted during the addition or updating of an oracle for a default trading token
event DefaultTradingTokenOracleUpdated(address tokenAddress, address oracleAddress);
// Event emitted when a new price pair is added to the contract.
// @param pairSymbol The symbol representing the pair.
// @param assetOne The first asset in the pair.
// @param assetTwo The second asset in the pair.
// @param oracleAddress The address of the oracle providing the price data.
// @param classId A classification identifier for the asset pair.
// @param dataHash A hash representing additional data associated with the pair.
event PricePairAdded(string pairSymbol, string assetOne, string assetTwo, address oracleAddress, string classId, bytes32 dataHash);
// Event emitted when the setup of the contract is completed.
event SetupCompleted(address indexed owner, uint setupBlock);
// Event emitted when the profit fee percentage is updated.
event ProfitFeePercentageUpdated(uint256 newProfitFeePercentage);
/**
* @dev Modifier to restrict function access to only the owner of the contract.
* It checks if the sender of the message (transaction) is the owner.
* Reverts if the sender is not the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "Caller is not the owner");
_;
}
/**
* @dev Modifier to validate the price pair and its class ID.
* It checks if the provided pair symbol and class ID match an existing pair's data.
* Reverts if the pair symbol and class ID do not match or if the pair does not exist.
* @param pairSymbol The symbol of the price pair to validate.
* @param classId The class ID to validate against the pair.
*/
modifier onlyValidPair(string memory pairSymbol, string memory classId) {
PricePair memory pair = pricePairs[pairSymbol];
require(
keccak256(bytes(pair.classId)) == keccak256(bytes(classId)),
"Invalid pair or class ID"
);
_;
}
/**
* @dev Modifier to prevent a contract from calling itself, directly or indirectly.
*/
modifier nonReentrant() {
require(!locked, "Reentrant call");
locked = true;
_;
locked = false;
}
/**
* @dev Modifier to ensure a function is called only once during the contract's lifetime.
*/
modifier setupOnce() {
require(!isSetup, "Setup already called!");
_;
isSetup = true;
}
/**
* @dev Modifier that allows function execution only when the contract is not paused.
* It checks if the contract is not paused before allowing the function to proceed.
*/
modifier whenNotPaused() {
require(!_paused, "Contract is paused"); // Checks if the contract is not paused
_; // Continues execution of the modified function
}
/**
* @dev Modifier that allows function execution only when the contract is paused.
*/
modifier whenPaused() {
require(_paused, "Contract is not paused"); // Checks if the contract is paused
_; // Continues execution of the modified function
}
/**
* @dev Retrieves the name of this contract.
* @return The name of the contract as a string.
*/
function getContractName() public view returns (string memory) {
return contractName;
}
/**
* @dev Returns detailed information of a specific position.
* @param positionId The unique identifier of the position.
*/
function getPositionDetails(uint256 positionId) public view returns (
uint256, address, string memory, string memory, uint256, bool, bool, uint256, uint256
) {
Position memory position = positions[positionId];
return (
position.positionId,
position.trader,
position.pairSymbol,
position.classId,
position.timestamp,
position.isLong,
position.isOpen,
position.collateral,
position.priceAtOpen
);
}
/**
* @dev Returns detailed information of a specified price pair.
* @param pairSymbol The symbol of the price pair.
*/
function getPricePairDetails(string memory pairSymbol) public view returns (
string memory, string memory, string memory, address, string memory, bytes32
) {
PricePair memory pricePair = pricePairs[pairSymbol];
return (
pricePair.pairSymbol,
pricePair.assetOne,
pricePair.assetTwo,
pricePair.oracleAddress,
pricePair.classId,
pricePair.dataHash
);
}
/**
* @dev Returns the current count of currency pairs.
* @return The current count of currency pairs.
*/
function getCurrencyPairCount() public view returns (uint) {
return currencyPairCount;
}
/**
* @dev Returns the current count of metal pairs.
* @return The current count of metal pairs.
*/
function getMetalPairCount() public view returns (uint) {
return metalPairCount;
}
/**
* @dev Returns the oracle address for a given default trading token.
* @param tokenAddress The address of the trading token.
* @return The oracle address associated with the given trading token.
*/
function getDefaultTradingTokenOracle(address tokenAddress) public view returns (address) {
return defaultTradingTokenOracles[tokenAddress];
}
/**
* @dev Returns the address of the current default trading token.
* @return The address of the current default trading token.
*/
function getDefaultTradingToken() public view returns (address) {
return defaultTradingToken;
}
/**
* @dev Returns the minimum timestamp set by the owner.
* @return The minimum timestamp.
*/
function getMinimumTimestamp() public view returns (uint256) {
return minimumTimestamp;
}
/**
* @dev Returns the oracle address for a given currency.
* @param currency The name of the currency.
* @return The oracle address associated with the given currency.
*/
function getCurrencyOracle(string memory currency) public view returns (address) {
return currencyOracles[currency];
}
/**
* @dev Returns the current position counter.
* @return The current number of positions created.
*/
function getPositionCounter() public view returns (uint256) {
return positionCounter;
}
/**
* @dev Returns the current profit fee percentage.
* @return The profit fee percentage.
*/
function getProfitFeePercentage() public view returns (uint256) {
return profitFeePercentage;
}
/**
* @dev Returns the address of the contract owner.
* @return The address of the owner.
*/
function getOwner() public view returns (address) {
return owner;
}
/**
* @dev Returns the boolean status indicating if the contract setup is completed.
* @return True if setup is completed, false otherwise.
*/
function getIsSetup() public view returns (bool) {
return isSetup;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function isPaused() public view returns (bool) {
return _paused;
}
/**
* @dev Sets up initial configuration of the contract.
* This function can only be called once.
* It initializes the owner and setupBlock variables.
*/
function setup() public setupOnce {
owner = msg.sender;
setupBlock = block.number;
emit SetupCompleted(owner, setupBlock);
}
/**
* @dev Sets a new name for the contract.
* @param _name The new name to be set.
*/
function setContractName(string calldata _name) public onlyOwner whenNotPaused {
require(keccak256(bytes(_name)) != keccak256(bytes(contractName)), "New name must be different from the current name"); // Checks if the new name is different from the current one
contractName = _name;
}
/**
* @dev Function to pause the contract.
* This function can only be called by the contract's admin.
* It sets the contract state to paused.
*/
function pause() public onlyOwner whenNotPaused {
_paused = true; // Sets the contract state to paused
}
/**
* @dev Function to resume the contract's operations.
* This function can only be called by the contract's admin.
* It sets the contract state to not paused.
*/
function unpause() public onlyOwner whenPaused {
_paused = false; // Sets the contract state to not paused
}
// Struct representing a pair of assets with their oracle and additional data.
struct PricePair {
string pairSymbol; // Symbol representing the asset pair.
string assetOne; // Symbol of the first asset in the pair.
string assetTwo; // Symbol of the second asset in the pair.
address oracleAddress; // Address of the oracle providing price data for this pair.
string classId; // Identifier for the asset class.
bytes32 dataHash; // Hash of additional data related to the pair.
}
// Struct representing a trading position.
struct Position {
uint256 positionId; // Unique identifier for the position.
address trader; // Address of the trader who owns the position.
string pairSymbol; // Symbol representing the traded asset pair.
string classId; // Identifier for the asset class of the position.
uint256 timestamp; // Timestamp when the position was created.
bool isLong; // Boolean flag indicating if the position is long.
bool isOpen; // Boolean flag indicating if the position is currently open.
uint256 collateral; // Amount of collateral posted for the position.
uint256 priceAtOpen; // Price of the asset pair at the time of position opening.
}
// Event emitted when a new position is created.
event PositionCreated(
uint256 indexed positionId,
address indexed trader,
string pairSymbol,
string classId,
uint256 timestamp,
bool isLong
);
// Function to set the minimum required timestamp for creating a position.
/**
* @dev Sets the minimum timestamp for position creation.
* Can only be called by the contract owner.
* @param _timestamp The minimum timestamp.
*/
function setMinimumTimestamp(uint256 _timestamp) public onlyOwner {
minimumTimestamp = _timestamp;
}
// Internal function to handle the deposit of collateral.
/**
* @dev Deposits collateral into the contract.
* Requires that the collateral amount is greater than zero.
* Transfers the specified collateral amount from the sender to the contract.
* @param amount The amount of collateral to deposit.
*/
function depositCollateral(uint256 amount) internal {
require(amount > 0, "Collateral amount must be greater than zero");
IERC20 token = IERC20(defaultTradingToken);
require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");
}
// Function to create a new trading position.
/**
* @dev Creates a new trading position with the specified parameters.
* Checks if the pair is valid, the contract is not paused, and prevents reentrant calls.
* Requires that the timestamp is valid and the collateral amount is greater than zero.
* Deposits collateral and emits an event upon successful position creation.
* @param pairSymbol The symbol of the traded asset pair.
* @param classId The identifier for the asset class.
* @param isLong Boolean indicating if the position is long.
* @param timestamp Timestamp when the position is created.
* @param collateralAmount The amount of collateral for the position.
*/
function createPosition(string memory pairSymbol, string memory classId, bool isLong, uint256 timestamp, uint256 collateralAmount) public onlyValidPair(pairSymbol, classId) whenNotPaused nonReentrant {
require(timestamp >= minimumTimestamp, "Timestamp is too early");
require(timestamp <= block.timestamp, "Future timestamp is not allowed");
require(collateralAmount > 0, "Collateral amount must be greater than zero");
int256 priceAtOpen = getPrice(pairSymbol);
require(priceAtOpen > 0, "Invalid price for pair");
depositCollateral(collateralAmount);
uint256 newPositionId = ++positionCounter;
positions[newPositionId] = Position({
positionId: newPositionId,
trader: msg.sender,
pairSymbol: pairSymbol,
classId: classId,
timestamp: timestamp,
isLong: isLong,
isOpen: true,
collateral: collateralAmount,
priceAtOpen: uint256(priceAtOpen)
});
emit PositionCreated(newPositionId, msg.sender, pairSymbol, classId, timestamp, isLong);
}
/**
* @dev Allows the contract owner to add or update the oracle address for a specific currency.
* @param currency The currency for which the oracle is being set.
* @param oracleAddress The address of the oracle.
*/
function setCurrencyOracle(string memory currency, address oracleAddress) public onlyOwner {
require(oracleAddress != address(0), "Oracle address cannot be zero");
currencyOracles[currency] = oracleAddress;
}
/**
* @dev Returns the price of a position in multiple currencies.
* @param positionId The ID of the position.
* @return priceInUSD The price of the position in USD.
* @return priceInEUR The price of the position in EUR.
* @return priceInGBP The price of the position in GBP.
* @return priceInCHF The price of the position in CHF.
* @return priceInCNY The price of the position in CNY.
*/
function getPositionPriceInCurrencies(uint256 positionId) public view returns (uint256 priceInUSD, uint256 priceInEUR, uint256 priceInGBP, uint256 priceInCHF, uint256 priceInCNY) {
Position memory position = positions[positionId];
require(position.positionId != 0, "Position does not exist");
int256 priceInUSDInt = getPrice(position.pairSymbol);
require(priceInUSDInt > 0, "Invalid price for pair");
priceInUSD = uint256(priceInUSDInt) * position.collateral;
priceInEUR = convertCurrency("EUR/USD", priceInUSD);
priceInGBP = convertCurrency("GBP/USD", priceInUSD);
priceInCHF = convertCurrency("CHF/USD", priceInUSD);
priceInCNY = convertCurrency("CNY/USD", priceInUSD);
}
/**
* @dev Helper function to convert a currency amount from USD to another currency using a specific currency pair.
* @param currencyPair The currency pair used for conversion (e.g., "EUR/USD").
* @param amountInUSD The amount in USD to convert.
* @return The converted amount in the target currency.
*/
function convertCurrency(string memory currencyPair, uint256 amountInUSD) private view returns (uint256) {
address oracleAddress = currencyOracles[currencyPair];
require(oracleAddress != address(0), "Oracle not set for this currency pair");
IAggregator oracle = IAggregator(oracleAddress);
int256 exchangeRate = oracle.latestAnswer();
require(exchangeRate > 0, "Invalid exchange rate");
return (amountInUSD * uint256(exchangeRate)) / 1e8;
}
/**
* @dev Allows the contract owner to set the fee percentage applied to profits.
* @param _profitFeePercentage The new profit fee percentage.
*/
function setProfitFeePercentage(uint256 _profitFeePercentage) public onlyOwner {
require(_profitFeePercentage <= 333333, "Fee percentage cannot exceed 33,333%");
profitFeePercentage = _profitFeePercentage;
emit ProfitFeePercentageUpdated(_profitFeePercentage);
}
// Event emitted when a trading position is closed.
// It includes the position ID, trader's address, a flag indicating if the position was profitable,
// and the amount returned to the trader.
event PositionClosed(
uint256 indexed positionId,
address indexed trader,
bool wasProfitable,
uint256 amountReturned
);
/**
* @dev Function to close a trading position.
* @param positionId The ID of the position to be closed.
* Requires that the position belongs to the message sender, is currently open,
* and meets the timestamp conditions.
* Calculates profitability, applies fees if profitable, and returns the appropriate amount.
* Emits the PositionClosed event upon success.
*/
function closePosition(uint256 positionId) public whenNotPaused nonReentrant {
Position storage position = positions[positionId];
// Validation checks
require(position.trader == msg.sender, "You are not the owner of this position");
require(position.isOpen, "Position is already closed");
require(block.timestamp >= position.timestamp, "Position cannot be closed before its set timestamp");
require(block.timestamp >= minimumTimestamp, "Position cannot be closed before minimum timestamp set by owner");
// Retrieve current price of the pair
int256 currentPrice = getPrice(position.pairSymbol);
require(currentPrice > 0, "Invalid current price for pair");
bool wasProfitable;
uint256 amountReturned;
// Calculate profitability and amount to return
if (position.isLong) {
wasProfitable = uint256(currentPrice) > position.priceAtOpen;
} else {
wasProfitable = uint256(currentPrice) < position.priceAtOpen;
}
if (wasProfitable) {
uint256 grossProfit = (position.collateral * (uint256(currentPrice) - position.priceAtOpen) / position.priceAtOpen);
uint256 fee = grossProfit * profitFeePercentage / 1000000; // Fee calculation
amountReturned = position.collateral + grossProfit - fee;
} else {
amountReturned = 0; // No return in case of loss
}
// Close the position
position.isOpen = false;
if (amountReturned > 0) {
IERC20 token = IERC20(defaultTradingToken);
require(token.balanceOf(address(this)) >= amountReturned, "Insufficient contract balance");
require(token.transfer(msg.sender, amountReturned), "Transfer failed");
}
emit PositionClosed(positionId, msg.sender, wasProfitable, amountReturned);
}
/**
* @dev Function to set or update the oracle for the default trading token.
* @param tokenAddress The address of the trading token.
* @param oracleAddress The address of the oracle for the token.
* Requires that both addresses are not zero.
* Updates the oracle mapping and sets the default trading token.
* Emits DefaultTradingTokenOracleUpdated event upon success.
*/
function setDefaultTradingToken(address tokenAddress, address oracleAddress) public onlyOwner {
require(tokenAddress != address(0), "Token address cannot be zero");
require(oracleAddress != address(0), "Oracle address cannot be zero");
defaultTradingTokenOracles[tokenAddress] = oracleAddress;
defaultTradingToken = tokenAddress;
emit DefaultTradingTokenOracleUpdated(tokenAddress, oracleAddress);
}
/**
* @dev Function to retrieve the current price from the oracle.
* @param pair The trading pair symbol.
* @return price The current price of the trading pair.
* Requires that the oracle is set for the specified pair and the price is not zero.
*/
function getPrice(string memory pair) public view returns (int256) {
PricePair memory pricePair = pricePairs[pair];
require(pricePair.oracleAddress != address(0), "Oracle not set for this pair");
IAggregator oracle = IAggregator(pricePair.oracleAddress);
int256 price = oracle.latestAnswer();
require(price != 0, "Price cannot be zero");
return price;
}
/**
* @dev Returns the price for a given class ID by finding the corresponding pair symbol and fetching its price.
* @param classId The class ID for which the price is to be fetched.
* @return The price of the asset associated with the given class ID.
*/
function getPriceByClassId(string memory classId) public view returns (int256) {
for (uint i = 0; i < currencyPairCount + metalPairCount; i++) {
PricePair storage pricePair = pricePairs[uintToString(i)];
if (keccak256(bytes(pricePair.classId)) == keccak256(bytes(classId))) {
return getPrice(pricePair.pairSymbol);
}
}
revert("Class ID not found");
}
/**
* @dev Adds a new price pair to the contract. Only callable by the contract owner.
* @param pairSymbol The symbol representing the pair.
* @param assetOne Name of the first asset.
* @param assetTwo Name of the second asset.
* @param oracleAddress Address of the price oracle for this pair.
* @param isCurrencyPair Boolean flag indicating if it's a currency pair.
*/
function addPricePair(string memory pairSymbol, string memory assetOne, string memory assetTwo, address oracleAddress, bool isCurrencyPair) public onlyOwner {
require(oracleAddress != address(0), "Oracle address cannot be zero");
require(isValidPairSymbol(pairSymbol), "Invalid pair symbol format");
string memory classId;
if (isCurrencyPair) {
classId = string(abi.encodePacked("A", uintToString(++currencyPairCount)));
} else {
classId = string(abi.encodePacked("B", uintToString(++metalPairCount)));
}
bytes32 dataHash = keccak256(abi.encodePacked(pairSymbol, assetOne, assetTwo, oracleAddress, isCurrencyPair, classId));
pricePairs[pairSymbol] = PricePair(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
emit PricePairAdded(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
}
/**
* @dev Helper function to check if a pair symbol is in a valid format.
* @param symbol The symbol to be validated.
* @return A boolean indicating whether the symbol is valid.
*/
function isValidPairSymbol(string memory symbol) private pure returns (bool) {
bytes memory symbolBytes = bytes(symbol);
bool slashFound = false;
for(uint i = 0; i < symbolBytes.length; i++) {
if(symbolBytes[i] == "/") {
if(slashFound || i == 0 || i == symbolBytes.length - 1) {
return false;
}
slashFound = true;
}
}
return slashFound;
}
/**
* @dev Allows the owner to deposit the default trading token into the contract.
* @param amount The amount of the token to be deposited.
*/
function depositDefaultTradingToken(uint256 amount) public onlyOwner {
require(defaultTradingToken != address(0), "Default trading token not set");
IERC20 token = IERC20(defaultTradingToken);
require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");
emit DefaultTokenDepositedByOwner(msg.sender, amount);
}
/**
* @dev Allows the owner to withdraw the default trading token from the contract.
* @param amount The amount of the token to be withdrawn.
*/
function withdrawDefaultTradingToken(uint256 amount) public onlyOwner {
require(defaultTradingToken != address(0), "Default trading token not set");
IERC20 token = IERC20(defaultTradingToken);
uint256 contractBalance = token.balanceOf(address(this));
require(contractBalance >= amount, "Insufficient funds in the contract");
require(token.transfer(msg.sender, amount), "Transfer failed");
emit DefaultTokenWithdrawnByOwner(msg.sender, amount);
}
/**
* @dev Helper function to convert a uint256 to a string.
* @param v The uint256 value to be converted.
* @return str The string representation of the input value.
*/
function uintToString(uint v) private pure returns (string memory str) {
if (v == 0) {
return "0";
}
uint j = v;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len;
while (v != 0) {
k = k-1;
uint8 temp = (48 + uint8(v - v / 10 * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
v /= 10;
}
return string(bstr);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenDepositedByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenWithdrawnByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"}],"name":"DefaultTradingTokenOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"bool","name":"wasProfitable","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amountReturned","type":"uint256"}],"name":"PositionClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"}],"name":"PositionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"assetOne","type":"string"},{"indexed":false,"internalType":"string","name":"assetTwo","type":"string"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"PricePairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newProfitFeePercentage","type":"uint256"}],"name":"ProfitFeePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupBlock","type":"uint256"}],"name":"SetupCompleted","type":"event"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"assetOne","type":"string"},{"internalType":"string","name":"assetTwo","type":"string"},{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"bool","name":"isCurrencyPair","type":"bool"}],"name":"addPricePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"closePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"classId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"}],"name":"createPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"currency","type":"string"}],"name":"getCurrencyOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrencyPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultTradingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getDefaultTradingTokenOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsSetup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetalPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPositionCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getPositionDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"getPositionPriceInCurrencies","outputs":[{"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"internalType":"uint256","name":"priceInEUR","type":"uint256"},{"internalType":"uint256","name":"priceInGBP","type":"uint256"},{"internalType":"uint256","name":"priceInCHF","type":"uint256"},{"internalType":"uint256","name":"priceInCNY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pair","type":"string"}],"name":"getPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"classId","type":"string"}],"name":"getPriceByClassId","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"}],"name":"getPricePairDetails","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProfitFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"currency","type":"string"},{"internalType":"address","name":"oracleAddress","type":"address"}],"name":"setCurrencyOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"oracleAddress","type":"address"}],"name":"setDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setMinimumTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFeePercentage","type":"uint256"}],"name":"setProfitFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b5061359d8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80639ecceb5e116100fe578063c5d80c7d1161009e578063e3601e341161006e578063e3601e34146103e6578063eaf92c52146103ee578063edbfe0a014610419578063f5f5ba721461042c575f80fd5b8063c5d80c7d14610372578063c9efe435146103ad578063d5ae5e11146103c0578063d7fdc664146103d3575f80fd5b8063a58aba8f116100d9578063a58aba8f14610322578063b0ca3d0114610347578063b187bd261461035a578063ba0bba401461036a575f80fd5b80639ecceb5e146102d05780639f40d0cd146102f8578063a126d6011461030f575f80fd5b80636a333fe61161017457806381aafcfb1161014457806381aafcfb146102915780638456cb59146102a4578063893d20e8146102ac5780638dcdd021146102bd575f80fd5b80636a333fe61461025b5780636b49bac7146102635780637808cf1d1461026b5780637dc851e51461027e575f80fd5b806329c1a991116101af57806329c1a991146102145780633f4ba83a1461021b5780633fd5376b14610223578063524f388914610248575f80fd5b80630b5ee006146101d55780630ee87df0146101ea5780631da58d1714610201575b5f80fd5b6101e86101e3366004612b67565b610441565b005b6004545b6040519081526020015b60405180910390f35b6101e861020f366004612bd3565b610543565b5f546101ee565b6101e8610754565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101f8565b6101ee610256366004612c87565b6107db565b6006546101ee565b6001546101ee565b6101e8610279366004612cd4565b610b7e565b6101e861028c366004612d1f565b610c12565b61023061029f366004612c87565b610d30565b6101e8610d60565b6009546001600160a01b0316610230565b6101e86102cb366004612d57565b610dc3565b6102e36102de366004612bd3565b611037565b6040516101f899989796959493929190612e4b565b600b5460ff165b60405190151581526020016101f8565b6101e861031d366004612bd3565b611258565b610335610330366004612c87565b6117bc565b6040516101f896959493929190612eb7565b6101e8610355366004612bd3565b611a81565b600b54610100900460ff166102ff565b6101e8611b45565b610385610380366004612bd3565b611bed565b604080519586526020860194909452928401919091526060830152608082015260a0016101f8565b6101ee6103bb366004612c87565b611efe565b6101e86103ce366004612f26565b611fbe565b6101e86103e1366004612bd3565b61259f565b6008546101ee565b6102306103fc366004612fa8565b6001600160a01b039081165f908152600260205260409020541690565b6101e8610427366004612bd3565b6126f0565b61043461271f565b6040516101f89190612fc8565b6009546001600160a01b031633146104745760405162461bcd60e51b815260040161046b90612fda565b60405180910390fd5b600b54610100900460ff161561049c5760405162461bcd60e51b815260040161046b90613011565b600e6040516104ab9190613075565b604051809103902082826040516104c39291906130e7565b6040518091039020036105315760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b606482015260840161046b565b600e61053e828483613141565b505050565b6009546001600160a01b0316331461056d5760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166105c55760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906131fb565b9050828110156106905760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b606482015260840161046b565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af11580156106da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fe9190613212565b61071a5760405162461bcd60e51b815260040161046b9061322d565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b6009546001600160a01b0316331461077e5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff166107ce5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b604482015260640161046b565b600b805461ff0019169055565b5f80600a836040516107ed9190613256565b90815260200160405180910390206040518060c00160405290815f820180546108159061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108419061303d565b801561088c5780601f106108635761010080835404028352916020019161088c565b820191905f5260205f20905b81548152906001019060200180831161086f57829003601f168201915b505050505081526020016001820180546108a59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108d19061303d565b801561091c5780601f106108f35761010080835404028352916020019161091c565b820191905f5260205f20905b8154815290600101906020018083116108ff57829003601f168201915b505050505081526020016002820180546109359061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061303d565b80156109ac5780601f10610983576101008083540402835291602001916109ac565b820191905f5260205f20905b81548152906001019060200180831161098f57829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916109dc9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a089061303d565b8015610a535780601f10610a2a57610100808354040283529160200191610a53565b820191905f5260205f20905b815481529060010190602001808311610a3657829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b0316610ac55760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f722074686973207061697200000000604482015260640161046b565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2e91906131fb565b9050805f03610b765760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b604482015260640161046b565b949350505050565b6009546001600160a01b03163314610ba85760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038116610bce5760405162461bcd60e51b815260040161046b90613271565b80600583604051610bdf9190613256565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6009546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610c925760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f00000000604482015260640161046b565b6001600160a01b038116610cb85760405162461bcd60e51b815260040161046b90613271565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b5f600582604051610d419190613256565b908152604051908190036020019020546001600160a01b031692915050565b6009546001600160a01b03163314610d8a5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff1615610db25760405162461bcd60e51b815260040161046b90613011565b600b805461ff001916610100179055565b6009546001600160a01b03163314610ded5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610e135760405162461bcd60e51b815260040161046b90613271565b610e1c856127af565b610e685760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d6174000000000000604482015260640161046b565b60608115610eb057610e8a5f808154610e80906132bc565b918290555061282d565b604051602001610e9a91906132d4565b6040516020818303038152906040529050610ee3565b610ec160015f8154610e80906132bc565b604051602001610ed191906132fc565b60405160208183030381529060405290505b5f868686868686604051602001610eff96959493929190613317565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b0316815260200183815260200182815250600a88604051610f5d9190613256565b90815260405190819003602001902081518190610f7a9082613396565b5060208201516001820190610f8f9082613396565b5060408201516002820190610fa49082613396565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190610fdf9082613396565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e487878787868660405161102696959493929190612eb7565b60405180910390a150505050505050565b5f806060805f805f805f8060075f8c81526020019081526020015f20604051806101200160405290815f8201548152602001600182015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820180546110a69061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546110d29061303d565b801561111d5780601f106110f45761010080835404028352916020019161111d565b820191905f5260205f20905b81548152906001019060200180831161110057829003601f168201915b505050505081526020016003820180546111369061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546111629061303d565b80156111ad5780601f10611184576101008083540402835291602001916111ad565b820191905f5260205f20905b81548152906001019060200180831161119057829003601f168201915b5050505050815260200160048201548152602001600582015f9054906101000a900460ff161515151581526020016005820160019054906101000a900460ff16151515158152602001600682015481526020016007820154815250509050805f015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b600b54610100900460ff16156112805760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156112c45760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660019081179091555f828152600760205260409020908101546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320706f60448201526539b4ba34b7b760d11b606482015260840161046b565b6005810154610100900460ff166113a45760405162461bcd60e51b815260206004820152601a60248201527f506f736974696f6e20697320616c726561647920636c6f736564000000000000604482015260640161046b565b80600401544210156114135760405162461bcd60e51b815260206004820152603260248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f7265604482015271020697473207365742074696d657374616d760741b606482015260840161046b565b60045442101561148b5760405162461bcd60e51b815260206004820152603f60248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f726560448201527f206d696e696d756d2074696d657374616d7020736574206279206f776e657200606482015260840161046b565b5f61151f82600201805461149e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca9061303d565b80156115155780601f106114ec57610100808354040283529160200191611515565b820191905f5260205f20905b8154815290600101906020018083116114f857829003601f168201915b50505050506107db565b90505f81136115705760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063757272656e7420707269636520666f7220706169720000604482015260640161046b565b60058201545f90819060ff161561158f57836007015483119150611599565b8360070154831091505b811561160e5760078401545f906115b08186613456565b86600601546115bf9190613469565b6115c99190613480565b90505f620f4240600854836115de9190613469565b6115e89190613480565b9050808287600601546115fb919061349f565b6116059190613456565b92505050611611565b505f5b60058401805461ff0019169055801561176c576003546040516370a0823160e01b81523060048201526001600160a01b0390911690829082906370a0823190602401602060405180830381865afa15801561166e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169291906131fb565b10156116e05760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604482015260640161046b565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af115801561172a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174e9190613212565b61176a5760405162461bcd60e51b815260040161046b9061322d565b505b60408051831515815260208101839052339187917f9e65723e6c7acb1f0a5433ac5cb04c672922b9ea7458668112e59a3148a4a59e910160405180910390a35050600d805460ff19169055505050565b60608060605f60605f80600a886040516117d69190613256565b90815260200160405180910390206040518060c00160405290815f820180546117fe9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461182a9061303d565b80156118755780601f1061184c57610100808354040283529160200191611875565b820191905f5260205f20905b81548152906001019060200180831161185857829003601f168201915b5050505050815260200160018201805461188e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061303d565b80156119055780601f106118dc57610100808354040283529160200191611905565b820191905f5260205f20905b8154815290600101906020018083116118e857829003601f168201915b5050505050815260200160028201805461191e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461194a9061303d565b80156119955780601f1061196c57610100808354040283529160200191611995565b820191905f5260205f20905b81548152906001019060200180831161197857829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916119c59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546119f19061303d565b8015611a3c5780601f10611a1357610100808354040283529160200191611a3c565b820191905f5260205f20905b815481529060010190602001808311611a1f57829003601f168201915b50505091835250506005919091015460209182015281519082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b6009546001600160a01b03163314611aab5760405162461bcd60e51b815260040161046b90612fda565b62051615811115611b0a5760405162461bcd60e51b8152602060048201526024808201527f4665652070657263656e746167652063616e6e6f74206578636565642033332c6044820152633333332560e01b606482015260840161046b565b60088190556040518181527f03f98616ec62d83e2c04df10d90f9760c157d6a00a06481856e648d20151dddd9060200160405180910390a150565b600b5460ff1615611b905760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b604482015260640161046b565b600980546001600160a01b0319163390811790915543600c8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600b805460ff19166001179055565b5f8181526007602090815260408083208151610120810183528154815260018201546001600160a01b031693810193909352600281018054859485948594859485949192840191611c3d9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c699061303d565b8015611cb45780601f10611c8b57610100808354040283529160200191611cb4565b820191905f5260205f20905b815481529060010190602001808311611c9757829003601f168201915b50505050508152602001600382018054611ccd9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf99061303d565b8015611d445780601f10611d1b57610100808354040283529160200191611d44565b820191905f5260205f20905b815481529060010190602001808311611d2757829003601f168201915b505050918352505060048201546020820152600582015460ff8082161515604084015261010090910416151560608201526006820154608082015260079091015460a09091015280519091505f03611dde5760405162461bcd60e51b815260206004820152601760248201527f506f736974696f6e20646f6573206e6f74206578697374000000000000000000604482015260640161046b565b5f611dec82604001516107db565b90505f8113611e365760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b60e0820151611e459082613469565b9650611e70604051806040016040528060078152602001661155548bd554d160ca1b81525088612953565b9550611e9b6040518060400160405280600781526020016611d0940bd554d160ca1b81525088612953565b9450611ec66040518060400160405280600781526020016610d2118bd554d160ca1b81525088612953565b9350611ef16040518060400160405280600781526020016610d3964bd554d160ca1b81525088612953565b9250505091939590929450565b5f805b6001545f54611f10919061349f565b811015611f80575f600a611f238361282d565b604051611f309190613256565b90815260200160405180910390209050838051906020012081600401604051611f599190613075565b604051809103902003611f7757610b76815f01805461149e9061303d565b50600101611f01565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b604482015260640161046b565b84845f600a83604051611fd19190613256565b90815260200160405180910390206040518060c00160405290815f82018054611ff99061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120259061303d565b80156120705780601f1061204757610100808354040283529160200191612070565b820191905f5260205f20905b81548152906001019060200180831161205357829003601f168201915b505050505081526020016001820180546120899061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120b59061303d565b80156121005780601f106120d757610100808354040283529160200191612100565b820191905f5260205f20905b8154815290600101906020018083116120e357829003601f168201915b505050505081526020016002820180546121199061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121459061303d565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916121c09061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec9061303d565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160058201548152505090508180519060200120816080015180519060200120146122ad5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642070616972206f7220636c6173732049440000000000000000604482015260640161046b565b600b54610100900460ff16156122d55760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156123195760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660011790556004548510156123715760405162461bcd60e51b815260206004820152601660248201527554696d657374616d7020697320746f6f206561726c7960501b604482015260640161046b565b428511156123c15760405162461bcd60e51b815260206004820152601f60248201527f4675747572652074696d657374616d70206973206e6f7420616c6c6f77656400604482015260640161046b565b5f84116123e05760405162461bcd60e51b815260040161046b906134b2565b5f6123ea896107db565b90505f81136124345760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b61243d85612aae565b5f60065f815461244c906132bc565b918290555060408051610120810182528281523360208083019182528284018f8152606084018f9052608084018d90528d151560a0850152600160c0850181905260e085018d905261010085018990525f87815260079093529490912083518155915193820180546001600160a01b0319166001600160a01b039095169490941790935591519293509160028201906124e59082613396565b50606082015160038201906124fa9082613396565b506080820151600482015560a082015160058201805460c085015161ffff1990911692151561ff00191692909217610100921515830217905560e0830151600683015590910151600790910155604051339082907f81c9b58c22d0dd1b08d4012816ff5b2e54cf4388c6cd0ee81655f1df4223f2ac90612581908e908e908d908f906134fd565b60405180910390a35050600d805460ff191690555050505050505050565b6009546001600160a01b031633146125c95760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166126215760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269b9190613212565b6126b75760405162461bcd60e51b815260040161046b9061322d565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b6009546001600160a01b0316331461271a5760405162461bcd60e51b815260040161046b90612fda565b600455565b6060600e805461272e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461275a9061303d565b80156127a55780601f1061277c576101008083540402835291602001916127a5565b820191905f5260205f20905b81548152906001019060200180831161278857829003601f168201915b5050505050905090565b5f8181805b8251811015612825578281815181106127cf576127cf61353a565b01602001516001600160f81b031916602f60f81b0361281d5781806127f2575080155b806128095750600183516128069190613456565b81145b1561281857505f949350505050565b600191505b6001016127b4565b509392505050565b6060815f036128535750506040805180820190915260018152600360fc1b602082015290565b815f5b811561287c5780612866816132bc565b91506128759050600a83613480565b9150612856565b5f8167ffffffffffffffff81111561289657612896612bea565b6040519080825280601f01601f1916602001820160405280156128c0576020820181803683370190505b509050815b851561294a576128d6600182613456565b90505f6128e4600a88613480565b6128ef90600a613469565b6128f99088613456565b61290490603061354e565b90505f8160f81b9050808484815181106129205761292061353a565b60200101906001600160f81b03191690815f1a905350612941600a89613480565b975050506128c5565b50949350505050565b5f806005846040516129659190613256565b908152604051908190036020019020546001600160a01b03169050806129db5760405162461bcd60e51b815260206004820152602560248201527f4f7261636c65206e6f742073657420666f7220746869732063757272656e6379604482015264103830b4b960d91b606482015260840161046b565b5f8190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a4091906131fb565b90505f8113612a895760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642065786368616e6765207261746560581b604482015260640161046b565b6305f5e100612a988287613469565b612aa29190613480565b93505050505b92915050565b5f8111612acd5760405162461bcd60e51b815260040161046b906134b2565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612b23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b479190613212565b612b635760405162461bcd60e51b815260040161046b9061322d565b5050565b5f8060208385031215612b78575f80fd5b823567ffffffffffffffff80821115612b8f575f80fd5b818501915085601f830112612ba2575f80fd5b813581811115612bb0575f80fd5b866020828501011115612bc1575f80fd5b60209290920196919550909350505050565b5f60208284031215612be3575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612c0d575f80fd5b813567ffffffffffffffff80821115612c2857612c28612bea565b604051601f8301601f19908116603f01168101908282118183101715612c5057612c50612bea565b81604052838152866020858801011115612c68575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612c97575f80fd5b813567ffffffffffffffff811115612cad575f80fd5b610b7684828501612bfe565b80356001600160a01b0381168114612ccf575f80fd5b919050565b5f8060408385031215612ce5575f80fd5b823567ffffffffffffffff811115612cfb575f80fd5b612d0785828601612bfe565b925050612d1660208401612cb9565b90509250929050565b5f8060408385031215612d30575f80fd5b612d3983612cb9565b9150612d1660208401612cb9565b8015158114612d54575f80fd5b50565b5f805f805f60a08688031215612d6b575f80fd5b853567ffffffffffffffff80821115612d82575f80fd5b612d8e89838a01612bfe565b96506020880135915080821115612da3575f80fd5b612daf89838a01612bfe565b95506040880135915080821115612dc4575f80fd5b50612dd188828901612bfe565b935050612de060608701612cb9565b91506080860135612df081612d47565b809150509295509295909350565b5f5b83811015612e18578181015183820152602001612e00565b50505f910152565b5f8151808452612e37816020860160208601612dfe565b601f01601f19169290920160200192915050565b8981526001600160a01b0389166020820152610120604082018190525f90612e758382018b612e20565b90508281036060840152612e89818a612e20565b6080840198909852505093151560a085015291151560c084015260e083015261010090910152949350505050565b60c081525f612ec960c0830189612e20565b8281036020840152612edb8189612e20565b90508281036040840152612eef8188612e20565b6001600160a01b038716606085015283810360808501529050612f128186612e20565b9150508260a0830152979650505050505050565b5f805f805f60a08688031215612f3a575f80fd5b853567ffffffffffffffff80821115612f51575f80fd5b612f5d89838a01612bfe565b96506020880135915080821115612f72575f80fd5b50612f7f88828901612bfe565b9450506040860135612f9081612d47565b94979396509394606081013594506080013592915050565b5f60208284031215612fb8575f80fd5b612fc182612cb9565b9392505050565b602081525f612fc16020830184612e20565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061305157607f821691505b60208210810361306f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8083546130828161303d565b6001828116801561309a57600181146130af576130db565b60ff19841687528215158302870194506130db565b875f526020805f205f5b858110156130d25781548a8201529084019082016130b9565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b601f82111561053e57805f5260205f20601f840160051c8101602085101561311b5750805b601f840160051c820191505b8181101561313a575f8155600101613127565b5050505050565b67ffffffffffffffff83111561315957613159612bea565b61316d83613167835461303d565b836130f6565b5f601f84116001811461319e575f85156131875750838201355b5f19600387901b1c1916600186901b17835561313a565b5f83815260208120601f198716915b828110156131cd57868501358255602094850194600190920191016131ad565b50868210156131e9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561320b575f80fd5b5051919050565b5f60208284031215613222575f80fd5b8151612fc181612d47565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b5f8251613267818460208701612dfe565b9190910192915050565b6020808252601d908201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016132cd576132cd6132a8565b5060010190565b604160f81b81525f82516132ef816001850160208701612dfe565b9190910160010192915050565b602160f91b81525f82516132ef816001850160208701612dfe565b5f8751613328818460208c01612dfe565b87519083019061333c818360208c01612dfe565b875191019061334f818360208b01612dfe565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351613386816015840160208801612dfe565b0160150198975050505050505050565b815167ffffffffffffffff8111156133b0576133b0612bea565b6133c4816133be845461303d565b846130f6565b602080601f8311600181146133f7575f84156133e05750858301515b5f19600386901b1c1916600185901b17855561344e565b5f85815260208120601f198616915b8281101561342557888601518255948401946001909101908401613406565b508582101561344257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b81810381811115612aa857612aa86132a8565b8082028115828204841417612aa857612aa86132a8565b5f8261349a57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612aa857612aa86132a8565b6020808252602b908201527f436f6c6c61746572616c20616d6f756e74206d7573742062652067726561746560408201526a72207468616e207a65726f60a81b606082015260800190565b608081525f61350f6080830187612e20565b82810360208401526135218187612e20565b6040840195909552505090151560609091015292915050565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612aa857612aa86132a856fea2646970667358221220f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d64736f6c63430008170033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80639ecceb5e116100fe578063c5d80c7d1161009e578063e3601e341161006e578063e3601e34146103e6578063eaf92c52146103ee578063edbfe0a014610419578063f5f5ba721461042c575f80fd5b8063c5d80c7d14610372578063c9efe435146103ad578063d5ae5e11146103c0578063d7fdc664146103d3575f80fd5b8063a58aba8f116100d9578063a58aba8f14610322578063b0ca3d0114610347578063b187bd261461035a578063ba0bba401461036a575f80fd5b80639ecceb5e146102d05780639f40d0cd146102f8578063a126d6011461030f575f80fd5b80636a333fe61161017457806381aafcfb1161014457806381aafcfb146102915780638456cb59146102a4578063893d20e8146102ac5780638dcdd021146102bd575f80fd5b80636a333fe61461025b5780636b49bac7146102635780637808cf1d1461026b5780637dc851e51461027e575f80fd5b806329c1a991116101af57806329c1a991146102145780633f4ba83a1461021b5780633fd5376b14610223578063524f388914610248575f80fd5b80630b5ee006146101d55780630ee87df0146101ea5780631da58d1714610201575b5f80fd5b6101e86101e3366004612b67565b610441565b005b6004545b6040519081526020015b60405180910390f35b6101e861020f366004612bd3565b610543565b5f546101ee565b6101e8610754565b6003546001600160a01b03165b6040516001600160a01b0390911681526020016101f8565b6101ee610256366004612c87565b6107db565b6006546101ee565b6001546101ee565b6101e8610279366004612cd4565b610b7e565b6101e861028c366004612d1f565b610c12565b61023061029f366004612c87565b610d30565b6101e8610d60565b6009546001600160a01b0316610230565b6101e86102cb366004612d57565b610dc3565b6102e36102de366004612bd3565b611037565b6040516101f899989796959493929190612e4b565b600b5460ff165b60405190151581526020016101f8565b6101e861031d366004612bd3565b611258565b610335610330366004612c87565b6117bc565b6040516101f896959493929190612eb7565b6101e8610355366004612bd3565b611a81565b600b54610100900460ff166102ff565b6101e8611b45565b610385610380366004612bd3565b611bed565b604080519586526020860194909452928401919091526060830152608082015260a0016101f8565b6101ee6103bb366004612c87565b611efe565b6101e86103ce366004612f26565b611fbe565b6101e86103e1366004612bd3565b61259f565b6008546101ee565b6102306103fc366004612fa8565b6001600160a01b039081165f908152600260205260409020541690565b6101e8610427366004612bd3565b6126f0565b61043461271f565b6040516101f89190612fc8565b6009546001600160a01b031633146104745760405162461bcd60e51b815260040161046b90612fda565b60405180910390fd5b600b54610100900460ff161561049c5760405162461bcd60e51b815260040161046b90613011565b600e6040516104ab9190613075565b604051809103902082826040516104c39291906130e7565b6040518091039020036105315760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b606482015260840161046b565b600e61053e828483613141565b505050565b6009546001600160a01b0316331461056d5760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166105c55760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906131fb565b9050828110156106905760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b606482015260840161046b565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af11580156106da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fe9190613212565b61071a5760405162461bcd60e51b815260040161046b9061322d565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b6009546001600160a01b0316331461077e5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff166107ce5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b604482015260640161046b565b600b805461ff0019169055565b5f80600a836040516107ed9190613256565b90815260200160405180910390206040518060c00160405290815f820180546108159061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108419061303d565b801561088c5780601f106108635761010080835404028352916020019161088c565b820191905f5260205f20905b81548152906001019060200180831161086f57829003601f168201915b505050505081526020016001820180546108a59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546108d19061303d565b801561091c5780601f106108f35761010080835404028352916020019161091c565b820191905f5260205f20905b8154815290600101906020018083116108ff57829003601f168201915b505050505081526020016002820180546109359061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546109619061303d565b80156109ac5780601f10610983576101008083540402835291602001916109ac565b820191905f5260205f20905b81548152906001019060200180831161098f57829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916109dc9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a089061303d565b8015610a535780601f10610a2a57610100808354040283529160200191610a53565b820191905f5260205f20905b815481529060010190602001808311610a3657829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b0316610ac55760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f722074686973207061697200000000604482015260640161046b565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2e91906131fb565b9050805f03610b765760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b604482015260640161046b565b949350505050565b6009546001600160a01b03163314610ba85760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038116610bce5760405162461bcd60e51b815260040161046b90613271565b80600583604051610bdf9190613256565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6009546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610c925760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f00000000604482015260640161046b565b6001600160a01b038116610cb85760405162461bcd60e51b815260040161046b90613271565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b5f600582604051610d419190613256565b908152604051908190036020019020546001600160a01b031692915050565b6009546001600160a01b03163314610d8a5760405162461bcd60e51b815260040161046b90612fda565b600b54610100900460ff1615610db25760405162461bcd60e51b815260040161046b90613011565b600b805461ff001916610100179055565b6009546001600160a01b03163314610ded5760405162461bcd60e51b815260040161046b90612fda565b6001600160a01b038216610e135760405162461bcd60e51b815260040161046b90613271565b610e1c856127af565b610e685760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d6174000000000000604482015260640161046b565b60608115610eb057610e8a5f808154610e80906132bc565b918290555061282d565b604051602001610e9a91906132d4565b6040516020818303038152906040529050610ee3565b610ec160015f8154610e80906132bc565b604051602001610ed191906132fc565b60405160208183030381529060405290505b5f868686868686604051602001610eff96959493929190613317565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b0316815260200183815260200182815250600a88604051610f5d9190613256565b90815260405190819003602001902081518190610f7a9082613396565b5060208201516001820190610f8f9082613396565b5060408201516002820190610fa49082613396565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190610fdf9082613396565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e487878787868660405161102696959493929190612eb7565b60405180910390a150505050505050565b5f806060805f805f805f8060075f8c81526020019081526020015f20604051806101200160405290815f8201548152602001600182015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820180546110a69061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546110d29061303d565b801561111d5780601f106110f45761010080835404028352916020019161111d565b820191905f5260205f20905b81548152906001019060200180831161110057829003601f168201915b505050505081526020016003820180546111369061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546111629061303d565b80156111ad5780601f10611184576101008083540402835291602001916111ad565b820191905f5260205f20905b81548152906001019060200180831161119057829003601f168201915b5050505050815260200160048201548152602001600582015f9054906101000a900460ff161515151581526020016005820160019054906101000a900460ff16151515158152602001600682015481526020016007820154815250509050805f015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509193959799909294969850565b600b54610100900460ff16156112805760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156112c45760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660019081179091555f828152600760205260409020908101546001600160a01b0316331461134b5760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320706f60448201526539b4ba34b7b760d11b606482015260840161046b565b6005810154610100900460ff166113a45760405162461bcd60e51b815260206004820152601a60248201527f506f736974696f6e20697320616c726561647920636c6f736564000000000000604482015260640161046b565b80600401544210156114135760405162461bcd60e51b815260206004820152603260248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f7265604482015271020697473207365742074696d657374616d760741b606482015260840161046b565b60045442101561148b5760405162461bcd60e51b815260206004820152603f60248201527f506f736974696f6e2063616e6e6f7420626520636c6f736564206265666f726560448201527f206d696e696d756d2074696d657374616d7020736574206279206f776e657200606482015260840161046b565b5f61151f82600201805461149e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca9061303d565b80156115155780601f106114ec57610100808354040283529160200191611515565b820191905f5260205f20905b8154815290600101906020018083116114f857829003601f168201915b50505050506107db565b90505f81136115705760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063757272656e7420707269636520666f7220706169720000604482015260640161046b565b60058201545f90819060ff161561158f57836007015483119150611599565b8360070154831091505b811561160e5760078401545f906115b08186613456565b86600601546115bf9190613469565b6115c99190613480565b90505f620f4240600854836115de9190613469565b6115e89190613480565b9050808287600601546115fb919061349f565b6116059190613456565b92505050611611565b505f5b60058401805461ff0019169055801561176c576003546040516370a0823160e01b81523060048201526001600160a01b0390911690829082906370a0823190602401602060405180830381865afa15801561166e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169291906131fb565b10156116e05760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e6365000000604482015260640161046b565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0382169063a9059cbb906044016020604051808303815f875af115801561172a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174e9190613212565b61176a5760405162461bcd60e51b815260040161046b9061322d565b505b60408051831515815260208101839052339187917f9e65723e6c7acb1f0a5433ac5cb04c672922b9ea7458668112e59a3148a4a59e910160405180910390a35050600d805460ff19169055505050565b60608060605f60605f80600a886040516117d69190613256565b90815260200160405180910390206040518060c00160405290815f820180546117fe9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461182a9061303d565b80156118755780601f1061184c57610100808354040283529160200191611875565b820191905f5260205f20905b81548152906001019060200180831161185857829003601f168201915b5050505050815260200160018201805461188e9061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546118ba9061303d565b80156119055780601f106118dc57610100808354040283529160200191611905565b820191905f5260205f20905b8154815290600101906020018083116118e857829003601f168201915b5050505050815260200160028201805461191e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461194a9061303d565b80156119955780601f1061196c57610100808354040283529160200191611995565b820191905f5260205f20905b81548152906001019060200180831161197857829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916119c59061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546119f19061303d565b8015611a3c5780601f10611a1357610100808354040283529160200191611a3c565b820191905f5260205f20905b815481529060010190602001808311611a1f57829003601f168201915b50505091835250506005919091015460209182015281519082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b6009546001600160a01b03163314611aab5760405162461bcd60e51b815260040161046b90612fda565b62051615811115611b0a5760405162461bcd60e51b8152602060048201526024808201527f4665652070657263656e746167652063616e6e6f74206578636565642033332c6044820152633333332560e01b606482015260840161046b565b60088190556040518181527f03f98616ec62d83e2c04df10d90f9760c157d6a00a06481856e648d20151dddd9060200160405180910390a150565b600b5460ff1615611b905760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b604482015260640161046b565b600980546001600160a01b0319163390811790915543600c8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600b805460ff19166001179055565b5f8181526007602090815260408083208151610120810183528154815260018201546001600160a01b031693810193909352600281018054859485948594859485949192840191611c3d9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c699061303d565b8015611cb45780601f10611c8b57610100808354040283529160200191611cb4565b820191905f5260205f20905b815481529060010190602001808311611c9757829003601f168201915b50505050508152602001600382018054611ccd9061303d565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf99061303d565b8015611d445780601f10611d1b57610100808354040283529160200191611d44565b820191905f5260205f20905b815481529060010190602001808311611d2757829003601f168201915b505050918352505060048201546020820152600582015460ff8082161515604084015261010090910416151560608201526006820154608082015260079091015460a09091015280519091505f03611dde5760405162461bcd60e51b815260206004820152601760248201527f506f736974696f6e20646f6573206e6f74206578697374000000000000000000604482015260640161046b565b5f611dec82604001516107db565b90505f8113611e365760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b60e0820151611e459082613469565b9650611e70604051806040016040528060078152602001661155548bd554d160ca1b81525088612953565b9550611e9b6040518060400160405280600781526020016611d0940bd554d160ca1b81525088612953565b9450611ec66040518060400160405280600781526020016610d2118bd554d160ca1b81525088612953565b9350611ef16040518060400160405280600781526020016610d3964bd554d160ca1b81525088612953565b9250505091939590929450565b5f805b6001545f54611f10919061349f565b811015611f80575f600a611f238361282d565b604051611f309190613256565b90815260200160405180910390209050838051906020012081600401604051611f599190613075565b604051809103902003611f7757610b76815f01805461149e9061303d565b50600101611f01565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b604482015260640161046b565b84845f600a83604051611fd19190613256565b90815260200160405180910390206040518060c00160405290815f82018054611ff99061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120259061303d565b80156120705780601f1061204757610100808354040283529160200191612070565b820191905f5260205f20905b81548152906001019060200180831161205357829003601f168201915b505050505081526020016001820180546120899061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546120b59061303d565b80156121005780601f106120d757610100808354040283529160200191612100565b820191905f5260205f20905b8154815290600101906020018083116120e357829003601f168201915b505050505081526020016002820180546121199061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121459061303d565b80156121905780601f1061216757610100808354040283529160200191612190565b820191905f5260205f20905b81548152906001019060200180831161217357829003601f168201915b505050918352505060038201546001600160a01b031660208201526004820180546040909201916121c09061303d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ec9061303d565b80156122375780601f1061220e57610100808354040283529160200191612237565b820191905f5260205f20905b81548152906001019060200180831161221a57829003601f168201915b5050505050815260200160058201548152505090508180519060200120816080015180519060200120146122ad5760405162461bcd60e51b815260206004820152601860248201527f496e76616c69642070616972206f7220636c6173732049440000000000000000604482015260640161046b565b600b54610100900460ff16156122d55760405162461bcd60e51b815260040161046b90613011565b600d5460ff16156123195760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b604482015260640161046b565b600d805460ff191660011790556004548510156123715760405162461bcd60e51b815260206004820152601660248201527554696d657374616d7020697320746f6f206561726c7960501b604482015260640161046b565b428511156123c15760405162461bcd60e51b815260206004820152601f60248201527f4675747572652074696d657374616d70206973206e6f7420616c6c6f77656400604482015260640161046b565b5f84116123e05760405162461bcd60e51b815260040161046b906134b2565b5f6123ea896107db565b90505f81136124345760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b210383934b1b2903337b9103830b4b960511b604482015260640161046b565b61243d85612aae565b5f60065f815461244c906132bc565b918290555060408051610120810182528281523360208083019182528284018f8152606084018f9052608084018d90528d151560a0850152600160c0850181905260e085018d905261010085018990525f87815260079093529490912083518155915193820180546001600160a01b0319166001600160a01b039095169490941790935591519293509160028201906124e59082613396565b50606082015160038201906124fa9082613396565b506080820151600482015560a082015160058201805460c085015161ffff1990911692151561ff00191692909217610100921515830217905560e0830151600683015590910151600790910155604051339082907f81c9b58c22d0dd1b08d4012816ff5b2e54cf4388c6cd0ee81655f1df4223f2ac90612581908e908e908d908f906134fd565b60405180910390a35050600d805460ff191690555050505050505050565b6009546001600160a01b031633146125c95760405162461bcd60e51b815260040161046b90612fda565b6003546001600160a01b03166126215760405162461bcd60e51b815260206004820152601d60248201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604482015260640161046b565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269b9190613212565b6126b75760405162461bcd60e51b815260040161046b9061322d565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b6009546001600160a01b0316331461271a5760405162461bcd60e51b815260040161046b90612fda565b600455565b6060600e805461272e9061303d565b80601f016020809104026020016040519081016040528092919081815260200182805461275a9061303d565b80156127a55780601f1061277c576101008083540402835291602001916127a5565b820191905f5260205f20905b81548152906001019060200180831161278857829003601f168201915b5050505050905090565b5f8181805b8251811015612825578281815181106127cf576127cf61353a565b01602001516001600160f81b031916602f60f81b0361281d5781806127f2575080155b806128095750600183516128069190613456565b81145b1561281857505f949350505050565b600191505b6001016127b4565b509392505050565b6060815f036128535750506040805180820190915260018152600360fc1b602082015290565b815f5b811561287c5780612866816132bc565b91506128759050600a83613480565b9150612856565b5f8167ffffffffffffffff81111561289657612896612bea565b6040519080825280601f01601f1916602001820160405280156128c0576020820181803683370190505b509050815b851561294a576128d6600182613456565b90505f6128e4600a88613480565b6128ef90600a613469565b6128f99088613456565b61290490603061354e565b90505f8160f81b9050808484815181106129205761292061353a565b60200101906001600160f81b03191690815f1a905350612941600a89613480565b975050506128c5565b50949350505050565b5f806005846040516129659190613256565b908152604051908190036020019020546001600160a01b03169050806129db5760405162461bcd60e51b815260206004820152602560248201527f4f7261636c65206e6f742073657420666f7220746869732063757272656e6379604482015264103830b4b960d91b606482015260840161046b565b5f8190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a4091906131fb565b90505f8113612a895760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642065786368616e6765207261746560581b604482015260640161046b565b6305f5e100612a988287613469565b612aa29190613480565b93505050505b92915050565b5f8111612acd5760405162461bcd60e51b815260040161046b906134b2565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015612b23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b479190613212565b612b635760405162461bcd60e51b815260040161046b9061322d565b5050565b5f8060208385031215612b78575f80fd5b823567ffffffffffffffff80821115612b8f575f80fd5b818501915085601f830112612ba2575f80fd5b813581811115612bb0575f80fd5b866020828501011115612bc1575f80fd5b60209290920196919550909350505050565b5f60208284031215612be3575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612c0d575f80fd5b813567ffffffffffffffff80821115612c2857612c28612bea565b604051601f8301601f19908116603f01168101908282118183101715612c5057612c50612bea565b81604052838152866020858801011115612c68575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215612c97575f80fd5b813567ffffffffffffffff811115612cad575f80fd5b610b7684828501612bfe565b80356001600160a01b0381168114612ccf575f80fd5b919050565b5f8060408385031215612ce5575f80fd5b823567ffffffffffffffff811115612cfb575f80fd5b612d0785828601612bfe565b925050612d1660208401612cb9565b90509250929050565b5f8060408385031215612d30575f80fd5b612d3983612cb9565b9150612d1660208401612cb9565b8015158114612d54575f80fd5b50565b5f805f805f60a08688031215612d6b575f80fd5b853567ffffffffffffffff80821115612d82575f80fd5b612d8e89838a01612bfe565b96506020880135915080821115612da3575f80fd5b612daf89838a01612bfe565b95506040880135915080821115612dc4575f80fd5b50612dd188828901612bfe565b935050612de060608701612cb9565b91506080860135612df081612d47565b809150509295509295909350565b5f5b83811015612e18578181015183820152602001612e00565b50505f910152565b5f8151808452612e37816020860160208601612dfe565b601f01601f19169290920160200192915050565b8981526001600160a01b0389166020820152610120604082018190525f90612e758382018b612e20565b90508281036060840152612e89818a612e20565b6080840198909852505093151560a085015291151560c084015260e083015261010090910152949350505050565b60c081525f612ec960c0830189612e20565b8281036020840152612edb8189612e20565b90508281036040840152612eef8188612e20565b6001600160a01b038716606085015283810360808501529050612f128186612e20565b9150508260a0830152979650505050505050565b5f805f805f60a08688031215612f3a575f80fd5b853567ffffffffffffffff80821115612f51575f80fd5b612f5d89838a01612bfe565b96506020880135915080821115612f72575f80fd5b50612f7f88828901612bfe565b9450506040860135612f9081612d47565b94979396509394606081013594506080013592915050565b5f60208284031215612fb8575f80fd5b612fc182612cb9565b9392505050565b602081525f612fc16020830184612e20565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c9082168061305157607f821691505b60208210810361306f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8083546130828161303d565b6001828116801561309a57600181146130af576130db565b60ff19841687528215158302870194506130db565b875f526020805f205f5b858110156130d25781548a8201529084019082016130b9565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b601f82111561053e57805f5260205f20601f840160051c8101602085101561311b5750805b601f840160051c820191505b8181101561313a575f8155600101613127565b5050505050565b67ffffffffffffffff83111561315957613159612bea565b61316d83613167835461303d565b836130f6565b5f601f84116001811461319e575f85156131875750838201355b5f19600387901b1c1916600186901b17835561313a565b5f83815260208120601f198716915b828110156131cd57868501358255602094850194600190920191016131ad565b50868210156131e9575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561320b575f80fd5b5051919050565b5f60208284031215613222575f80fd5b8151612fc181612d47565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b5f8251613267818460208701612dfe565b9190910192915050565b6020808252601d908201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016132cd576132cd6132a8565b5060010190565b604160f81b81525f82516132ef816001850160208701612dfe565b9190910160010192915050565b602160f91b81525f82516132ef816001850160208701612dfe565b5f8751613328818460208c01612dfe565b87519083019061333c818360208c01612dfe565b875191019061334f818360208b01612dfe565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351613386816015840160208801612dfe565b0160150198975050505050505050565b815167ffffffffffffffff8111156133b0576133b0612bea565b6133c4816133be845461303d565b846130f6565b602080601f8311600181146133f7575f84156133e05750858301515b5f19600386901b1c1916600185901b17855561344e565b5f85815260208120601f198616915b8281101561342557888601518255948401946001909101908401613406565b508582101561344257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b81810381811115612aa857612aa86132a8565b8082028115828204841417612aa857612aa86132a8565b5f8261349a57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612aa857612aa86132a8565b6020808252602b908201527f436f6c6c61746572616c20616d6f756e74206d7573742062652067726561746560408201526a72207468616e207a65726f60a81b606082015260800190565b608081525f61350f6080830187612e20565b82810360208401526135218187612e20565b6040840195909552505090151560609091015292915050565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612aa857612aa86132a856fea2646970667358221220f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d64736f6c63430008170033
Deployed Bytecode Sourcemap
1607:28242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12249:307;;;;;;:::i;:::-;;:::i;:::-;;10229:103;10308:16;;10229:103;;;757:25:1;;;745:2;730:18;10229:103:0;;;;;;;;28562:518;;;;;;:::i;:::-;;:::i;9107:102::-;9160:4;9184:17;9107:102;;13058:122;;;:::i;9994:109::-;10076:19;;-1:-1:-1;;;;;10076:19:0;9994:109;;;-1:-1:-1;;;;;1142:32:1;;;1124:51;;1112:2;1097:18;9994:109:0;978:203:1;24618:412:0;;;;;;:::i;:::-;;:::i;10807:101::-;10885:15;;10807:101;;9340:96;9414:14;;9340:96;;17938:231;;;;;;:::i;:::-;;:::i;23876:451::-;;;;;;:::i;:::-;;:::i;10541:132::-;;;;;;:::i;:::-;;:::i;12739:118::-;;;:::i;11266:81::-;11334:5;;-1:-1:-1;;;;;11334:5:0;11266:81;;26185:933;;;;;;:::i;:::-;;:::i;7787:559::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;11521:82::-;11588:7;;;;11521:82;;;6123:14:1;;6116:22;6098:41;;6086:2;6071:18;11521:82:0;5958:187:1;21503:1945:0;;;;;;:::i;:::-;;:::i;8497:473::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;20411:294::-;;;;;;:::i;:::-;;:::i;11703:80::-;11768:7;;;;;;;11703:80;;11975:156;;;:::i;18619:763::-;;;;;;:::i;:::-;;:::i;:::-;;;;7295:25:1;;;7351:2;7336:18;;7329:34;;;;7379:18;;;7372:34;;;;7437:2;7422:18;;7415:34;7480:3;7465:19;;7458:35;7282:3;7267:19;18619:763:0;7036:463:1;25322:438:0;;;;;;:::i;:::-;;:::i;16528:1152::-;;;;;;:::i;:::-;;:::i;28002:384::-;;;;;;:::i;:::-;;:::i;11033:109::-;11115:19;;11033:109;;9675:156;;;;;;:::i;:::-;-1:-1:-1;;;;;9783:40:0;;;9756:7;9783:40;;;:26;:40;;;;;;;;9675:156;15031:114;;;;;;:::i;:::-;;:::i;7529:101::-;;;:::i;:::-;;;;;;;:::i;12249:307::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;;;;;;;;;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;12390:12:::2;12374:30;;;;;;:::i;:::-;;;;;;;;12363:5;;12347:23;;;;;;;:::i;:::-;;;;;;;;:57:::0;12339:118:::2;;;::::0;-1:-1:-1;;;12339:118:0;;11276:2:1;12339:118:0::2;::::0;::::2;11258:21:1::0;11315:2;11295:18;;;11288:30;11354:34;11334:18;;;11327:62;-1:-1:-1;;;11405:18:1;;;11398:46;11461:19;;12339:118:0::2;11074:412:1::0;12339:118:0::2;12528:12;:20;12543:5:::0;;12528:12;:20:::2;:::i;:::-;;12249:307:::0;;:::o;28562:518::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;28651:19:::1;::::0;-1:-1:-1;;;;;28651:19:0::1;28643:75;;;::::0;-1:-1:-1;;;28643:75:0;;13593:2:1;28643:75:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:31;13651:18;;;13644:59;13720:18;;28643:75:0::1;13391:353:1::0;28643:75:0::1;28753:19;::::0;28810:30:::1;::::0;-1:-1:-1;;;28810:30:0;;28834:4:::1;28810:30;::::0;::::1;1124:51:1::0;-1:-1:-1;;;;;28753:19:0;;::::1;::::0;28731:12:::1;::::0;28753:19;;28810:15:::1;::::0;1097:18:1;;28810:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28784:56;;28878:6;28859:15;:25;;28851:72;;;::::0;-1:-1:-1;;;28851:72:0;;14140:2:1;28851:72:0::1;::::0;::::1;14122:21:1::0;14179:2;14159:18;;;14152:30;14218:34;14198:18;;;14191:62;-1:-1:-1;;;14269:18:1;;;14262:32;14311:19;;28851:72:0::1;13938:398:1::0;28851:72:0::1;28952:34;::::0;-1:-1:-1;;;28952:34:0;;28967:10:::1;28952:34;::::0;::::1;14515:51:1::0;14582:18;;;14575:34;;;-1:-1:-1;;;;;28952:14:0;::::1;::::0;::::1;::::0;14488:18:1;;28952:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28944:62;;;;-1:-1:-1::0;;;28944:62:0::1;;;;;;;:::i;:::-;29024:48;::::0;757:25:1;;;29053:10:0::1;::::0;29024:48:::1;::::0;745:2:1;730:18;29024:48:0::1;;;;;;;28632:448;;28562:518:::0;:::o;13058:122::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;7261:7:::1;::::0;::::1;::::0;::::1;;;7253:42;;;::::0;-1:-1:-1;;;7253:42:0;;15416:2:1;7253:42:0::1;::::0;::::1;15398:21:1::0;15455:2;15435:18;;;15428:30;-1:-1:-1;;;15474:18:1;;;15467:52;15536:18;;7253:42:0::1;15214:346:1::0;7253:42:0::1;13116:7:::2;:15:::0;;-1:-1:-1;;13116:15:0::2;::::0;;13058:122::o;24618:412::-;24677:6;24696:26;24725:10;24736:4;24725:16;;;;;;:::i;:::-;;;;;;;;;;;;;24696:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24696:45:0;;;-1:-1:-1;;24696:45:0;;;;-1:-1:-1;;;;;24696:45:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24696:45:0;;;-1:-1:-1;;24696:45:0;;;;;;;;;;;24760:23;;;;24696:45;;-1:-1:-1;;;;;;24760:37:0;24752:78;;;;-1:-1:-1;;;24752:78:0;;16061:2:1;24752:78:0;;;16043:21:1;16100:2;16080:18;;;16073:30;16139;16119:18;;;16112:58;16187:18;;24752:78:0;15859:352:1;24752:78:0;24841:18;24874:9;:23;;;24841:57;;24909:12;24924:6;-1:-1:-1;;;;;24924:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24909:36;;24964:5;24973:1;24964:10;24956:43;;;;-1:-1:-1;;;24956:43:0;;16606:2:1;24956:43:0;;;16588:21:1;16645:2;16625:18;;;16618:30;-1:-1:-1;;;16664:18:1;;;16657:50;16724:18;;24956:43:0;16404:344:1;24956:43:0;25017:5;24618:412;-1:-1:-1;;;;24618:412:0:o;17938:231::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18048:27:0;::::1;18040:69;;;;-1:-1:-1::0;;;18040:69:0::1;;;;;;;:::i;:::-;18148:13;18120:15;18136:8;18120:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;-1:-1:-1;;;;;18120:41:0;;;::::1;-1:-1:-1::0;;;;;;18120:41:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;17938:231:0:o;23876:451::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23989:26:0;::::1;23981:67;;;::::0;-1:-1:-1;;;23981:67:0;;17313:2:1;23981:67:0::1;::::0;::::1;17295:21:1::0;17352:2;17332:18;;;17325:30;17391;17371:18;;;17364:58;17439:18;;23981:67:0::1;17111:352:1::0;23981:67:0::1;-1:-1:-1::0;;;;;24067:27:0;::::1;24059:69;;;;-1:-1:-1::0;;;24059:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24141:40:0;;::::1;;::::0;;;:26:::1;:40;::::0;;;;;;;;:56;;-1:-1:-1;;;;;;24141:56:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;24208:19:::1;:34:::0;;;;::::1;::::0;::::1;::::0;;24258:61;;17680:34:1;;;17730:18;;17723:43;;;;24258:61:0::1;::::0;17615:18:1;24258:61:0::1;;;;;;;23876:451:::0;;:::o;10541:132::-;10613:7;10640:15;10656:8;10640:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;10640:25:0;;10541:132;-1:-1:-1;;10541:132:0:o;12739:118::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;12798:7:::2;:14:::0;;-1:-1:-1;;12798:14:0::2;;;::::0;;12739:118::o;26185:933::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26361:27:0;::::1;26353:69;;;;-1:-1:-1::0;;;26353:69:0::1;;;;;;;:::i;:::-;26441:29;26459:10;26441:17;:29::i;:::-;26433:68;;;::::0;-1:-1:-1;;;26433:68:0;;17979:2:1;26433:68:0::1;::::0;::::1;17961:21:1::0;18018:2;17998:18;;;17991:30;18057:28;18037:18;;;18030:56;18103:18;;26433:68:0::1;17777:350:1::0;26433:68:0::1;26514:21;26550:14;26546:225;;;26620:33;26635:17;::::0;26633:19:::1;;;;;:::i;:::-;::::0;;;;-1:-1:-1;26620:12:0::1;:33::i;:::-;26598:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;26581:74;;26546:225;;;26727:30;26742:14;;26740:16;;;;;:::i;26727:30::-;26705:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;26688:71;;26546:225;26783:16;26829:10;26841:8;26851;26861:13;26876:14;26892:7;26812:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26802:99;;;;;;26783:118;;26939:75;;;;;;;;26949:10;26939:75;;;;26961:8;26939:75;;;;26971:8;26939:75;;;;26981:13;-1:-1:-1::0;;;;;26939:75:0::1;;;;;26996:7;26939:75;;;;27005:8;26939:75;;::::0;26914:10:::1;26925;26914:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:100;;:22;;:100:::1;::::0;:22;:100:::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;26914:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;26914:100:0::1;-1:-1:-1::0;;;;;26914:100:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;;;;;;;;;;27030:80;27045:10;27057:8;27067;27077:13;27092:7;27101:8;27030:80;;;;;;;;;;;:::i;:::-;;;;;;;;26342:776;;26185:933:::0;;;;;:::o;7787:559::-;7866:7;7875;7884:13;7899;7914:7;7923:4;7929;7935:7;7944;7970:24;7997:9;:21;8007:10;7997:21;;;;;;;;;;;7970:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7970:48:0;-1:-1:-1;;;;;7970:48:0;-1:-1:-1;;;;;7970:48:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8051:8;:19;;;8085:8;:15;;;8115:8;:19;;;8149:8;:16;;;8180:8;:18;;;8213:8;:15;;;8243:8;:15;;;8273:8;:19;;;8307:8;:20;;;8029:309;;;;;;;;;;;;;;;;;;;7787:559;;;;;;;;;;;:::o;21503:1945::-;6968:7;;;;;;;6967:8;6959:39;;;;-1:-1:-1;;;6959:39:0;;;;;;;:::i;:::-;6383:6:::1;::::0;::::1;;6382:7;6374:34;;;::::0;-1:-1:-1;;;6374:34:0;;21956:2:1;6374:34:0::1;::::0;::::1;21938:21:1::0;21995:2;21975:18;;;21968:30;-1:-1:-1;;;22014:18:1;;;22007:44;22068:18;;6374:34:0::1;21754:338:1::0;6374:34:0::1;6419:6;:13:::0;;-1:-1:-1;;6419:13:0::1;6428:4;6419:13:::0;;::::1;::::0;;;:6:::1;21619:21:::0;;;:9:::2;:21;::::0;;;;21691:15;;::::2;::::0;-1:-1:-1;;;;;21691:15:0::2;21710:10;21691:29;21683:80;;;::::0;-1:-1:-1;;;21683:80:0;;22299:2:1;21683:80:0::2;::::0;::::2;22281:21:1::0;22338:2;22318:18;;;22311:30;22377:34;22357:18;;;22350:62;-1:-1:-1;;;22428:18:1;;;22421:36;22474:19;;21683:80:0::2;22097:402:1::0;21683:80:0::2;21782:15;::::0;::::2;::::0;::::2;::::0;::::2;;;21774:54;;;::::0;-1:-1:-1;;;21774:54:0;;22706:2:1;21774:54:0::2;::::0;::::2;22688:21:1::0;22745:2;22725:18;;;22718:30;22784:28;22764:18;;;22757:56;22830:18;;21774:54:0::2;22504:350:1::0;21774:54:0::2;21866:8;:18;;;21847:15;:37;;21839:100;;;::::0;-1:-1:-1;;;21839:100:0;;23061:2:1;21839:100:0::2;::::0;::::2;23043:21:1::0;23100:2;23080:18;;;23073:30;23139:34;23119:18;;;23112:62;-1:-1:-1;;;23190:18:1;;;23183:48;23248:19;;21839:100:0::2;22859:414:1::0;21839:100:0::2;21977:16;;21958:15;:35;;21950:111;;;::::0;-1:-1:-1;;;21950:111:0;;23480:2:1;21950:111:0::2;::::0;::::2;23462:21:1::0;23519:2;23499:18;;;23492:30;23558:34;23538:18;;;23531:62;23629:33;23609:18;;;23602:61;23680:19;;21950:111:0::2;23278:427:1::0;21950:111:0::2;22121:19;22143:29;22152:8;:19;;22143:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:29::i;:::-;22121:51;;22206:1;22191:12;:16;22183:59;;;::::0;-1:-1:-1;;;22183:59:0;;23912:2:1;22183:59:0::2;::::0;::::2;23894:21:1::0;23951:2;23931:18;;;23924:30;23990:32;23970:18;;;23963:60;24040:18;;22183:59:0::2;23710:354:1::0;22183:59:0::2;22380:15;::::0;::::2;::::0;22255:18:::2;::::0;;;22380:15:::2;;22376:201;;;22452:8;:20;;;22436:12;22428:44;22412:60;;22376:201;;;22545:8;:20;;;22529:12;22521:44;22505:60;;22376:201;22593:13;22589:403;;;22717:20;::::0;::::2;::::0;22623:19:::2;::::0;22669:44:::2;22717:20:::0;22677:12;22669:44:::2;:::i;:::-;22646:8;:19;;;:68;;;;:::i;:::-;:91;;;;:::i;:::-;22623:115;;22753:11;22803:7;22781:19;;22767:11;:33;;;;:::i;:::-;:43;;;;:::i;:::-;22753:57;;22897:3;22883:11;22861:8;:19;;;:33;;;;:::i;:::-;:39;;;;:::i;:::-;22844:56;;22608:304;;22589:403;;;-1:-1:-1::0;22950:1:0::2;22589:403;23035:15;::::0;::::2;:23:::0;;-1:-1:-1;;23035:23:0::2;::::0;;23075:18;;23071:283:::2;;23132:19;::::0;23175:30:::2;::::0;-1:-1:-1;;;23175:30:0;;23199:4:::2;23175:30;::::0;::::2;1124:51:1::0;-1:-1:-1;;;;;23132:19:0;;::::2;::::0;23209:14;;23132:19;;23175:15:::2;::::0;1097:18:1;;23175:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;23167:90;;;::::0;-1:-1:-1;;;23167:90:0;;24929:2:1;23167:90:0::2;::::0;::::2;24911:21:1::0;24968:2;24948:18;;;24941:30;25007:31;24987:18;;;24980:59;25056:18;;23167:90:0::2;24727:353:1::0;23167:90:0::2;23280:42;::::0;-1:-1:-1;;;23280:42:0;;23295:10:::2;23280:42;::::0;::::2;14515:51:1::0;14582:18;;;14575:34;;;-1:-1:-1;;;;;23280:14:0;::::2;::::0;::::2;::::0;14488:18:1;;23280:42:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23272:70;;;;-1:-1:-1::0;;;23272:70:0::2;;;;;;;:::i;:::-;23095:259;23071:283;23371:69;::::0;;25278:14:1;;25271:22;25253:41;;25325:2;25310:18;;25303:34;;;23398:10:0::2;::::0;23386;;23371:69:::2;::::0;25226:18:1;23371:69:0::2;;;;;;;-1:-1:-1::0;;6455:6:0::1;:14:::0;;-1:-1:-1;;6455:14:0::1;::::0;;-1:-1:-1;;;21503:1945:0:o;8497:473::-;8583:13;8598;8613;8628:7;8637:13;8652:7;8678:26;8707:10;8718;8707:22;;;;;;:::i;:::-;;;;;;;;;;;;;8678:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8678:51:0;;;-1:-1:-1;;8678:51:0;;;;-1:-1:-1;;;;;8678:51:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8678:51:0;;;-1:-1:-1;;8678:51:0;;;;;;;;;;;8762:20;;8797:18;;;;8830;;;;8863:23;;;;8901:17;;;;8933:18;;;;;8762:20;;8797:18;;-1:-1:-1;8830:18:0;;-1:-1:-1;8863:23:0;-1:-1:-1;8901:17:0;;-1:-1:-1;8933:18:0;-1:-1:-1;8497:473:0;-1:-1:-1;;;8497:473:0:o;20411:294::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;20533:6:::1;20509:20;:30;;20501:79;;;::::0;-1:-1:-1;;;20501:79:0;;25550:2:1;20501:79:0::1;::::0;::::1;25532:21:1::0;25589:2;25569:18;;;25562:30;25628:34;25608:18;;;25601:62;-1:-1:-1;;;25679:18:1;;;25672:34;25723:19;;20501:79:0::1;25348:400:1::0;20501:79:0::1;20591:19;:42:::0;;;20649:48:::1;::::0;757:25:1;;;20649:48:0::1;::::0;745:2:1;730:18;20649:48:0::1;;;;;;;20411:294:::0;:::o;11975:156::-;6639:7;;;;6638:8;6630:42;;;;-1:-1:-1;;;6630:42:0;;25955:2:1;6630:42:0;;;25937:21:1;25994:2;25974:18;;;25967:30;-1:-1:-1;;;26013:18:1;;;26006:51;26074:18;;6630:42:0;25753:345:1;6630:42:0;12020:5:::1;:18:::0;;-1:-1:-1;;;;;;12020:18:0::1;12028:10;12020:18:::0;;::::1;::::0;;;12062:12:::1;12049:10;:25:::0;;;12090:33:::1;::::0;757:25:1;;;12090:33:0::1;::::0;745:2:1;730:18;12090:33:0::1;;;;;;;6695:7:::0;:14;;-1:-1:-1;;6695:14:0;6705:4;6695:14;;;11975:156::o;18619:763::-;18698:18;18836:21;;;:9;:21;;;;;;;;18809:48;;;;;;;;;;;;;;;-1:-1:-1;;;;;18809:48:0;;;;;;;;;;;;;18698:18;;;;;;;;;;18836:21;;18809:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18809:48:0;;;-1:-1:-1;;18809:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18876:19;;18809:48;;-1:-1:-1;;18876:24:0;18868:60;;;;-1:-1:-1;;;18868:60:0;;26305:2:1;18868:60:0;;;26287:21:1;26344:2;26324:18;;;26317:30;26383:25;26363:18;;;26356:53;26426:18;;18868:60:0;26103:347:1;18868:60:0;18941:20;18964:29;18973:8;:19;;;18964:8;:29::i;:::-;18941:52;;19028:1;19012:13;:17;19004:52;;;;-1:-1:-1;;;19004:52:0;;26657:2:1;19004:52:0;;;26639:21:1;26696:2;26676:18;;;26669:30;-1:-1:-1;;;26715:18:1;;;26708:52;26777:18;;19004:52:0;26455:346:1;19004:52:0;19105:19;;;;19080:44;;19088:13;19080:44;:::i;:::-;19067:57;;19150:38;;;;;;;;;;;;;;-1:-1:-1;;;19150:38:0;;;19177:10;19150:15;:38::i;:::-;19137:51;;19212:38;;;;;;;;;;;;;;-1:-1:-1;;;19212:38:0;;;19239:10;19212:15;:38::i;:::-;19199:51;;19274:38;;;;;;;;;;;;;;-1:-1:-1;;;19274:38:0;;;19301:10;19274:15;:38::i;:::-;19261:51;;19336:38;;;;;;;;;;;;;;-1:-1:-1;;;19336:38:0;;;19363:10;19336:15;:38::i;:::-;19323:51;;18798:584;;18619:763;;;;;;;:::o;25322:438::-;25393:6;;25412:302;25453:14;;25433:17;;:34;;;;:::i;:::-;25429:1;:38;25412:302;;;25489:27;25519:10;25530:15;25543:1;25530:12;:15::i;:::-;25519:27;;;;;;:::i;:::-;;;;;;;;;;;;;25489:57;;25620:7;25604:25;;;;;;25581:9;:17;;25565:35;;;;;;:::i;:::-;;;;;;;;:64;25561:142;;25657:30;25666:9;:20;;25657:30;;;;;:::i;25561:142::-;-1:-1:-1;25469:3:0;;25412:302;;;-1:-1:-1;25724:28:0;;-1:-1:-1;;;25724:28:0;;27008:2:1;25724:28:0;;;26990:21:1;27047:2;27027:18;;;27020:30;-1:-1:-1;;;27066:18:1;;;27059:48;27124:18;;25724:28:0;26806:342:1;16528:1152:0;16680:10;16692:7;6014:21;6038:10;6049;6038:22;;;;;;:::i;:::-;;;;;;;;;;;;;6014:46;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6014:46:0;;;-1:-1:-1;;6014:46:0;;;;-1:-1:-1;;;;;6014:46:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6143:7;6127:25;;;;;;6109:4;:12;;;6093:30;;;;;;:59;6071:133;;;;-1:-1:-1;;;6071:133:0;;27355:2:1;6071:133:0;;;27337:21:1;27394:2;27374:18;;;27367:30;27433:26;27413:18;;;27406:54;27477:18;;6071:133:0;27153:348:1;6071:133:0;6968:7:::1;::::0;::::1;::::0;::::1;;;6967:8;6959:39;;;;-1:-1:-1::0;;;6959:39:0::1;;;;;;;:::i;:::-;6383:6:::2;::::0;::::2;;6382:7;6374:34;;;::::0;-1:-1:-1;;;6374:34:0;;21956:2:1;6374:34:0::2;::::0;::::2;21938:21:1::0;21995:2;21975:18;;;21968:30;-1:-1:-1;;;22014:18:1;;;22007:44;22068:18;;6374:34:0::2;21754:338:1::0;6374:34:0::2;6419:6;:13:::0;;-1:-1:-1;;6419:13:0::2;6428:4;6419:13;::::0;;16760:16:::3;::::0;16747:29;::::3;;16739:64;;;::::0;-1:-1:-1;;;16739:64:0;;27708:2:1;16739:64:0::3;::::0;::::3;27690:21:1::0;27747:2;27727:18;;;27720:30;-1:-1:-1;;;27766:18:1;;;27759:52;27828:18;;16739:64:0::3;27506:346:1::0;16739:64:0::3;16835:15;16822:9;:28;;16814:72;;;::::0;-1:-1:-1;;;16814:72:0;;28059:2:1;16814:72:0::3;::::0;::::3;28041:21:1::0;28098:2;28078:18;;;28071:30;28137:33;28117:18;;;28110:61;28188:18;;16814:72:0::3;27857:355:1::0;16814:72:0::3;16924:1;16905:16;:20;16897:76;;;;-1:-1:-1::0;;;16897:76:0::3;;;;;;;:::i;:::-;16986:18;17007:20;17016:10;17007:8;:20::i;:::-;16986:41;;17060:1;17046:11;:15;17038:50;;;::::0;-1:-1:-1;;;17038:50:0;;26657:2:1;17038:50:0::3;::::0;::::3;26639:21:1::0;26696:2;26676:18;;;26669:30;-1:-1:-1;;;26715:18:1;;;26708:52;26777:18;;17038:50:0::3;26455:346:1::0;17038:50:0::3;17101:35;17119:16;17101:17;:35::i;:::-;17149:21;17175:15;;17173:17;;;;;:::i;:::-;::::0;;;;-1:-1:-1;17228:344:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;17300:10:::3;17228:344;::::0;;::::3;::::0;;;;;;;;;;;;;;;;;;;;;;::::3;;::::0;;;;17465:4:::3;17228:344:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;17201:24:0;;;:9:::3;:24:::0;;;;;;;:371;;;;;;;;::::3;::::0;;-1:-1:-1;;;;;;17201:371:0::3;-1:-1:-1::0;;;;;17201:371:0;;::::3;::::0;;;::::3;::::0;;;;;17173:17;;-1:-1:-1;17228:344:0;17201:371:::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;17201:371:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;17201:371:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;-1:-1:-1;;17201:371:0;;;;::::3;;-1:-1:-1::0;;17201:371:0;;;;;::::3;::::0;::::3;;::::0;::::3;;::::0;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;;::::3;::::0;::::3;::::0;;::::3;::::0;17590:82:::3;::::0;17621:10:::3;::::0;17606:13;;17590:82:::3;::::0;::::3;::::0;17633:10;;17645:7;;17654:9;;17665:6;;17590:82:::3;:::i;:::-;;;;;;;;-1:-1:-1::0;;6455:6:0::2;:14:::0;;-1:-1:-1;;6455:14:0::2;::::0;;-1:-1:-1;;;;;;;;16528:1152:0:o;28002:384::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;28090:19:::1;::::0;-1:-1:-1;;;;;28090:19:0::1;28082:75;;;::::0;-1:-1:-1;;;28082:75:0;;13593:2:1;28082:75:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:31;13651:18;;;13644:59;13720:18;;28082:75:0::1;13391:353:1::0;28082:75:0::1;28200:19;::::0;28239:53:::1;::::0;-1:-1:-1;;;28239:53:0;;28258:10:::1;28239:53;::::0;::::1;29411:34:1::0;28278:4:0::1;29461:18:1::0;;;29454:43;29513:18;;;29506:34;;;-1:-1:-1;;;;;28200:19:0;;::::1;::::0;;;28239:18:::1;::::0;29346::1;;28239:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28231:81;;;;-1:-1:-1::0;;;28231:81:0::1;;;;;;;:::i;:::-;28330:48;::::0;757:25:1;;;28359:10:0::1;::::0;28330:48:::1;::::0;745:2:1;730:18;28330:48:0::1;;;;;;;28071:315;28002:384:::0;:::o;15031:114::-;5469:5;;-1:-1:-1;;;;;5469:5:0;5455:10;:19;5447:55;;;;-1:-1:-1;;;5447:55:0;;;;;;;:::i;:::-;15108:16:::1;:29:::0;15031:114::o;7529:101::-;7577:13;7610:12;7603:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7529:101;:::o;27337:490::-;27408:4;27458:6;27408:4;;27512:278;27532:11;:18;27528:1;:22;27512:278;;;27575:11;27587:1;27575:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;27575:14:0;-1:-1:-1;;;27575:21:0;27572:207;;27620:10;:20;;;-1:-1:-1;27634:6:0;;27620:20;:51;;;;27670:1;27649:11;:18;:22;;;;:::i;:::-;27644:1;:27;27620:51;27617:111;;;-1:-1:-1;27703:5:0;;27337:490;-1:-1:-1;;;;27337:490:0:o;27617:111::-;27759:4;27746:17;;27572:207;27552:3;;27512:278;;;-1:-1:-1;27809:10:0;27337:490;-1:-1:-1;;;27337:490:0:o;29287:559::-;29339:17;29373:1;29378;29373:6;29369:49;;-1:-1:-1;;29396:10:0;;;;;;;;;;;;-1:-1:-1;;;29396:10:0;;;;;29287:559::o;29369:49::-;29437:1;29428:6;29468:69;29475:6;;29468:69;;29498:5;;;;:::i;:::-;;-1:-1:-1;29518:7:0;;-1:-1:-1;29523:2:0;29518:7;;:::i;:::-;;;29468:69;;;29547:17;29577:3;29567:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29567:14:0;-1:-1:-1;29547:34:0;-1:-1:-1;29601:3:0;29615:194;29622:6;;29615:194;;29649:3;29651:1;29649;:3;:::i;:::-;29645:7;-1:-1:-1;29667:10:0;29696:6;29700:2;29696:1;:6;:::i;:::-;:11;;29705:2;29696:11;:::i;:::-;29692:15;;:1;:15;:::i;:::-;29681:27;;:2;:27;:::i;:::-;29667:42;;29724:9;29743:4;29736:12;;29724:24;;29773:2;29763:4;29768:1;29763:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;29763:12:0;;;;;;;;-1:-1:-1;29790:7:0;29795:2;29790:7;;:::i;:::-;;;29630:179;;29615:194;;;-1:-1:-1;29833:4:0;29287:559;-1:-1:-1;;;;29287:559:0:o;19730:503::-;19826:7;19846:21;19870:15;19886:12;19870:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;19870:29:0;;-1:-1:-1;19870:29:0;19910:77;;;;-1:-1:-1;;;19910:77:0;;30038:2:1;19910:77:0;;;30020:21:1;30077:2;30057:18;;;30050:30;30116:34;30096:18;;;30089:62;-1:-1:-1;;;30167:18:1;;;30160:35;30212:19;;19910:77:0;29836:401:1;19910:77:0;20000:18;20033:13;20000:47;;20058:19;20080:6;-1:-1:-1;;;;;20080:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20058:43;;20135:1;20120:12;:16;20112:50;;;;-1:-1:-1;;;20112:50:0;;30444:2:1;20112:50:0;;;30426:21:1;30483:2;30463:18;;;30456:30;-1:-1:-1;;;30502:18:1;;;30495:51;30563:18;;20112:50:0;30242:345:1;20112:50:0;20222:3;20183:35;20205:12;20183:11;:35;:::i;:::-;20182:43;;;;:::i;:::-;20175:50;;;;;19730:503;;;;;:::o;15495:282::-;15575:1;15566:6;:10;15558:66;;;;-1:-1:-1;;;15558:66:0;;;;;;;:::i;:::-;15657:19;;15696:53;;-1:-1:-1;;;15696:53:0;;15715:10;15696:53;;;29411:34:1;15735:4:0;29461:18:1;;;29454:43;29513:18;;;29506:34;;;-1:-1:-1;;;;;15657:19:0;;;;;;15696:18;;29346::1;;15696:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15688:81;;;;-1:-1:-1;;;15688:81:0;;;;;;;:::i;:::-;15547:230;15495:282;:::o;14:592:1:-;85:6;93;146:2;134:9;125:7;121:23;117:32;114:52;;;162:1;159;152:12;114:52;202:9;189:23;231:18;272:2;264:6;261:14;258:34;;;288:1;285;278:12;258:34;326:6;315:9;311:22;301:32;;371:7;364:4;360:2;356:13;352:27;342:55;;393:1;390;383:12;342:55;433:2;420:16;459:2;451:6;448:14;445:34;;;475:1;472;465:12;445:34;520:7;515:2;506:6;502:2;498:15;494:24;491:37;488:57;;;541:1;538;531:12;488:57;572:2;564:11;;;;;594:6;;-1:-1:-1;14:592:1;;-1:-1:-1;;;;14:592:1:o;793:180::-;852:6;905:2;893:9;884:7;880:23;876:32;873:52;;;921:1;918;911:12;873:52;-1:-1:-1;944:23:1;;793:180;-1:-1:-1;793:180:1:o;1186:127::-;1247:10;1242:3;1238:20;1235:1;1228:31;1278:4;1275:1;1268:15;1302:4;1299:1;1292:15;1318:719;1361:5;1414:3;1407:4;1399:6;1395:17;1391:27;1381:55;;1432:1;1429;1422:12;1381:55;1468:6;1455:20;1494:18;1531:2;1527;1524:10;1521:36;;;1537:18;;:::i;:::-;1612:2;1606:9;1580:2;1666:13;;-1:-1:-1;;1662:22:1;;;1686:2;1658:31;1654:40;1642:53;;;1710:18;;;1730:22;;;1707:46;1704:72;;;1756:18;;:::i;:::-;1796:10;1792:2;1785:22;1831:2;1823:6;1816:18;1877:3;1870:4;1865:2;1857:6;1853:15;1849:26;1846:35;1843:55;;;1894:1;1891;1884:12;1843:55;1958:2;1951:4;1943:6;1939:17;1932:4;1924:6;1920:17;1907:54;2005:1;1998:4;1993:2;1985:6;1981:15;1977:26;1970:37;2025:6;2016:15;;;;;;1318:719;;;;:::o;2042:322::-;2111:6;2164:2;2152:9;2143:7;2139:23;2135:32;2132:52;;;2180:1;2177;2170:12;2132:52;2220:9;2207:23;2253:18;2245:6;2242:30;2239:50;;;2285:1;2282;2275:12;2239:50;2308;2350:7;2341:6;2330:9;2326:22;2308:50;:::i;2549:173::-;2617:20;;-1:-1:-1;;;;;2666:31:1;;2656:42;;2646:70;;2712:1;2709;2702:12;2646:70;2549:173;;;:::o;2727:396::-;2805:6;2813;2866:2;2854:9;2845:7;2841:23;2837:32;2834:52;;;2882:1;2879;2872:12;2834:52;2922:9;2909:23;2955:18;2947:6;2944:30;2941:50;;;2987:1;2984;2977:12;2941:50;3010;3052:7;3043:6;3032:9;3028:22;3010:50;:::i;:::-;3000:60;;;3079:38;3113:2;3102:9;3098:18;3079:38;:::i;:::-;3069:48;;2727:396;;;;;:::o;3128:260::-;3196:6;3204;3257:2;3245:9;3236:7;3232:23;3228:32;3225:52;;;3273:1;3270;3263:12;3225:52;3296:29;3315:9;3296:29;:::i;:::-;3286:39;;3344:38;3378:2;3367:9;3363:18;3344:38;:::i;3393:118::-;3479:5;3472:13;3465:21;3458:5;3455:32;3445:60;;3501:1;3498;3491:12;3445:60;3393:118;:::o;3516:948::-;3638:6;3646;3654;3662;3670;3723:3;3711:9;3702:7;3698:23;3694:33;3691:53;;;3740:1;3737;3730:12;3691:53;3780:9;3767:23;3809:18;3850:2;3842:6;3839:14;3836:34;;;3866:1;3863;3856:12;3836:34;3889:50;3931:7;3922:6;3911:9;3907:22;3889:50;:::i;:::-;3879:60;;3992:2;3981:9;3977:18;3964:32;3948:48;;4021:2;4011:8;4008:16;4005:36;;;4037:1;4034;4027:12;4005:36;4060:52;4104:7;4093:8;4082:9;4078:24;4060:52;:::i;:::-;4050:62;;4165:2;4154:9;4150:18;4137:32;4121:48;;4194:2;4184:8;4181:16;4178:36;;;4210:1;4207;4200:12;4178:36;;4233:52;4277:7;4266:8;4255:9;4251:24;4233:52;:::i;:::-;4223:62;;;4304:38;4338:2;4327:9;4323:18;4304:38;:::i;:::-;4294:48;;4392:3;4381:9;4377:19;4364:33;4406:28;4428:5;4406:28;:::i;:::-;4453:5;4443:15;;;3516:948;;;;;;;;:::o;4469:250::-;4554:1;4564:113;4578:6;4575:1;4572:13;4564:113;;;4654:11;;;4648:18;4635:11;;;4628:39;4600:2;4593:10;4564:113;;;-1:-1:-1;;4711:1:1;4693:16;;4686:27;4469:250::o;4724:271::-;4766:3;4804:5;4798:12;4831:6;4826:3;4819:19;4847:76;4916:6;4909:4;4904:3;4900:14;4893:4;4886:5;4882:16;4847:76;:::i;:::-;4977:2;4956:15;-1:-1:-1;;4952:29:1;4943:39;;;;4984:4;4939:50;;4724:271;-1:-1:-1;;4724:271:1:o;5000:953::-;5385:25;;;-1:-1:-1;;;;;5446:32:1;;5441:2;5426:18;;5419:60;5373:3;5510:2;5495:18;;5488:30;;;5344:4;;5541:45;5567:18;;;5559:6;5541:45;:::i;:::-;5527:59;;5634:9;5626:6;5622:22;5617:2;5606:9;5602:18;5595:50;5662:33;5688:6;5680;5662:33;:::i;:::-;5726:3;5711:19;;5704:35;;;;-1:-1:-1;;5783:14:1;;5776:22;5770:3;5755:19;;5748:51;5843:14;;5836:22;5830:3;5815:19;;5808:51;5890:3;5875:19;;5868:35;5934:3;5919:19;;;5912:35;5654:41;5000:953;-1:-1:-1;;;;5000:953:1:o;6150:881::-;6499:3;6488:9;6481:22;6462:4;6526:46;6567:3;6556:9;6552:19;6544:6;6526:46;:::i;:::-;6620:9;6612:6;6608:22;6603:2;6592:9;6588:18;6581:50;6654:33;6680:6;6672;6654:33;:::i;:::-;6640:47;;6735:9;6727:6;6723:22;6718:2;6707:9;6703:18;6696:50;6769:33;6795:6;6787;6769:33;:::i;:::-;-1:-1:-1;;;;;6838:32:1;;6833:2;6818:18;;6811:60;6908:22;;;6902:3;6887:19;;6880:51;6755:47;-1:-1:-1;6948:33:1;6755:47;6966:6;6948:33;:::i;:::-;6940:41;;;7018:6;7012:3;7001:9;6997:19;6990:35;6150:881;;;;;;;;;:::o;7504:810::-;7616:6;7624;7632;7640;7648;7701:3;7689:9;7680:7;7676:23;7672:33;7669:53;;;7718:1;7715;7708:12;7669:53;7758:9;7745:23;7787:18;7828:2;7820:6;7817:14;7814:34;;;7844:1;7841;7834:12;7814:34;7867:50;7909:7;7900:6;7889:9;7885:22;7867:50;:::i;:::-;7857:60;;7970:2;7959:9;7955:18;7942:32;7926:48;;7999:2;7989:8;7986:16;7983:36;;;8015:1;8012;8005:12;7983:36;;8038:52;8082:7;8071:8;8060:9;8056:24;8038:52;:::i;:::-;8028:62;;;8140:2;8129:9;8125:18;8112:32;8153:28;8175:5;8153:28;:::i;:::-;7504:810;;;;-1:-1:-1;8200:5:1;;8252:2;8237:18;;8224:32;;-1:-1:-1;8303:3:1;8288:19;8275:33;;7504:810;-1:-1:-1;;7504:810:1:o;8319:186::-;8378:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:52;;;8447:1;8444;8437:12;8399:52;8470:29;8489:9;8470:29;:::i;:::-;8460:39;8319:186;-1:-1:-1;;;8319:186:1:o;8510:220::-;8659:2;8648:9;8641:21;8622:4;8679:45;8720:2;8709:9;8705:18;8697:6;8679:45;:::i;8735:347::-;8937:2;8919:21;;;8976:2;8956:18;;;8949:30;9015:25;9010:2;8995:18;;8988:53;9073:2;9058:18;;8735:347::o;9087:342::-;9289:2;9271:21;;;9328:2;9308:18;;;9301:30;-1:-1:-1;;;9362:2:1;9347:18;;9340:48;9420:2;9405:18;;9087:342::o;9434:380::-;9513:1;9509:12;;;;9556;;;9577:61;;9631:4;9623:6;9619:17;9609:27;;9577:61;9684:2;9676:6;9673:14;9653:18;9650:38;9647:161;;9730:10;9725:3;9721:20;9718:1;9711:31;9765:4;9762:1;9755:15;9793:4;9790:1;9783:15;9647:161;;9434:380;;;:::o;9948:845::-;10078:3;10107:1;10140:6;10134:13;10170:36;10196:9;10170:36;:::i;:::-;10225:1;10242:17;;;10268:133;;;;10415:1;10410:358;;;;10235:533;;10268:133;-1:-1:-1;;10301:24:1;;10289:37;;10374:14;;10367:22;10355:35;;10346:45;;;-1:-1:-1;10268:133:1;;10410:358;10441:6;10438:1;10431:17;10471:4;10516;10513:1;10503:18;10543:1;10557:165;10571:6;10568:1;10565:13;10557:165;;;10649:14;;10636:11;;;10629:35;10692:16;;;;10586:10;;10557:165;;;10561:3;;;10751:6;10746:3;10742:16;10735:23;;10235:533;-1:-1:-1;10784:3:1;;9948:845;-1:-1:-1;;;;;;9948:845:1:o;10798:271::-;10981:6;10973;10968:3;10955:33;10937:3;11007:16;;11032:13;;;11007:16;10798:271;-1:-1:-1;10798:271:1:o;11491:518::-;11593:2;11588:3;11585:11;11582:421;;;11629:5;11626:1;11619:16;11673:4;11670:1;11660:18;11743:2;11731:10;11727:19;11724:1;11720:27;11714:4;11710:38;11779:4;11767:10;11764:20;11761:47;;;-1:-1:-1;11802:4:1;11761:47;11857:2;11852:3;11848:12;11845:1;11841:20;11835:4;11831:31;11821:41;;11912:81;11930:2;11923:5;11920:13;11912:81;;;11989:1;11975:16;;11956:1;11945:13;11912:81;;;11916:3;;11491:518;;;:::o;12185:1201::-;12309:18;12304:3;12301:27;12298:53;;;12331:18;;:::i;:::-;12360:94;12450:3;12410:38;12442:4;12436:11;12410:38;:::i;:::-;12404:4;12360:94;:::i;:::-;12480:1;12505:2;12500:3;12497:11;12522:1;12517:611;;;;13172:1;13189:3;13186:93;;;-1:-1:-1;13245:19:1;;;13232:33;13186:93;-1:-1:-1;;12142:1:1;12138:11;;;12134:24;12130:29;12120:40;12166:1;12162:11;;;12117:57;13292:78;;12490:890;;12517:611;9895:1;9888:14;;;9932:4;9919:18;;-1:-1:-1;;12553:17:1;;;12671:229;12685:7;12682:1;12679:14;12671:229;;;12774:19;;;12761:33;12746:49;;12881:4;12866:20;;;;12834:1;12822:14;;;;12701:12;12671:229;;;12675:3;12928;12919:7;12916:16;12913:159;;;13052:1;13048:6;13042:3;13036;13033:1;13029:11;13025:21;13021:34;13017:39;13004:9;12999:3;12995:19;12982:33;12978:79;12970:6;12963:95;12913:159;;;13115:1;13109:3;13106:1;13102:11;13098:19;13092:4;13085:33;12490:890;;12185:1201;;;:::o;13749:184::-;13819:6;13872:2;13860:9;13851:7;13847:23;13843:32;13840:52;;;13888:1;13885;13878:12;13840:52;-1:-1:-1;13911:16:1;;13749:184;-1:-1:-1;13749:184:1:o;14620:245::-;14687:6;14740:2;14728:9;14719:7;14715:23;14711:32;14708:52;;;14756:1;14753;14746:12;14708:52;14788:9;14782:16;14807:28;14829:5;14807:28;:::i;14870:339::-;15072:2;15054:21;;;15111:2;15091:18;;;15084:30;-1:-1:-1;;;15145:2:1;15130:18;;15123:45;15200:2;15185:18;;14870:339::o;15565:289::-;15696:3;15734:6;15728:13;15750:66;15809:6;15804:3;15797:4;15789:6;15785:17;15750:66;:::i;:::-;15832:16;;;;;15565:289;-1:-1:-1;;15565:289:1:o;16753:353::-;16955:2;16937:21;;;16994:2;16974:18;;;16967:30;17033:31;17028:2;17013:18;;17006:59;17097:2;17082:18;;16753:353::o;18132:127::-;18193:10;18188:3;18184:20;18181:1;18174:31;18224:4;18221:1;18214:15;18248:4;18245:1;18238:15;18264:135;18303:3;18324:17;;;18321:43;;18344:18;;:::i;:::-;-1:-1:-1;18391:1:1;18380:13;;18264:135::o;18404:431::-;-1:-1:-1;;;18661:3:1;18654:16;18636:3;18699:6;18693:13;18715:74;18782:6;18778:1;18773:3;18769:11;18762:4;18754:6;18750:17;18715:74;:::i;:::-;18809:16;;;;18827:1;18805:24;;18404:431;-1:-1:-1;;18404:431:1:o;18840:::-;-1:-1:-1;;;19097:3:1;19090:16;19072:3;19135:6;19129:13;19151:74;19218:6;19214:1;19209:3;19205:11;19198:4;19190:6;19186:17;19151:74;:::i;19276:1120::-;19601:3;19639:6;19633:13;19655:66;19714:6;19709:3;19702:4;19694:6;19690:17;19655:66;:::i;:::-;19784:13;;19743:16;;;;19806:70;19784:13;19743:16;19853:4;19841:17;;19806:70;:::i;:::-;19943:13;;19898:20;;;19965:70;19943:13;19898:20;20012:4;20000:17;;19965:70;:::i;:::-;20108:2;20104:15;;;-1:-1:-1;;20100:53:1;20057:20;;20086:68;;;20202:14;;20195:22;20190:3;20186:32;20181:2;20170:14;;20163:56;20244:13;;20266:79;20244:13;20331:2;20320:14;;20313:4;20301:17;;20266:79;:::i;:::-;20365:20;20387:2;20361:29;;19276:1120;-1:-1:-1;;;;;;;;19276:1120:1:o;20401:1348::-;20527:3;20521:10;20554:18;20546:6;20543:30;20540:56;;;20576:18;;:::i;:::-;20605:97;20695:6;20655:38;20687:4;20681:11;20655:38;:::i;:::-;20649:4;20605:97;:::i;:::-;20757:4;;20814:2;20803:14;;20831:1;20826:666;;;;21536:1;21553:6;21550:89;;;-1:-1:-1;21605:19:1;;;21599:26;21550:89;-1:-1:-1;;12142:1:1;12138:11;;;12134:24;12130:29;12120:40;12166:1;12162:11;;;12117:57;21652:81;;20796:947;;20826:666;9895:1;9888:14;;;9932:4;9919:18;;-1:-1:-1;;20862:20:1;;;20983:236;20997:7;20994:1;20991:14;20983:236;;;21086:19;;;21080:26;21065:42;;21178:27;;;;21146:1;21134:14;;;;21013:19;;20983:236;;;20987:3;21247:6;21238:7;21235:19;21232:201;;;21308:19;;;21302:26;-1:-1:-1;;21391:1:1;21387:14;;;21403:3;21383:24;21379:37;21375:42;21360:58;21345:74;;21232:201;;;21479:1;21470:6;21467:1;21463:14;21459:22;21453:4;21446:36;20796:947;;;;;20401:1348;;:::o;24069:128::-;24136:9;;;24157:11;;;24154:37;;;24171:18;;:::i;24202:168::-;24275:9;;;24306;;24323:15;;;24317:22;;24303:37;24293:71;;24344:18;;:::i;24375:217::-;24415:1;24441;24431:132;;24485:10;24480:3;24476:20;24473:1;24466:31;24520:4;24517:1;24510:15;24548:4;24545:1;24538:15;24431:132;-1:-1:-1;24577:9:1;;24375:217::o;24597:125::-;24662:9;;;24683:10;;;24680:36;;;24696:18;;:::i;28217:407::-;28419:2;28401:21;;;28458:2;28438:18;;;28431:30;28497:34;28492:2;28477:18;;28470:62;-1:-1:-1;;;28563:2:1;28548:18;;28541:41;28614:3;28599:19;;28217:407::o;28629:537::-;28876:3;28865:9;28858:22;28839:4;28903:46;28944:3;28933:9;28929:19;28921:6;28903:46;:::i;:::-;28997:9;28989:6;28985:22;28980:2;28969:9;28965:18;28958:50;29025:33;29051:6;29043;29025:33;:::i;:::-;29089:2;29074:18;;29067:34;;;;-1:-1:-1;;29144:14:1;;29137:22;29132:2;29117:18;;;29110:50;29017:41;28629:537;-1:-1:-1;;28629:537:1:o;29551:127::-;29612:10;29607:3;29603:20;29600:1;29593:31;29643:4;29640:1;29633:15;29667:4;29664:1;29657:15;29683:148;29771:4;29750:12;;;29764;;;29746:31;;29789:13;;29786:39;;;29805:18;;:::i
Swarm Source
ipfs://f431c9f00d32614ae915e4f2ecb94b1a3bb0baa1dab13257283ba4b618cb7a9d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.