Source Code
Latest 25 from a total of 1,608 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Sign Proposal | 18575425 | 724 days ago | IN | 0 ETH | 0.00276249 | ||||
| Create Proposal | 18575425 | 724 days ago | IN | 0 ETH | 0.00383868 | ||||
| Submit Feed | 15557814 | 1147 days ago | IN | 0 ETH | 0.00080963 | ||||
| Submit Feed | 15556920 | 1148 days ago | IN | 0 ETH | 0.00080146 | ||||
| Submit Feed | 15290934 | 1190 days ago | IN | 0 ETH | 0.00111792 | ||||
| Submit Feed | 15241753 | 1197 days ago | IN | 0 ETH | 0.00130971 | ||||
| Submit Feed | 15203208 | 1203 days ago | IN | 0 ETH | 0.00158273 | ||||
| Submit Feed | 15066913 | 1225 days ago | IN | 0 ETH | 0.00179936 | ||||
| Submit Feed | 15066624 | 1225 days ago | IN | 0 ETH | 0.00223558 | ||||
| Submit Feed | 15066351 | 1225 days ago | IN | 0 ETH | 0.00208701 | ||||
| Submit Feed | 14866077 | 1259 days ago | IN | 0 ETH | 0.00283284 | ||||
| Submit Feed | 14377276 | 1336 days ago | IN | 0 ETH | 0.00357785 | ||||
| Submit Feed | 14370330 | 1337 days ago | IN | 0 ETH | 0.00409381 | ||||
| Submit Feed | 14369577 | 1337 days ago | IN | 0 ETH | 0.00477921 | ||||
| Submit Feed | 14326357 | 1344 days ago | IN | 0 ETH | 0.00576092 | ||||
| Submit Feed | 14286638 | 1350 days ago | IN | 0 ETH | 0.00630102 | ||||
| Submit Feed | 14203247 | 1363 days ago | IN | 0 ETH | 0.008087 | ||||
| Submit Feed | 13255227 | 1511 days ago | IN | 0 ETH | 0.00889844 | ||||
| Submit Feed | 13207984 | 1519 days ago | IN | 0 ETH | 0.01072985 | ||||
| Submit Feed | 13119311 | 1532 days ago | IN | 0 ETH | 0.01190689 | ||||
| Submit Feed | 13118388 | 1532 days ago | IN | 0 ETH | 0.01450109 | ||||
| Submit Feed | 13116952 | 1533 days ago | IN | 0 ETH | 0.01420681 | ||||
| Submit Feed | 13116087 | 1533 days ago | IN | 0 ETH | 0.01992271 | ||||
| Submit Feed | 13115534 | 1533 days ago | IN | 0 ETH | 0.02182776 | ||||
| Submit Feed | 13115253 | 1533 days ago | IN | 0 ETH | 0.02787528 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OpenOracleFramework
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./interfaces/IConjureFactory.sol";
import "./interfaces/IConjureRouter.sol";
contract OpenOracleFramework {
// using Openzeppelin contracts for SafeMath and Address
using SafeMath for uint256;
using Address for address;
// the address of the collateral contract factory
address public factoryContract;
// address used for pay out
address payable public payoutAddress;
// number of signers
uint256 public signerLength;
// addresses of the signers
address[] public signers;
// threshold which has to be reached
uint256 public signerThreshold;
// struct to keep the values for each individual round
struct feedRoundStruct {
uint256 value;
uint256 timestamp;
}
// stores historical values of feeds
mapping(uint256 => mapping(uint256 => uint256)) private historicalFeeds;
// indicates if sender is a signer
mapping(address => bool) private isSigner;
// mapping to store the actual submitted values per FeedId, per round number
mapping(uint256 => mapping(uint256 => mapping(address => feedRoundStruct))) private feedRoundNumberToStructMapping;
// indicates support of feeds
mapping(uint256 => uint256) public feedSupport;
// indicates if address si subscribed to a feed
mapping(address => mapping(uint256 => uint256)) private subscribedTo;
struct oracleStruct {
string feedName;
uint256 feedDecimals;
uint256 feedTimeslot;
uint256 latestPrice;
uint256 latestPriceUpdate;
// 0... donation, 1... subscription
uint256 revenueMode;
uint256 feedCost;
}
oracleStruct[] private feedList;
// indicates if oracle subscription is turned on. 0 indicates no pass
uint256 public subscriptionPassPrice;
mapping(address => uint256) private hasPass;
struct proposalStruct {
uint256 uintValue;
address addressValue;
address proposer;
// 0 ... pricePass
// 1 ... threshold
// 2 ... add signer
// 3 ... remove signer
// 4 ... payoutAddress
// 5 ... revenueMode
// 6 ... feedCost
uint256 proposalType;
uint256 proposalFeedId;
uint256 proposalActive;
}
proposalStruct[] public proposalList;
mapping(uint256 => mapping(address => bool)) private hasSignedProposal;
event contractSetup(address[] signers, uint256 signerThreshold, address payout);
event feedAdded(string name, string description, uint256 decimal, uint256 timeslot, uint256 feedId, uint256 mode, uint256 price);
event feedSigned(uint256 feedId, uint256 roundId, uint256 value, uint256 timestamp, address signer);
event routerFeeTaken(uint256 value, address sender);
event feedSupported(uint256 feedId, uint256 supportvalue);
event newProposal(uint256 proposalId, uint256 uintValue, address addressValue, uint256 oracleType, address proposer);
event proposalSigned(uint256 proposalId, address signer);
event newFee(uint256 value);
event newThreshold(uint256 value);
event newSigner(address signer);
event signerRemoved(address signer);
event newPayoutAddress(address payout);
event newRevenueMode(uint256 mode, uint256 feed);
event newFeedCost(uint256 cost, uint256 feed);
event subscriptionPassPriceUpdated(uint256 newPass);
// only Signer modifier
modifier onlySigner {
_onlySigner();
_;
}
// only Signer view
function _onlySigner() private view {
require(isSigner[msg.sender], "Only a signer can perform this action");
}
constructor() {
// Don't allow implementation to be initialized.
//factoryContract = address(1);
}
function initialize(
address[] memory signers_,
uint256 signerThreshold_,
address payable payoutAddress_,
uint256 subscriptionPassPrice_,
address factoryContract_
) external
{
require(factoryContract == address(0), "already initialized");
require(factoryContract_ != address(0), "factory can not be null");
require(signerThreshold_ != 0, "Threshold cant be 0");
require(signerThreshold_ <= signers_.length, "Threshold cant be more then signer count");
factoryContract = factoryContract_;
signerThreshold = signerThreshold_;
signers = signers_;
for(uint i=0; i< signers.length; i++) {
require(signers[i] != address(0), "Not zero address");
isSigner[signers[i]] = true;
}
signerLength = signers_.length;
payoutAddress = payoutAddress_;
subscriptionPassPrice = subscriptionPassPrice_;
emit contractSetup(signers_, signerThreshold, payoutAddress);
}
//---------------------------helper functions---------------------------
/**
* @dev implementation of a quicksort algorithm
*
* @param arr the array to be sorted
* @param left the left outer bound element to start the sort
* @param right the right outer bound element to stop the sort
*/
function quickSort(uint[] memory arr, int left, int right) private pure {
int i = left;
int j = right;
if (i == j) return;
uint pivot = arr[uint(left + (right - left) / 2)];
while (i <= j) {
while (arr[uint(i)] < pivot) i++;
while (pivot < arr[uint(j)]) j--;
if (i <= j) {
(arr[uint(i)], arr[uint(j)]) = (arr[uint(j)], arr[uint(i)]);
i++;
j--;
}
}
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
/**
* @dev sort implementation which calls the quickSort function
*
* @param data the array to be sorted
* @return the sorted array
*/
function sort(uint[] memory data) private pure returns (uint[] memory) {
quickSort(data, int(0), int(data.length - 1));
return data;
}
//---------------------------view functions ---------------------------
function getHistoricalFeeds(uint256[] memory feedIDs, uint256[] memory timestamps) external view returns (uint256[] memory) {
uint256 feedLen = feedIDs.length;
uint256[] memory returnPrices = new uint256[](feedLen);
require(feedIDs.length == timestamps.length, "Feeds and Timestamps must match");
for (uint i = 0; i < feedIDs.length; i++) {
if (subscriptionPassPrice > 0) {
if (hasPass[msg.sender] <= block.timestamp) {
if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
revert("No subscription to feed");
}
}
} else {
if (feedList[feedIDs[i]].revenueMode == 1 && subscribedTo[msg.sender][feedIDs[i]] < block.timestamp) {
revert("No subscription to feed");
}
}
uint256 roundNumber = timestamps[i] / feedList[feedIDs[i]].feedTimeslot;
returnPrices[i] = historicalFeeds[feedIDs[i]][roundNumber];
}
return (returnPrices);
}
/**
* @dev getFeeds function lets anyone call the oracle to receive data (maybe pay an optional fee)
*
* @param feedIDs the array of feedIds
*/
function getFeeds(uint256[] memory feedIDs) external view returns (uint256[] memory, uint256[] memory, uint256[] memory) {
uint256 feedLen = feedIDs.length;
uint256[] memory returnPrices = new uint256[](feedLen);
uint256[] memory returnTimestamps = new uint256[](feedLen);
uint256[] memory returnDecimals = new uint256[](feedLen);
for (uint i = 0; i < feedIDs.length; i++) {
(returnPrices[i] ,returnTimestamps[i], returnDecimals[i]) = getFeed(feedIDs[i]);
}
return (returnPrices, returnTimestamps, returnDecimals);
}
/**
* @dev getFeed function lets anyone call the oracle to receive data (maybe pay an optional fee)
*
* @param feedID the array of feedId
*/
function getFeed(uint256 feedID) public view returns (uint256, uint256, uint256) {
uint256 returnPrice;
uint256 returnTimestamp;
uint256 returnDecimals;
if (subscriptionPassPrice > 0) {
if (hasPass[msg.sender] <= block.timestamp) {
if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
revert("No subscription to feed");
}
}
} else {
if (feedList[feedID].revenueMode == 1 && subscribedTo[msg.sender][feedID] < block.timestamp) {
revert("No subscription to feed");
}
}
returnPrice = feedList[feedID].latestPrice;
returnTimestamp = feedList[feedID].latestPriceUpdate;
returnDecimals = feedList[feedID].feedDecimals;
return (returnPrice, returnTimestamp, returnDecimals);
}
function getFeedLength() external view returns(uint256){
return feedList.length;
}
function getFeedList(uint256[] memory feedIDs) external view returns(string[] memory, uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory) {
uint256 feedLen = feedIDs.length;
string[] memory returnNames = new string[](feedLen);
uint256[] memory returnDecimals = new uint256[](feedLen);
uint256[] memory returnTimeslot = new uint256[](feedLen);
uint256[] memory returnRevenueMode = new uint256[](feedLen);
uint256[] memory returnCost = new uint256[](feedLen);
for (uint i = 0; i < feedIDs.length; i++) {
returnNames[i] = feedList[feedIDs[i]].feedName;
returnDecimals[i] = feedList[feedIDs[i]].feedDecimals;
returnTimeslot[i] = feedList[feedIDs[i]].feedTimeslot;
returnRevenueMode[i] = feedList[feedIDs[i]].revenueMode;
returnCost[i] = feedList[feedIDs[i]].feedCost;
}
return (returnNames, returnDecimals, returnTimeslot, returnRevenueMode, returnCost);
}
//---------------------------oracle management functions ---------------------------
// function to withdraw funds
function withdrawFunds() external {
if (payoutAddress == address(0)) {
for (uint n = 0; n < signers.length; n++){
payable(signers[n]).transfer(address(this).balance/signers.length);
}
} else {
payoutAddress.transfer(address(this).balance);
}
}
function createNewFeeds(string[] memory names, string[] memory descriptions, uint256[] memory decimals, uint256[] memory timeslots, uint256[] memory feedCosts, uint256[] memory revenueModes) onlySigner external {
require(names.length == descriptions.length, "Length mismatch");
require(descriptions.length == decimals.length, "Length mismatch");
require(decimals.length == timeslots.length, "Length mismatch");
require(timeslots.length == feedCosts.length, "Length mismatch");
require(feedCosts.length == revenueModes.length, "Length mismatch");
for(uint i = 0; i < names.length; i++) {
require(decimals[i] <= 18, "Decimal places too high");
require(timeslots[i] > 0, "Timeslot cannot be 0");
require(revenueModes[i] <= 1, "Wrong revenueMode parameter");
feedList.push(oracleStruct({
feedName: names[i],
feedDecimals: decimals[i],
feedTimeslot: timeslots[i],
latestPrice: 0,
latestPriceUpdate: 0,
revenueMode: revenueModes[i],
feedCost: feedCosts[i]
}));
emit feedAdded(names[i], descriptions[i], decimals[i], timeslots[i], feedList.length - 1, revenueModes[i], feedCosts[i]);
}
}
/**
* @dev submitFeed function lets a signer submit as many feeds as they want to
*
* @param values the array of values
* @param feedIDs the array of feedIds
*/
function submitFeed(uint256[] memory feedIDs, uint256[] memory values) onlySigner external {
require(values.length == feedIDs.length, "Value length and feedID length do not match");
// process feeds
for (uint i = 0; i < values.length; i++) {
// get current round number for feed
uint256 roundNumber = block.timestamp / feedList[feedIDs[i]].feedTimeslot;
// check if the signer already pushed an update for the given period
if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender].timestamp != 0) {
delete feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender];
}
// feed - number and push value
feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][msg.sender] = feedRoundStruct({
value: values[i],
timestamp: block.timestamp
});
emit feedSigned(feedIDs[i], roundNumber, values[i], block.timestamp, msg.sender);
// check if threshold was met
uint256 signedFeedsLen;
uint256[] memory prices = new uint256[](signers.length);
uint256 k;
for (uint j = 0; j < signers.length; j++) {
if (feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].timestamp != 0) {
signedFeedsLen++;
prices[k++] = feedRoundNumberToStructMapping[feedIDs[i]][roundNumber][signers[j]].value;
}
}
// Change the list size of the array in place
assembly {
mstore(prices, k)
}
// if threshold is met process price
if (signedFeedsLen >= signerThreshold) {
uint[] memory sorted = sort(prices);
uint returnPrice;
// uneven so we can take the middle
if (sorted.length % 2 == 1) {
uint sizer = (sorted.length + 1) / 2;
returnPrice = sorted[sizer-1];
// take average of the 2 most inner numbers
} else {
uint size1 = (sorted.length) / 2;
returnPrice = (sorted[size1-1]+sorted[size1])/2;
}
// process the struct for storing
if (block.timestamp / feedList[feedIDs[i]].feedTimeslot > feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot) {
historicalFeeds[feedIDs[i]][feedList[feedIDs[i]].latestPriceUpdate / feedList[feedIDs[i]].feedTimeslot] = feedList[feedIDs[i]].latestPrice;
}
feedList[feedIDs[i]].latestPriceUpdate = block.timestamp;
feedList[feedIDs[i]].latestPrice = returnPrice;
}
}
}
function signProposal(uint256 proposalId) onlySigner external {
require(proposalList[proposalId].proposalActive != 0, "Proposal not active");
hasSignedProposal[proposalId][msg.sender] = true;
emit proposalSigned(proposalId, msg.sender);
uint256 signedProposalLen;
for(uint i = 0; i < signers.length; i++) {
if (hasSignedProposal[proposalId][signers[i]]) {
signedProposalLen++;
}
}
// execute proposal
if (signedProposalLen >= signerThreshold) {
if (proposalList[proposalId].proposalType == 0) {
updatePricePass(proposalList[proposalId].uintValue);
} else if (proposalList[proposalId].proposalType == 1) {
updateThreshold(proposalList[proposalId].uintValue);
} else if (proposalList[proposalId].proposalType == 2) {
addSigners(proposalList[proposalId].addressValue);
} else if (proposalList[proposalId].proposalType == 3) {
removeSigner(proposalList[proposalId].addressValue);
} else if (proposalList[proposalId].proposalType == 4) {
updatePayoutAddress(proposalList[proposalId].addressValue);
} else if (proposalList[proposalId].proposalType == 5) {
updateRevenueMode(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
} else {
updateFeedCost(proposalList[proposalId].uintValue, proposalList[proposalId].proposalFeedId);
}
// lock proposal
proposalList[proposalId].proposalActive = 0;
}
}
function createProposal(uint256 uintValue, address addressValue, uint256 proposalType, uint256 feedId) onlySigner external {
uint256 proposalArrayLen = proposalList.length;
// fee or threshold
if (proposalType == 0 || proposalType == 1 || proposalType == 7) {
proposalList.push(proposalStruct({
uintValue: uintValue,
addressValue: address(0),
proposer: msg.sender,
proposalType: proposalType,
proposalFeedId: 0,
proposalActive: 1
}));
} else if (proposalType == 5 || proposalType == 6) {
proposalList.push(proposalStruct({
uintValue: uintValue,
addressValue: address(0),
proposer: msg.sender,
proposalType: proposalType,
proposalFeedId : feedId,
proposalActive: 1
}));
} else {
proposalList.push(proposalStruct({
uintValue: 0,
addressValue: addressValue,
proposer: msg.sender,
proposalType: proposalType,
proposalFeedId : 0,
proposalActive: 1
}));
}
hasSignedProposal[proposalArrayLen][msg.sender] = true;
emit newProposal(proposalArrayLen, uintValue, addressValue, proposalType, msg.sender);
emit proposalSigned(proposalArrayLen, msg.sender);
}
function updatePricePass(uint256 newPricePass) private {
subscriptionPassPrice = newPricePass;
emit subscriptionPassPriceUpdated(newPricePass);
}
function updateRevenueMode(uint256 newRevenueModeValue, uint256 feedId ) private {
require(newRevenueModeValue <= 1, "Invalid argument for revenue Mode");
feedList[feedId].revenueMode = newRevenueModeValue;
emit newRevenueMode(newRevenueModeValue, feedId);
}
function updateFeedCost(uint256 feedCost, uint256 feedId) private {
require(feedCost > 0, "Feed price cant be 0");
feedList[feedId].feedCost = feedCost;
emit newFeedCost(feedCost, feedId);
}
function updateThreshold(uint256 newThresholdValue) private {
require(newThresholdValue != 0, "Threshold cant be 0");
require(newThresholdValue <= signerLength, "Threshold cant be bigger then length of signers");
signerThreshold = newThresholdValue;
emit newThreshold(newThresholdValue);
}
function addSigners(address newSignerValue) private {
// check for duplicate signer
for (uint i=0; i < signers.length; i++) {
if (signers[i] == newSignerValue) {
revert("Signer already exists");
}
}
signers.push(newSignerValue);
signerLength++;
isSigner[newSignerValue] = true;
emit newSigner(newSignerValue);
}
function updatePayoutAddress(address newPayoutAddressValue) private {
payoutAddress = payable(newPayoutAddressValue);
emit newPayoutAddress(newPayoutAddressValue);
}
function removeSigner(address toRemove) internal {
require(isSigner[toRemove], "Address to remove has to be a signer");
require(signers.length -1 >= signerThreshold, "Less signers than threshold");
for (uint i = 0; i < signers.length; i++) {
if (signers[i] == toRemove) {
delete signers[i];
signerLength --;
isSigner[toRemove] = false;
emit signerRemoved(toRemove);
}
}
}
//---------------------------subscription functions---------------------------
function subscribeToFeed(uint256[] memory feedIDs, uint256[] memory durations, address buyer) payable external {
require(feedIDs.length == durations.length, "Length mismatch");
uint256 total;
for (uint i = 0; i < feedIDs.length; i++) {
require(feedList[feedIDs[i]].revenueMode == 1, "Donation mode turned on");
require(durations[i] >= 3600, "Minimum subscription is 1h");
if (subscribedTo[buyer][feedIDs[i]] <=block.timestamp) {
subscribedTo[buyer][feedIDs[i]] = block.timestamp.add(durations[i]);
} else {
subscribedTo[buyer][feedIDs[i]] = subscribedTo[buyer][feedIDs[i]].add(durations[i]);
}
total += feedList[feedIDs[i]].feedCost * durations[i] / 3600;
}
// check if enough payment was sent
require(msg.value >= total, "Not enough funds sent to cover oracle fees");
// send feeds to router
address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
emit routerFeeTaken(msg.value/50, msg.sender);
}
function buyPass(address buyer, uint256 duration) payable external {
require(subscriptionPassPrice != 0, "Subscription Pass turned off");
require(duration >= 3600, "Minimum subscription is 1h");
require(msg.value >= subscriptionPassPrice * duration / 86400, "Not enough payment");
if (hasPass[buyer] <=block.timestamp) {
hasPass[buyer] = block.timestamp.add(duration);
} else {
hasPass[buyer] = hasPass[buyer].add(duration);
}
address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
IConjureRouter(conjureRouter).deposit{value:msg.value/50}();
emit routerFeeTaken(msg.value/50, msg.sender);
}
function supportFeeds(uint256[] memory feedIds, uint256[] memory values) payable external {
require(feedIds.length == values.length, "Length mismatch");
uint256 total;
for (uint i = 0; i < feedIds.length; i++) {
require(feedList[feedIds[i]].revenueMode == 0, "Subscription mode turned on");
feedSupport[feedIds[i]] = feedSupport[feedIds[i]].add(values[i]);
total += values[i];
emit feedSupported(feedIds[i], values[i]);
}
require(msg.value >= total, "Msg.value does not meet support values");
address payable conjureRouter = IConjureFactory(factoryContract).getConjureRouter();
IConjureRouter(conjureRouter).deposit{value:total/100}();
emit routerFeeTaken(total/100, msg.sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
/// @author Conjure Finance Team
/// @title IConjureFactory
/// @notice Interface for interacting with the ConjureFactory Contract
interface IConjureFactory {
/**
* @dev gets the current conjure router
*
* @return the current conjure router
*/
function getConjureRouter() external returns (address payable);
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
/// @author Conjure Finance Team
/// @title IConjureRouter
/// @notice Interface for interacting with the ConjureRouter Contract
interface IConjureRouter {
/**
* @dev calls the deposit function
*/
function deposit() external payable;
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"signerThreshold","type":"uint256"},{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"contractSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint256","name":"decimal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeslot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"feedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"feedSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supportvalue","type":"uint256"}],"name":"feedSupported","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newFeedCost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payout","type":"address"}],"name":"newPayoutAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uintValue","type":"uint256"},{"indexed":false,"internalType":"address","name":"addressValue","type":"address"},{"indexed":false,"internalType":"uint256","name":"oracleType","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"}],"name":"newProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feed","type":"uint256"}],"name":"newRevenueMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"newSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"newThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"proposalSigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"routerFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"signerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPass","type":"uint256"}],"name":"subscriptionPassPriceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"buyPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"descriptions","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"timeslots","type":"uint256[]"},{"internalType":"uint256[]","name":"feedCosts","type":"uint256[]"},{"internalType":"uint256[]","name":"revenueModes","type":"uint256[]"}],"name":"createNewFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"feedId","type":"uint256"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factoryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedSupport","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feedID","type":"uint256"}],"name":"getFeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeedLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeedList","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"}],"name":"getFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"getHistoricalFeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers_","type":"address[]"},{"internalType":"uint256","name":"signerThreshold_","type":"uint256"},{"internalType":"address payable","name":"payoutAddress_","type":"address"},{"internalType":"uint256","name":"subscriptionPassPrice_","type":"uint256"},{"internalType":"address","name":"factoryContract_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalList","outputs":[{"internalType":"uint256","name":"uintValue","type":"uint256"},{"internalType":"address","name":"addressValue","type":"address"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"uint256","name":"proposalFeedId","type":"uint256"},{"internalType":"uint256","name":"proposalActive","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"signProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"submitFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"durations","type":"uint256[]"},{"internalType":"address","name":"buyer","type":"address"}],"name":"subscribeToFeed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"subscriptionPassPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"supportFeeds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615d1d80620000216000396000f3fe6080604052600436106101355760003560e01c80638c604296116100ab578063c37219ba1161006f578063c37219ba146103eb578063c4c1d0bf14610414578063c6311e3f1461043f578063d69d117c14610481578063de11c94a146104c2578063ecb76d90146104ed57610135565b80638c604296146103135780638e486eec1461032f5780639da6553b1461035a578063a4a4f39014610397578063ab273016146103c257610135565b80634a45ea5c116100fd5780634a45ea5c1461020b5780635b8d02d71461024a57806368238181146102755780637f5090041461029157806384f3c585146102ba578063882fd782146102f757610135565b80630f3c80b21461013a5780632079fb9a1461016357806324600fc3146101a057806330c942e0146101b7578063442a33df146101e2575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061459b565b61052c565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061486f565b61091b565b604051610197919061532c565b60405180910390f35b3480156101ac57600080fd5b506101b561095a565b005b3480156101c357600080fd5b506101cc610acc565b6040516101d99190615861565b60405180910390f35b3480156101ee57600080fd5b506102096004803603810190610204919061462a565b610ad2565b005b34801561021757600080fd5b50610232600480360381019061022d9190614743565b610f2b565b60405161024193929190615438565b60405180910390f35b34801561025657600080fd5b5061025f6110a9565b60405161026c9190615347565b60405180910390f35b61028f600480360381019061028a91906147f0565b6110cf565b005b34801561029d57600080fd5b506102b860048036038101906102b39190614784565b6115de565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190614784565b611d4a565b6040516102ee9190615416565b60405180910390f35b610311600480360381019061030c9190614784565b6120c7565b005b61032d6004803603810190610328919061455f565b612427565b005b34801561033b57600080fd5b50610344612794565b6040516103519190615861565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061486f565b61279a565b60405161038e9190615861565b60405180910390f35b3480156103a357600080fd5b506103ac6127b2565b6040516103b99190615861565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e4919061486f565b6127b8565b005b3480156103f757600080fd5b50610412600480360381019061040d9190614898565b612c79565b005b34801561042057600080fd5b5061042961316e565b6040516104369190615861565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061486f565b61317b565b604051610478969594939291906158a5565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614743565b613207565b6040516104b99594939291906153a0565b60405180910390f35b3480156104ce57600080fd5b506104d76135d2565b6040516104e4919061532c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061486f565b6135f6565b60405161052393929190615982565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906156e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610622906155a1565b60405180910390fd5b600084141561066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066690615581565b60405180910390fd5b84518411156106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90615621565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836004819055508460039080519060200190610710929190614192565b5060005b60038054905081101561086457600073ffffffffffffffffffffffffffffffffffffffff166003828154811061074657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90615701565b60405180910390fd5b600160066000600384815481106107db57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610714565b50845160028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b819055507ff4955da0e7ea6f8c9297d8046c39168f24abc71dd60d47c7e4e2172f28f0c93385600454600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161090c93929190615362565b60405180910390a15050505050565b6003818154811061092b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a605760005b600380549050811015610a5a57600381815481106109ce57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003805490504781610a2057fe5b049081150290604051600060405180830381858888f19350505050158015610a4c573d6000803e3d6000fd5b5080806001019150506109b4565b50610aca565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ac8573d6000803e3d6000fd5b505b565b60025481565b610ada613847565b8451865114610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906157c1565b60405180910390fd5b8351855114610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b59906157c1565b60405180910390fd5b8251845114610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906157c1565b60405180910390fd5b8151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906157c1565b60405180910390fd5b8051825114610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906157c1565b60405180910390fd5b60005b8651811015610f22576012858281518110610c4857fe5b60200260200101511115610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906157a1565b60405180910390fd5b6000848281518110610c9f57fe5b602002602001015111610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90615721565b60405180910390fd5b6001828281518110610cf557fe5b60200260200101511115610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906156c1565b60405180910390fd5b600a6040518060e00160405280898481518110610d5757fe5b60200260200101518152602001878481518110610d7057fe5b60200260200101518152602001868481518110610d8957fe5b602002602001015181526020016000815260200160008152602001848481518110610db057fe5b60200260200101518152602001858481518110610dc957fe5b602002602001015181525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000019080519060200190610e1992919061421c565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550507f7987e4b97b6de28ab6f19d4724c233a6f4fe564ba5413dc5d74b4c2c7841651a878281518110610e8557fe5b6020026020010151878381518110610e9957fe5b6020026020010151878481518110610ead57fe5b6020026020010151878581518110610ec157fe5b60200260200101516001600a8054905003878781518110610ede57fe5b6020026020010151898881518110610ef257fe5b6020026020010151604051610f0d9796959493929190615484565b60405180910390a18080600101915050610c31565b50505050505050565b606080606060008451905060008167ffffffffffffffff81118015610f4f57600080fd5b50604051908082528060200260200182016040528015610f7e5781602001602082028036833780820191505090505b50905060008267ffffffffffffffff81118015610f9a57600080fd5b50604051908082528060200260200182016040528015610fc95781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81118015610fe557600080fd5b506040519080825280602002602001820160405280156110145781602001602082028036833780820191505090505b50905060005b88518110156110945761103f89828151811061103257fe5b60200260200101516135f6565b86848151811061104b57fe5b6020026020010186858151811061105e57fe5b6020026020010186868151811061107157fe5b60200260200101838152508381525083815250505050808060010191505061101a565b50828282965096509650505050509193909250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8151835114611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906157c1565b60405180910390fd5b600080600090505b8451811015611440576001600a86838151811061113457fe5b60200260200101518154811061114657fe5b90600052602060002090600702016005015414611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90615501565b60405180910390fd5b610e108482815181106111a757fe5b602002602001015110156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790615541565b60405180910390fd5b42600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061123e57fe5b6020026020010151815260200190815260200160002054116112ec5761128084828151811061126957fe5b6020026020010151426138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106112cd57fe5b60200260200101518152602001908152602001600020819055506113dd565b6113758482815181106112fb57fe5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088858151811061135057fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106113c257fe5b60200260200101518152602001908152602001600020819055505b610e108482815181106113ec57fe5b6020026020010151600a87848151811061140257fe5b60200260200101518154811061141457fe5b906000526020600020906007020160060154028161142e57fe5b0482019150808060010191505061111b565b5080341015611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90615641565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161154f57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157b57600080fd5b505af115801561158f573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc42603234816115bf57fe5b04336040516115cf92919061587c565b60405180910390a15050505050565b6115e6613847565b815181511461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190615561565b60405180910390fd5b60005b8151811015611d45576000600a84838151811061164657fe5b60200260200101518154811061165857fe5b906000526020600020906007020160020154428161167257fe5b04905060006007600086858151811061168757fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461177c576007600085848151811061170457fe5b60200260200101518152602001908152602001600020600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b604051806040016040528084848151811061179357fe5b6020026020010151815260200142815250600760008685815181106117b457fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fba4832b2bf8c9586edd5026f5bf3a5b8a69b0b29dea651d15bfda0cddf0e954884838151811061185c57fe5b60200260200101518285858151811061187157fe5b6020026020010151423360405161188c9594939291906159b9565b60405180910390a160008060038054905067ffffffffffffffff811180156118b357600080fd5b506040519080825280602002602001820160405280156118e25781602001602082028036833780820191505090505b509050600080600090505b600380549050811015611a93576000600760008a898151811061190c57fe5b60200260200101518152602001908152602001600020600087815260200190815260200160002060006003848154811061194257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414611a86578380600101945050600760008988815181106119c857fe5b6020026020010151815260200190815260200160002060008681526020019081526020016000206000600383815481106119fe57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838380600101945081518110611a7957fe5b6020026020010181815250505b80806001019150506118ed565b508082526004548310611d34576000611aab8361395d565b9050600060016002835181611abc57fe5b061415611af55760006002600184510181611ad357fe5b049050826001820381518110611ae557fe5b6020026020010151915050611b3f565b60006002835181611b0257fe5b0490506002838281518110611b1357fe5b6020026020010151846001840381518110611b2a57fe5b60200260200101510181611b3a57fe5b049150505b600a898881518110611b4d57fe5b602002602001015181548110611b5f57fe5b906000526020600020906007020160020154600a8a8981518110611b7f57fe5b602002602001015181548110611b9157fe5b90600052602060002090600702016004015481611baa57fe5b04600a8a8981518110611bb957fe5b602002602001015181548110611bcb57fe5b9060005260206000209060070201600201544281611be557fe5b041115611cc557600a898881518110611bfa57fe5b602002602001015181548110611c0c57fe5b906000526020600020906007020160030154600560008b8a81518110611c2e57fe5b602002602001015181526020019081526020016000206000600a8c8b81518110611c5457fe5b602002602001015181548110611c6657fe5b906000526020600020906007020160020154600a8d8c81518110611c8657fe5b602002602001015181548110611c9857fe5b90600052602060002090600702016004015481611cb157fe5b048152602001908152602001600020819055505b42600a8a8981518110611cd457fe5b602002602001015181548110611ce657fe5b90600052602060002090600702016004018190555080600a8a8981518110611d0a57fe5b602002602001015181548110611d1c57fe5b90600052602060002090600702016003018190555050505b50505050808060010191505061162d565b505050565b606060008351905060008167ffffffffffffffff81118015611d6b57600080fd5b50604051908082528060200260200182016040528015611d9a5781602001602082028036833780820191505090505b5090508351855114611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890615801565b60405180910390fd5b60005b85518110156120bb576000600b541115611f275742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f22576001600a878381518110611e4e57fe5b602002602001015181548110611e6057fe5b906000526020600020906007020160050154148015611ee1575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611ec857fe5b6020026020010151815260200190815260200160002054105b15611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890615681565b60405180910390fd5b5b61200b565b6001600a878381518110611f3757fe5b602002602001015181548110611f4957fe5b906000526020600020906007020160050154148015611fca575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611fb157fe5b6020026020010151815260200190815260200160002054105b1561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190615681565b60405180910390fd5b5b6000600a87838151811061201b57fe5b60200260200101518154811061202d57fe5b90600052602060002090600702016002015486838151811061204b57fe5b60200260200101518161205a57fe5b0490506005600088848151811061206d57fe5b602002602001015181526020019081526020016000206000828152602001908152602001600020548383815181106120a157fe5b602002602001018181525050508080600101915050611de4565b50809250505092915050565b805182511461210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906157c1565b60405180910390fd5b600080600090505b835181101561228a576000600a85838151811061212c57fe5b60200260200101518154811061213e57fe5b90600052602060002090600702016005015414612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790615521565b60405180910390fd5b6121dc83828151811061219f57fe5b6020026020010151600860008785815181106121b757fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600860008684815181106121ec57fe5b602002602001015181526020019081526020016000208190555082818151811061221257fe5b6020026020010151820191507f3444f0007ac07416465c167c0d7657d48e9d410b498f8849035fc9cf9523976d84828151811061224b57fe5b602002602001015184838151811061225f57fe5b6020026020010151604051612275929190615906565b60405180910390a18080600101915050612113565b50803410156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590615661565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561233957600080fd5b505af115801561234d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06064848161239957fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426064838161240957fe5b043360405161241992919061587c565b60405180910390a150505050565b6000600b54141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615821565b60405180910390fd5b610e108110156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a990615541565b60405180910390fd5b6201518081600b5402816124c257fe5b04341015612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906157e1565b60405180910390fd5b42600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116125a65761255e81426138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263c565b6125f881600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126df9190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161270757fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426032348161277757fe5b043360405161278792919061587c565b60405180910390a1505050565b600b5481565b60086020528060005260406000206000915090505481565b60045481565b6127c0613847565b6000600d82815481106127cf57fe5b9060005260206000209060060201600501541415612822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612819906155e1565b60405180910390fd5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d6781336040516128bc92919061587c565b60405180910390a1600080600090505b60038054905081101561298957600e60008481526020019081526020016000206000600383815481106128fb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297c5781806001019250505b80806001019150506128cc565b506004548110612c75576000600d83815481106129a257fe5b90600052602060002090600602016003015414156129e6576129e1600d83815481106129ca57fe5b906000526020600020906006020160000154613977565b612c50565b6001600d83815481106129f557fe5b9060005260206000209060060201600301541415612a3957612a34600d8381548110612a1d57fe5b9060005260206000209060060201600001546139b8565b612c4f565b6002600d8381548110612a4857fe5b9060005260206000209060060201600301541415612aac57612aa7600d8381548110612a7057fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a82565b612c4e565b6003600d8381548110612abb57fe5b9060005260206000209060060201600301541415612b1f57612b1a600d8381548110612ae357fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613c4d565b612c4d565b6004600d8381548110612b2e57fe5b9060005260206000209060060201600301541415612b9257612b8d600d8381548110612b5657fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613e8f565b612c4c565b6005600d8381548110612ba157fe5b9060005260206000209060060201600301541415612c0457612bff600d8381548110612bc957fe5b906000526020600020906006020160000154600d8481548110612be857fe5b906000526020600020906006020160040154613f0a565b612c4b565b612c4a600d8381548110612c1457fe5b906000526020600020906006020160000154600d8481548110612c3357fe5b906000526020600020906006020160040154613fae565b5b5b5b5b5b5b6000600d8381548110612c5f57fe5b9060005260206000209060060201600501819055505b5050565b612c81613847565b6000600d8054905090506000831480612c9a5750600183145b80612ca55750600783145b15612dee57600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613086565b6005831480612dfd5750600683145b15612f4557600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613085565b600d6040518060c00160405280600081526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015550505b5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa7105ed77601732b2ee4362ad1a2ca325d1983be801d553d907e0aa29dcdb79a818686863360405161312695949392919061592f565b60405180910390a17f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d67813360405161315f92919061587c565b60405180910390a15050505050565b6000600a80549050905090565b600d818154811061318b57600080fd5b90600052602060002090600602016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154905086565b606080606080606060008651905060008167ffffffffffffffff8111801561322e57600080fd5b5060405190808252806020026020018201604052801561326257816020015b606081526020019060019003908161324d5790505b50905060008267ffffffffffffffff8111801561327e57600080fd5b506040519080825280602002602001820160405280156132ad5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff811180156132c957600080fd5b506040519080825280602002602001820160405280156132f85781602001602082028036833780820191505090505b50905060008467ffffffffffffffff8111801561331457600080fd5b506040519080825280602002602001820160405280156133435781602001602082028036833780820191505090505b50905060008567ffffffffffffffff8111801561335f57600080fd5b5060405190808252806020026020018201604052801561338e5781602001602082028036833780820191505090505b50905060005b8c518110156135b357600a8d82815181106133ab57fe5b6020026020010151815481106133bd57fe5b90600052602060002090600702016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b505050505086828151811061347357fe5b6020026020010181905250600a8d828151811061348c57fe5b60200260200101518154811061349e57fe5b9060005260206000209060070201600101548582815181106134bc57fe5b602002602001018181525050600a8d82815181106134d657fe5b6020026020010151815481106134e857fe5b90600052602060002090600702016002015484828151811061350657fe5b602002602001018181525050600a8d828151811061352057fe5b60200260200101518154811061353257fe5b90600052602060002090600702016005015483828151811061355057fe5b602002602001018181525050600a8d828151811061356a57fe5b60200260200101518154811061357c57fe5b90600052602060002090600702016006015482828151811061359a57fe5b6020026020010181815250508080600101915050613394565b5084848484849a509a509a509a509a5050505050505091939590929450565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000600b5411156137135742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161370e576001600a888154811061365f57fe5b9060005260206000209060070201600501541480156136cd575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b1561370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370490615681565b60405180910390fd5b5b6137d1565b6001600a888154811061372257fe5b906000526020600020906007020160050154148015613790575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b156137d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c790615681565b60405180910390fd5b5b600a87815481106137de57fe5b9060005260206000209060070201600301549250600a87815481106137ff57fe5b9060005260206000209060070201600401549150600a878154811061382057fe5b90600052602060002090600702016001015490508282829550955095505050509193909250565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca906155c1565b60405180910390fd5b565b600080828401905083811015613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b606061396f8260006001855103614051565b819050919050565b80600b819055507f35a14b8b09dda49419beccb57b8ab7a2333bfeb9634690a2fdd9e62ca2b73dea816040516139ad9190615861565b60405180910390a150565b60008114156139fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f390615581565b60405180910390fd5b600254811115613a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3890615741565b60405180910390fd5b806004819055507fd88532aad776d079efe3ac298f9e21dc4ef893e240d8c13107298e7c4f6eb8b881604051613a779190615861565b60405180910390a150565b60005b600380549050811015613b45578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613ab657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f90615761565b60405180910390fd5b8080600101915050613a85565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600081548092919060010191905055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3dc2a8437aef0e8d2839b5e75d0d93e6c7f43b3acf5d2ef2db79beb54cb47b3d81604051613c42919061532c565b60405180910390a150565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd090615841565b60405180910390fd5b6004546001600380549050031015613d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1d906156a1565b60405180910390fd5b60005b600380549050811015613e8b578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613d5a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613e7e5760038181548110613dae57fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260008154809291906001900391905055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffa15964370ccf7acface74df78a85aa4857e703226c446d3e24a69663dc302e782604051613e75919061532c565b60405180910390a15b8080600101915050613d29565b5050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4bc0293774d2baff337ab66d049d9fb89b31c492a1c82fd1b53d43ac85e8da5181604051613eff919061532c565b60405180910390a150565b6001821115613f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4590615781565b60405180910390fd5b81600a8281548110613f5c57fe5b9060005260206000209060070201600501819055507fe7fdf61d93ca682755140eb73628f48cfc090ca0f669e547790b227980e1a22c8282604051613fa2929190615906565b60405180910390a15050565b60008211613ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe890615601565b60405180910390fd5b81600a8281548110613fff57fe5b9060005260206000209060070201600601819055507f66317a45088a6e6e10f3831e0347d9fbaa68b04f54503eaf4e8683512a69077a8282604051614045929190615906565b60405180910390a15050565b600082905060008290508082141561406a57505061418d565b60008560028686038161407957fe5b0586018151811061408657fe5b602002602001015190505b818313614161575b808684815181106140a657fe5b602002602001015110156140c1578280600101935050614099565b5b8582815181106140ce57fe5b60200260200101518110156140eb578180600190039250506140c2565b81831361415c578582815181106140fe57fe5b602002602001015186848151811061411257fe5b602002602001015187858151811061412657fe5b6020026020010188858151811061413957fe5b602002602001018281525082815250505082806001019350508180600190039250505b614091565b8185121561417557614174868684614051565b5b8383121561418957614188868486614051565b5b5050505b505050565b82805482825590600052602060002090810192821561420b579160200282015b8281111561420a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906141b2565b5b50905061421891906142aa565b5090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826142525760008555614299565b82601f1061426b57805160ff1916838001178555614299565b82800160010185558215614299579182015b8281111561429857825182559160200191906001019061427d565b5b5090506142a691906142aa565b5090565b5b808211156142c35760008160009055506001016142ab565b5090565b60006142da6142d584615a3d565b615a0c565b905080838252602082019050828560208602820111156142f957600080fd5b60005b85811015614329578161430f888261443a565b8452602084019350602083019250506001810190506142fc565b5050509392505050565b600061434661434184615a69565b615a0c565b9050808382526020820190508260005b85811015614386578135850161436c88826144f7565b845260208401935060208301925050600181019050614356565b5050509392505050565b60006143a361439e84615a95565b615a0c565b905080838252602082019050828560208602820111156143c257600080fd5b60005b858110156143f257816143d88882614521565b8452602084019350602083019250506001810190506143c5565b5050509392505050565b600061440f61440a84615ac1565b615a0c565b90508281526020810184848401111561442757600080fd5b614432848285615c4d565b509392505050565b60008135905061444981615ca2565b92915050565b60008135905061445e81615cb9565b92915050565b60008151905061447381615cb9565b92915050565b600082601f83011261448a57600080fd5b813561449a8482602086016142c7565b91505092915050565b600082601f8301126144b457600080fd5b81356144c4848260208601614333565b91505092915050565b600082601f8301126144de57600080fd5b81356144ee848260208601614390565b91505092915050565b600082601f83011261450857600080fd5b81356145188482602086016143fc565b91505092915050565b60008135905061453081615cd0565b92915050565b60006020828403121561454857600080fd5b600061455684828501614464565b91505092915050565b6000806040838503121561457257600080fd5b60006145808582860161443a565b925050602061459185828601614521565b9150509250929050565b600080600080600060a086880312156145b357600080fd5b600086013567ffffffffffffffff8111156145cd57600080fd5b6145d988828901614479565b95505060206145ea88828901614521565b94505060406145fb8882890161444f565b935050606061460c88828901614521565b925050608061461d8882890161443a565b9150509295509295909350565b60008060008060008060c0878903121561464357600080fd5b600087013567ffffffffffffffff81111561465d57600080fd5b61466989828a016144a3565b965050602087013567ffffffffffffffff81111561468657600080fd5b61469289828a016144a3565b955050604087013567ffffffffffffffff8111156146af57600080fd5b6146bb89828a016144cd565b945050606087013567ffffffffffffffff8111156146d857600080fd5b6146e489828a016144cd565b935050608087013567ffffffffffffffff81111561470157600080fd5b61470d89828a016144cd565b92505060a087013567ffffffffffffffff81111561472a57600080fd5b61473689828a016144cd565b9150509295509295509295565b60006020828403121561475557600080fd5b600082013567ffffffffffffffff81111561476f57600080fd5b61477b848285016144cd565b91505092915050565b6000806040838503121561479757600080fd5b600083013567ffffffffffffffff8111156147b157600080fd5b6147bd858286016144cd565b925050602083013567ffffffffffffffff8111156147da57600080fd5b6147e6858286016144cd565b9150509250929050565b60008060006060848603121561480557600080fd5b600084013567ffffffffffffffff81111561481f57600080fd5b61482b868287016144cd565b935050602084013567ffffffffffffffff81111561484857600080fd5b614854868287016144cd565b92505060406148658682870161443a565b9150509250925092565b60006020828403121561488157600080fd5b600061488f84828501614521565b91505092915050565b600080600080608085870312156148ae57600080fd5b60006148bc87828801614521565b94505060206148cd8782880161443a565b93505060406148de87828801614521565b92505060606148ef87828801614521565b91505092959194509250565b6000614907838361495d565b60208301905092915050565b600061491f8383614aac565b905092915050565b6000614933838361530e565b60208301905092915050565b61494881615c17565b82525050565b61495781615bdb565b82525050565b61496681615bc9565b82525050565b61497581615bc9565b82525050565b600061498682615b21565b6149908185615b74565b935061499b83615af1565b8060005b838110156149cc5781516149b388826148fb565b97506149be83615b4d565b92505060018101905061499f565b5085935050505092915050565b60006149e482615b2c565b6149ee8185615b85565b935083602082028501614a0085615b01565b8060005b85811015614a3c5784840389528151614a1d8582614913565b9450614a2883615b5a565b925060208a01995050600181019050614a04565b50829750879550505050505092915050565b6000614a5982615b37565b614a638185615b96565b9350614a6e83615b11565b8060005b83811015614a9f578151614a868882614927565b9750614a9183615b67565b925050600181019050614a72565b5085935050505092915050565b6000614ab782615b42565b614ac18185615ba7565b9350614ad1818560208601615c5c565b614ada81615c91565b840191505092915050565b6000614af082615b42565b614afa8185615bb8565b9350614b0a818560208601615c5c565b614b1381615c91565b840191505092915050565b6000614b2b601783615bb8565b91507f446f6e6174696f6e206d6f6465207475726e6564206f6e0000000000000000006000830152602082019050919050565b6000614b6b601b83615bb8565b91507f537562736372697074696f6e206d6f6465207475726e6564206f6e00000000006000830152602082019050919050565b6000614bab601a83615bb8565b91507f4d696e696d756d20737562736372697074696f6e2069732031680000000000006000830152602082019050919050565b6000614beb602b83615bb8565b91507f56616c7565206c656e67746820616e6420666565644944206c656e677468206460008301527f6f206e6f74206d617463680000000000000000000000000000000000000000006020830152604082019050919050565b6000614c51601383615bb8565b91507f5468726573686f6c642063616e742062652030000000000000000000000000006000830152602082019050919050565b6000614c91601783615bb8565b91507f666163746f72792063616e206e6f74206265206e756c6c0000000000000000006000830152602082019050919050565b6000614cd1602583615bb8565b91507f4f6e6c792061207369676e65722063616e20706572666f726d2074686973206160008301527f6374696f6e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d37601383615bb8565b91507f50726f706f73616c206e6f7420616374697665000000000000000000000000006000830152602082019050919050565b6000614d77601483615bb8565b91507f466565642070726963652063616e7420626520300000000000000000000000006000830152602082019050919050565b6000614db7602883615bb8565b91507f5468726573686f6c642063616e74206265206d6f7265207468656e207369676e60008301527f657220636f756e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1d602a83615bb8565b91507f4e6f7420656e6f7567682066756e64732073656e7420746f20636f766572206f60008301527f7261636c652066656573000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e83602683615bb8565b91507f4d73672e76616c756520646f6573206e6f74206d65657420737570706f72742060008301527f76616c75657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee9601783615bb8565b91507f4e6f20737562736372697074696f6e20746f20666565640000000000000000006000830152602082019050919050565b6000614f29601b83615bb8565b91507f4c657373207369676e657273207468616e207468726573686f6c6400000000006000830152602082019050919050565b6000614f69601b83615bb8565b91507f57726f6e6720726576656e75654d6f646520706172616d6574657200000000006000830152602082019050919050565b6000614fa9601383615bb8565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b6000614fe9601083615bb8565b91507f4e6f74207a65726f2061646472657373000000000000000000000000000000006000830152602082019050919050565b6000615029601483615bb8565b91507f54696d65736c6f742063616e6e6f7420626520300000000000000000000000006000830152602082019050919050565b6000615069602f83615bb8565b91507f5468726573686f6c642063616e7420626520626967676572207468656e206c6560008301527f6e677468206f66207369676e65727300000000000000000000000000000000006020830152604082019050919050565b60006150cf601583615bb8565b91507f5369676e657220616c72656164792065786973747300000000000000000000006000830152602082019050919050565b600061510f602183615bb8565b91507f496e76616c696420617267756d656e7420666f7220726576656e7565204d6f6460008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615175601783615bb8565b91507f446563696d616c20706c6163657320746f6f20686967680000000000000000006000830152602082019050919050565b60006151b5600f83615bb8565b91507f4c656e677468206d69736d6174636800000000000000000000000000000000006000830152602082019050919050565b60006151f5601283615bb8565b91507f4e6f7420656e6f756768207061796d656e7400000000000000000000000000006000830152602082019050919050565b6000615235601f83615bb8565b91507f466565647320616e642054696d657374616d7073206d757374206d61746368006000830152602082019050919050565b6000615275601c83615bb8565b91507f537562736372697074696f6e2050617373207475726e6564206f6666000000006000830152602082019050919050565b60006152b5602483615bb8565b91507f4164647265737320746f2072656d6f76652068617320746f206265206120736960008301527f676e6572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61531781615c0d565b82525050565b61532681615c0d565b82525050565b6000602082019050615341600083018461496c565b92915050565b600060208201905061535c600083018461494e565b92915050565b6000606082019050818103600083015261537c818661497b565b905061538b602083018561531d565b615398604083018461493f565b949350505050565b600060a08201905081810360008301526153ba81886149d9565b905081810360208301526153ce8187614a4e565b905081810360408301526153e28186614a4e565b905081810360608301526153f68185614a4e565b9050818103608083015261540a8184614a4e565b90509695505050505050565b600060208201905081810360008301526154308184614a4e565b905092915050565b600060608201905081810360008301526154528186614a4e565b905081810360208301526154668185614a4e565b9050818103604083015261547a8184614a4e565b9050949350505050565b600060e082019050818103600083015261549e818a614ae5565b905081810360208301526154b28189614ae5565b90506154c1604083018861531d565b6154ce606083018761531d565b6154db608083018661531d565b6154e860a083018561531d565b6154f560c083018461531d565b98975050505050505050565b6000602082019050818103600083015261551a81614b1e565b9050919050565b6000602082019050818103600083015261553a81614b5e565b9050919050565b6000602082019050818103600083015261555a81614b9e565b9050919050565b6000602082019050818103600083015261557a81614bde565b9050919050565b6000602082019050818103600083015261559a81614c44565b9050919050565b600060208201905081810360008301526155ba81614c84565b9050919050565b600060208201905081810360008301526155da81614cc4565b9050919050565b600060208201905081810360008301526155fa81614d2a565b9050919050565b6000602082019050818103600083015261561a81614d6a565b9050919050565b6000602082019050818103600083015261563a81614daa565b9050919050565b6000602082019050818103600083015261565a81614e10565b9050919050565b6000602082019050818103600083015261567a81614e76565b9050919050565b6000602082019050818103600083015261569a81614edc565b9050919050565b600060208201905081810360008301526156ba81614f1c565b9050919050565b600060208201905081810360008301526156da81614f5c565b9050919050565b600060208201905081810360008301526156fa81614f9c565b9050919050565b6000602082019050818103600083015261571a81614fdc565b9050919050565b6000602082019050818103600083015261573a8161501c565b9050919050565b6000602082019050818103600083015261575a8161505c565b9050919050565b6000602082019050818103600083015261577a816150c2565b9050919050565b6000602082019050818103600083015261579a81615102565b9050919050565b600060208201905081810360008301526157ba81615168565b9050919050565b600060208201905081810360008301526157da816151a8565b9050919050565b600060208201905081810360008301526157fa816151e8565b9050919050565b6000602082019050818103600083015261581a81615228565b9050919050565b6000602082019050818103600083015261583a81615268565b9050919050565b6000602082019050818103600083015261585a816152a8565b9050919050565b6000602082019050615876600083018461531d565b92915050565b6000604082019050615891600083018561531d565b61589e602083018461493f565b9392505050565b600060c0820190506158ba600083018961531d565b6158c7602083018861496c565b6158d4604083018761496c565b6158e1606083018661531d565b6158ee608083018561531d565b6158fb60a083018461531d565b979650505050505050565b600060408201905061591b600083018561531d565b615928602083018461531d565b9392505050565b600060a082019050615944600083018861531d565b615951602083018761531d565b61595e604083018661496c565b61596b606083018561531d565b615978608083018461493f565b9695505050505050565b6000606082019050615997600083018661531d565b6159a4602083018561531d565b6159b1604083018461531d565b949350505050565b600060a0820190506159ce600083018861531d565b6159db602083018761531d565b6159e8604083018661531d565b6159f5606083018561531d565b615a02608083018461493f565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715615a3357615a32615c8f565b5b8060405250919050565b600067ffffffffffffffff821115615a5857615a57615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615a8457615a83615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615ab057615aaf615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615adc57615adb615c8f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615bd482615bed565b9050919050565b6000615be682615bed565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615c2282615c29565b9050919050565b6000615c3482615c3b565b9050919050565b6000615c4682615bed565b9050919050565b82818337600083830152505050565b60005b83811015615c7a578082015181840152602081019050615c5f565b83811115615c89576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615cab81615bc9565b8114615cb657600080fd5b50565b615cc281615bdb565b8114615ccd57600080fd5b50565b615cd981615c0d565b8114615ce457600080fd5b5056fea26469706673582212200473977c2ba1ae8d3232d8c2f6c7eed485875e7529cca20f654d811486b8422964736f6c63430007060033
Deployed Bytecode
0x6080604052600436106101355760003560e01c80638c604296116100ab578063c37219ba1161006f578063c37219ba146103eb578063c4c1d0bf14610414578063c6311e3f1461043f578063d69d117c14610481578063de11c94a146104c2578063ecb76d90146104ed57610135565b80638c604296146103135780638e486eec1461032f5780639da6553b1461035a578063a4a4f39014610397578063ab273016146103c257610135565b80634a45ea5c116100fd5780634a45ea5c1461020b5780635b8d02d71461024a57806368238181146102755780637f5090041461029157806384f3c585146102ba578063882fd782146102f757610135565b80630f3c80b21461013a5780632079fb9a1461016357806324600fc3146101a057806330c942e0146101b7578063442a33df146101e2575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c919061459b565b61052c565b005b34801561016f57600080fd5b5061018a6004803603810190610185919061486f565b61091b565b604051610197919061532c565b60405180910390f35b3480156101ac57600080fd5b506101b561095a565b005b3480156101c357600080fd5b506101cc610acc565b6040516101d99190615861565b60405180910390f35b3480156101ee57600080fd5b506102096004803603810190610204919061462a565b610ad2565b005b34801561021757600080fd5b50610232600480360381019061022d9190614743565b610f2b565b60405161024193929190615438565b60405180910390f35b34801561025657600080fd5b5061025f6110a9565b60405161026c9190615347565b60405180910390f35b61028f600480360381019061028a91906147f0565b6110cf565b005b34801561029d57600080fd5b506102b860048036038101906102b39190614784565b6115de565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190614784565b611d4a565b6040516102ee9190615416565b60405180910390f35b610311600480360381019061030c9190614784565b6120c7565b005b61032d6004803603810190610328919061455f565b612427565b005b34801561033b57600080fd5b50610344612794565b6040516103519190615861565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c919061486f565b61279a565b60405161038e9190615861565b60405180910390f35b3480156103a357600080fd5b506103ac6127b2565b6040516103b99190615861565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e4919061486f565b6127b8565b005b3480156103f757600080fd5b50610412600480360381019061040d9190614898565b612c79565b005b34801561042057600080fd5b5061042961316e565b6040516104369190615861565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061486f565b61317b565b604051610478969594939291906158a5565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190614743565b613207565b6040516104b99594939291906153a0565b60405180910390f35b3480156104ce57600080fd5b506104d76135d2565b6040516104e4919061532c565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f919061486f565b6135f6565b60405161052393929190615982565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b2906156e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561062b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610622906155a1565b60405180910390fd5b600084141561066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066690615581565b60405180910390fd5b84518411156106b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106aa90615621565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836004819055508460039080519060200190610710929190614192565b5060005b60038054905081101561086457600073ffffffffffffffffffffffffffffffffffffffff166003828154811061074657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90615701565b60405180910390fd5b600160066000600384815481106107db57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050610714565b50845160028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b819055507ff4955da0e7ea6f8c9297d8046c39168f24abc71dd60d47c7e4e2172f28f0c93385600454600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161090c93929190615362565b60405180910390a15050505050565b6003818154811061092b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a605760005b600380549050811015610a5a57600381815481106109ce57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003805490504781610a2057fe5b049081150290604051600060405180830381858888f19350505050158015610a4c573d6000803e3d6000fd5b5080806001019150506109b4565b50610aca565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ac8573d6000803e3d6000fd5b505b565b60025481565b610ada613847565b8451865114610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906157c1565b60405180910390fd5b8351855114610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b59906157c1565b60405180910390fd5b8251845114610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906157c1565b60405180910390fd5b8151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906157c1565b60405180910390fd5b8051825114610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906157c1565b60405180910390fd5b60005b8651811015610f22576012858281518110610c4857fe5b60200260200101511115610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906157a1565b60405180910390fd5b6000848281518110610c9f57fe5b602002602001015111610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90615721565b60405180910390fd5b6001828281518110610cf557fe5b60200260200101511115610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906156c1565b60405180910390fd5b600a6040518060e00160405280898481518110610d5757fe5b60200260200101518152602001878481518110610d7057fe5b60200260200101518152602001868481518110610d8957fe5b602002602001015181526020016000815260200160008152602001848481518110610db057fe5b60200260200101518152602001858481518110610dc957fe5b602002602001015181525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000019080519060200190610e1992919061421c565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550507f7987e4b97b6de28ab6f19d4724c233a6f4fe564ba5413dc5d74b4c2c7841651a878281518110610e8557fe5b6020026020010151878381518110610e9957fe5b6020026020010151878481518110610ead57fe5b6020026020010151878581518110610ec157fe5b60200260200101516001600a8054905003878781518110610ede57fe5b6020026020010151898881518110610ef257fe5b6020026020010151604051610f0d9796959493929190615484565b60405180910390a18080600101915050610c31565b50505050505050565b606080606060008451905060008167ffffffffffffffff81118015610f4f57600080fd5b50604051908082528060200260200182016040528015610f7e5781602001602082028036833780820191505090505b50905060008267ffffffffffffffff81118015610f9a57600080fd5b50604051908082528060200260200182016040528015610fc95781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81118015610fe557600080fd5b506040519080825280602002602001820160405280156110145781602001602082028036833780820191505090505b50905060005b88518110156110945761103f89828151811061103257fe5b60200260200101516135f6565b86848151811061104b57fe5b6020026020010186858151811061105e57fe5b6020026020010186868151811061107157fe5b60200260200101838152508381525083815250505050808060010191505061101a565b50828282965096509650505050509193909250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8151835114611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a906157c1565b60405180910390fd5b600080600090505b8451811015611440576001600a86838151811061113457fe5b60200260200101518154811061114657fe5b90600052602060002090600702016005015414611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90615501565b60405180910390fd5b610e108482815181106111a757fe5b602002602001015110156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790615541565b60405180910390fd5b42600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061123e57fe5b6020026020010151815260200190815260200160002054116112ec5761128084828151811061126957fe5b6020026020010151426138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106112cd57fe5b60200260200101518152602001908152602001600020819055506113dd565b6113758482815181106112fb57fe5b6020026020010151600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088858151811061135057fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008784815181106113c257fe5b60200260200101518152602001908152602001600020819055505b610e108482815181106113ec57fe5b6020026020010151600a87848151811061140257fe5b60200260200101518154811061141457fe5b906000526020600020906007020160060154028161142e57fe5b0482019150808060010191505061111b565b5080341015611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90615641565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161154f57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561157b57600080fd5b505af115801561158f573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc42603234816115bf57fe5b04336040516115cf92919061587c565b60405180910390a15050505050565b6115e6613847565b815181511461162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190615561565b60405180910390fd5b60005b8151811015611d45576000600a84838151811061164657fe5b60200260200101518154811061165857fe5b906000526020600020906007020160020154428161167257fe5b04905060006007600086858151811061168757fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461177c576007600085848151811061170457fe5b60200260200101518152602001908152602001600020600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905550505b604051806040016040528084848151811061179357fe5b6020026020010151815260200142815250600760008685815181106117b457fe5b60200260200101518152602001908152602001600020600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fba4832b2bf8c9586edd5026f5bf3a5b8a69b0b29dea651d15bfda0cddf0e954884838151811061185c57fe5b60200260200101518285858151811061187157fe5b6020026020010151423360405161188c9594939291906159b9565b60405180910390a160008060038054905067ffffffffffffffff811180156118b357600080fd5b506040519080825280602002602001820160405280156118e25781602001602082028036833780820191505090505b509050600080600090505b600380549050811015611a93576000600760008a898151811061190c57fe5b60200260200101518152602001908152602001600020600087815260200190815260200160002060006003848154811061194257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414611a86578380600101945050600760008988815181106119c857fe5b6020026020010151815260200190815260200160002060008681526020019081526020016000206000600383815481106119fe57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154838380600101945081518110611a7957fe5b6020026020010181815250505b80806001019150506118ed565b508082526004548310611d34576000611aab8361395d565b9050600060016002835181611abc57fe5b061415611af55760006002600184510181611ad357fe5b049050826001820381518110611ae557fe5b6020026020010151915050611b3f565b60006002835181611b0257fe5b0490506002838281518110611b1357fe5b6020026020010151846001840381518110611b2a57fe5b60200260200101510181611b3a57fe5b049150505b600a898881518110611b4d57fe5b602002602001015181548110611b5f57fe5b906000526020600020906007020160020154600a8a8981518110611b7f57fe5b602002602001015181548110611b9157fe5b90600052602060002090600702016004015481611baa57fe5b04600a8a8981518110611bb957fe5b602002602001015181548110611bcb57fe5b9060005260206000209060070201600201544281611be557fe5b041115611cc557600a898881518110611bfa57fe5b602002602001015181548110611c0c57fe5b906000526020600020906007020160030154600560008b8a81518110611c2e57fe5b602002602001015181526020019081526020016000206000600a8c8b81518110611c5457fe5b602002602001015181548110611c6657fe5b906000526020600020906007020160020154600a8d8c81518110611c8657fe5b602002602001015181548110611c9857fe5b90600052602060002090600702016004015481611cb157fe5b048152602001908152602001600020819055505b42600a8a8981518110611cd457fe5b602002602001015181548110611ce657fe5b90600052602060002090600702016004018190555080600a8a8981518110611d0a57fe5b602002602001015181548110611d1c57fe5b90600052602060002090600702016003018190555050505b50505050808060010191505061162d565b505050565b606060008351905060008167ffffffffffffffff81118015611d6b57600080fd5b50604051908082528060200260200182016040528015611d9a5781602001602082028036833780820191505090505b5090508351855114611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890615801565b60405180910390fd5b60005b85518110156120bb576000600b541115611f275742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f22576001600a878381518110611e4e57fe5b602002602001015181548110611e6057fe5b906000526020600020906007020160050154148015611ee1575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611ec857fe5b6020026020010151815260200190815260200160002054105b15611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890615681565b60405180910390fd5b5b61200b565b6001600a878381518110611f3757fe5b602002602001015181548110611f4957fe5b906000526020600020906007020160050154148015611fca575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888481518110611fb157fe5b6020026020010151815260200190815260200160002054105b1561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190615681565b60405180910390fd5b5b6000600a87838151811061201b57fe5b60200260200101518154811061202d57fe5b90600052602060002090600702016002015486838151811061204b57fe5b60200260200101518161205a57fe5b0490506005600088848151811061206d57fe5b602002602001015181526020019081526020016000206000828152602001908152602001600020548383815181106120a157fe5b602002602001018181525050508080600101915050611de4565b50809250505092915050565b805182511461210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906157c1565b60405180910390fd5b600080600090505b835181101561228a576000600a85838151811061212c57fe5b60200260200101518154811061213e57fe5b90600052602060002090600702016005015414612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790615521565b60405180910390fd5b6121dc83828151811061219f57fe5b6020026020010151600860008785815181106121b757fe5b60200260200101518152602001908152602001600020546138d590919063ffffffff16565b600860008684815181106121ec57fe5b602002602001015181526020019081526020016000208190555082818151811061221257fe5b6020026020010151820191507f3444f0007ac07416465c167c0d7657d48e9d410b498f8849035fc9cf9523976d84828151811061224b57fe5b602002602001015184838151811061225f57fe5b6020026020010151604051612275929190615906565b60405180910390a18080600101915050612113565b50803410156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590615661565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561233957600080fd5b505af115801561234d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06064848161239957fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123c557600080fd5b505af11580156123d9573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426064838161240957fe5b043360405161241992919061587c565b60405180910390a150505050565b6000600b54141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615821565b60405180910390fd5b610e108110156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a990615541565b60405180910390fd5b6201518081600b5402816124c257fe5b04341015612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc906157e1565b60405180910390fd5b42600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116125a65761255e81426138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061263c565b6125f881600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138d590919063ffffffff16565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c216844a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126df9190614536565b90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db06032348161270757fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b50505050507f103515a9d6bc0233f6381d5e58df739f3078b58635e20d5dd204e558769ddc426032348161277757fe5b043360405161278792919061587c565b60405180910390a1505050565b600b5481565b60086020528060005260406000206000915090505481565b60045481565b6127c0613847565b6000600d82815481106127cf57fe5b9060005260206000209060060201600501541415612822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612819906155e1565b60405180910390fd5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d6781336040516128bc92919061587c565b60405180910390a1600080600090505b60038054905081101561298957600e60008481526020019081526020016000206000600383815481106128fb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561297c5781806001019250505b80806001019150506128cc565b506004548110612c75576000600d83815481106129a257fe5b90600052602060002090600602016003015414156129e6576129e1600d83815481106129ca57fe5b906000526020600020906006020160000154613977565b612c50565b6001600d83815481106129f557fe5b9060005260206000209060060201600301541415612a3957612a34600d8381548110612a1d57fe5b9060005260206000209060060201600001546139b8565b612c4f565b6002600d8381548110612a4857fe5b9060005260206000209060060201600301541415612aac57612aa7600d8381548110612a7057fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613a82565b612c4e565b6003600d8381548110612abb57fe5b9060005260206000209060060201600301541415612b1f57612b1a600d8381548110612ae357fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613c4d565b612c4d565b6004600d8381548110612b2e57fe5b9060005260206000209060060201600301541415612b9257612b8d600d8381548110612b5657fe5b906000526020600020906006020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613e8f565b612c4c565b6005600d8381548110612ba157fe5b9060005260206000209060060201600301541415612c0457612bff600d8381548110612bc957fe5b906000526020600020906006020160000154600d8481548110612be857fe5b906000526020600020906006020160040154613f0a565b612c4b565b612c4a600d8381548110612c1457fe5b906000526020600020906006020160000154600d8481548110612c3357fe5b906000526020600020906006020160040154613fae565b5b5b5b5b5b5b6000600d8381548110612c5f57fe5b9060005260206000209060060201600501819055505b5050565b612c81613847565b6000600d8054905090506000831480612c9a5750600183145b80612ca55750600783145b15612dee57600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613086565b6005831480612dfd5750600683145b15612f4557600d6040518060c00160405280878152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501555050613085565b600d6040518060c00160405280600081526020018673ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200160008152602001600181525090806001815401808255809150506001900390600052602060002090600602016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015550505b5b6001600e600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa7105ed77601732b2ee4362ad1a2ca325d1983be801d553d907e0aa29dcdb79a818686863360405161312695949392919061592f565b60405180910390a17f163fd1b723c0447962b4aca81cc014e8103ab3753a07542f4edbed3e59444d67813360405161315f92919061587c565b60405180910390a15050505050565b6000600a80549050905090565b600d818154811061318b57600080fd5b90600052602060002090600602016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050154905086565b606080606080606060008651905060008167ffffffffffffffff8111801561322e57600080fd5b5060405190808252806020026020018201604052801561326257816020015b606081526020019060019003908161324d5790505b50905060008267ffffffffffffffff8111801561327e57600080fd5b506040519080825280602002602001820160405280156132ad5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff811180156132c957600080fd5b506040519080825280602002602001820160405280156132f85781602001602082028036833780820191505090505b50905060008467ffffffffffffffff8111801561331457600080fd5b506040519080825280602002602001820160405280156133435781602001602082028036833780820191505090505b50905060008567ffffffffffffffff8111801561335f57600080fd5b5060405190808252806020026020018201604052801561338e5781602001602082028036833780820191505090505b50905060005b8c518110156135b357600a8d82815181106133ab57fe5b6020026020010151815481106133bd57fe5b90600052602060002090600702016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134625780601f1061343757610100808354040283529160200191613462565b820191906000526020600020905b81548152906001019060200180831161344557829003601f168201915b505050505086828151811061347357fe5b6020026020010181905250600a8d828151811061348c57fe5b60200260200101518154811061349e57fe5b9060005260206000209060070201600101548582815181106134bc57fe5b602002602001018181525050600a8d82815181106134d657fe5b6020026020010151815481106134e857fe5b90600052602060002090600702016002015484828151811061350657fe5b602002602001018181525050600a8d828151811061352057fe5b60200260200101518154811061353257fe5b90600052602060002090600702016005015483828151811061355057fe5b602002602001018181525050600a8d828151811061356a57fe5b60200260200101518154811061357c57fe5b90600052602060002090600702016006015482828151811061359a57fe5b6020026020010181815250508080600101915050613394565b5084848484849a509a509a509a509a5050505050505091939590929450565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000600b5411156137135742600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161370e576001600a888154811061365f57fe5b9060005260206000209060070201600501541480156136cd575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b1561370d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370490615681565b60405180910390fd5b5b6137d1565b6001600a888154811061372257fe5b906000526020600020906007020160050154148015613790575042600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002054105b156137d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c790615681565b60405180910390fd5b5b600a87815481106137de57fe5b9060005260206000209060070201600301549250600a87815481106137ff57fe5b9060005260206000209060070201600401549150600a878154811061382057fe5b90600052602060002090600702016001015490508282829550955095505050509193909250565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca906155c1565b60405180910390fd5b565b600080828401905083811015613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b606061396f8260006001855103614051565b819050919050565b80600b819055507f35a14b8b09dda49419beccb57b8ab7a2333bfeb9634690a2fdd9e62ca2b73dea816040516139ad9190615861565b60405180910390a150565b60008114156139fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f390615581565b60405180910390fd5b600254811115613a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3890615741565b60405180910390fd5b806004819055507fd88532aad776d079efe3ac298f9e21dc4ef893e240d8c13107298e7c4f6eb8b881604051613a779190615861565b60405180910390a150565b60005b600380549050811015613b45578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613ab657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2f90615761565b60405180910390fd5b8080600101915050613a85565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600081548092919060010191905055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3dc2a8437aef0e8d2839b5e75d0d93e6c7f43b3acf5d2ef2db79beb54cb47b3d81604051613c42919061532c565b60405180910390a150565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd090615841565b60405180910390fd5b6004546001600380549050031015613d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d1d906156a1565b60405180910390fd5b60005b600380549050811015613e8b578173ffffffffffffffffffffffffffffffffffffffff1660038281548110613d5a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613e7e5760038181548110613dae57fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260008154809291906001900391905055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffa15964370ccf7acface74df78a85aa4857e703226c446d3e24a69663dc302e782604051613e75919061532c565b60405180910390a15b8080600101915050613d29565b5050565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4bc0293774d2baff337ab66d049d9fb89b31c492a1c82fd1b53d43ac85e8da5181604051613eff919061532c565b60405180910390a150565b6001821115613f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4590615781565b60405180910390fd5b81600a8281548110613f5c57fe5b9060005260206000209060070201600501819055507fe7fdf61d93ca682755140eb73628f48cfc090ca0f669e547790b227980e1a22c8282604051613fa2929190615906565b60405180910390a15050565b60008211613ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe890615601565b60405180910390fd5b81600a8281548110613fff57fe5b9060005260206000209060070201600601819055507f66317a45088a6e6e10f3831e0347d9fbaa68b04f54503eaf4e8683512a69077a8282604051614045929190615906565b60405180910390a15050565b600082905060008290508082141561406a57505061418d565b60008560028686038161407957fe5b0586018151811061408657fe5b602002602001015190505b818313614161575b808684815181106140a657fe5b602002602001015110156140c1578280600101935050614099565b5b8582815181106140ce57fe5b60200260200101518110156140eb578180600190039250506140c2565b81831361415c578582815181106140fe57fe5b602002602001015186848151811061411257fe5b602002602001015187858151811061412657fe5b6020026020010188858151811061413957fe5b602002602001018281525082815250505082806001019350508180600190039250505b614091565b8185121561417557614174868684614051565b5b8383121561418957614188868486614051565b5b5050505b505050565b82805482825590600052602060002090810192821561420b579160200282015b8281111561420a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906141b2565b5b50905061421891906142aa565b5090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826142525760008555614299565b82601f1061426b57805160ff1916838001178555614299565b82800160010185558215614299579182015b8281111561429857825182559160200191906001019061427d565b5b5090506142a691906142aa565b5090565b5b808211156142c35760008160009055506001016142ab565b5090565b60006142da6142d584615a3d565b615a0c565b905080838252602082019050828560208602820111156142f957600080fd5b60005b85811015614329578161430f888261443a565b8452602084019350602083019250506001810190506142fc565b5050509392505050565b600061434661434184615a69565b615a0c565b9050808382526020820190508260005b85811015614386578135850161436c88826144f7565b845260208401935060208301925050600181019050614356565b5050509392505050565b60006143a361439e84615a95565b615a0c565b905080838252602082019050828560208602820111156143c257600080fd5b60005b858110156143f257816143d88882614521565b8452602084019350602083019250506001810190506143c5565b5050509392505050565b600061440f61440a84615ac1565b615a0c565b90508281526020810184848401111561442757600080fd5b614432848285615c4d565b509392505050565b60008135905061444981615ca2565b92915050565b60008135905061445e81615cb9565b92915050565b60008151905061447381615cb9565b92915050565b600082601f83011261448a57600080fd5b813561449a8482602086016142c7565b91505092915050565b600082601f8301126144b457600080fd5b81356144c4848260208601614333565b91505092915050565b600082601f8301126144de57600080fd5b81356144ee848260208601614390565b91505092915050565b600082601f83011261450857600080fd5b81356145188482602086016143fc565b91505092915050565b60008135905061453081615cd0565b92915050565b60006020828403121561454857600080fd5b600061455684828501614464565b91505092915050565b6000806040838503121561457257600080fd5b60006145808582860161443a565b925050602061459185828601614521565b9150509250929050565b600080600080600060a086880312156145b357600080fd5b600086013567ffffffffffffffff8111156145cd57600080fd5b6145d988828901614479565b95505060206145ea88828901614521565b94505060406145fb8882890161444f565b935050606061460c88828901614521565b925050608061461d8882890161443a565b9150509295509295909350565b60008060008060008060c0878903121561464357600080fd5b600087013567ffffffffffffffff81111561465d57600080fd5b61466989828a016144a3565b965050602087013567ffffffffffffffff81111561468657600080fd5b61469289828a016144a3565b955050604087013567ffffffffffffffff8111156146af57600080fd5b6146bb89828a016144cd565b945050606087013567ffffffffffffffff8111156146d857600080fd5b6146e489828a016144cd565b935050608087013567ffffffffffffffff81111561470157600080fd5b61470d89828a016144cd565b92505060a087013567ffffffffffffffff81111561472a57600080fd5b61473689828a016144cd565b9150509295509295509295565b60006020828403121561475557600080fd5b600082013567ffffffffffffffff81111561476f57600080fd5b61477b848285016144cd565b91505092915050565b6000806040838503121561479757600080fd5b600083013567ffffffffffffffff8111156147b157600080fd5b6147bd858286016144cd565b925050602083013567ffffffffffffffff8111156147da57600080fd5b6147e6858286016144cd565b9150509250929050565b60008060006060848603121561480557600080fd5b600084013567ffffffffffffffff81111561481f57600080fd5b61482b868287016144cd565b935050602084013567ffffffffffffffff81111561484857600080fd5b614854868287016144cd565b92505060406148658682870161443a565b9150509250925092565b60006020828403121561488157600080fd5b600061488f84828501614521565b91505092915050565b600080600080608085870312156148ae57600080fd5b60006148bc87828801614521565b94505060206148cd8782880161443a565b93505060406148de87828801614521565b92505060606148ef87828801614521565b91505092959194509250565b6000614907838361495d565b60208301905092915050565b600061491f8383614aac565b905092915050565b6000614933838361530e565b60208301905092915050565b61494881615c17565b82525050565b61495781615bdb565b82525050565b61496681615bc9565b82525050565b61497581615bc9565b82525050565b600061498682615b21565b6149908185615b74565b935061499b83615af1565b8060005b838110156149cc5781516149b388826148fb565b97506149be83615b4d565b92505060018101905061499f565b5085935050505092915050565b60006149e482615b2c565b6149ee8185615b85565b935083602082028501614a0085615b01565b8060005b85811015614a3c5784840389528151614a1d8582614913565b9450614a2883615b5a565b925060208a01995050600181019050614a04565b50829750879550505050505092915050565b6000614a5982615b37565b614a638185615b96565b9350614a6e83615b11565b8060005b83811015614a9f578151614a868882614927565b9750614a9183615b67565b925050600181019050614a72565b5085935050505092915050565b6000614ab782615b42565b614ac18185615ba7565b9350614ad1818560208601615c5c565b614ada81615c91565b840191505092915050565b6000614af082615b42565b614afa8185615bb8565b9350614b0a818560208601615c5c565b614b1381615c91565b840191505092915050565b6000614b2b601783615bb8565b91507f446f6e6174696f6e206d6f6465207475726e6564206f6e0000000000000000006000830152602082019050919050565b6000614b6b601b83615bb8565b91507f537562736372697074696f6e206d6f6465207475726e6564206f6e00000000006000830152602082019050919050565b6000614bab601a83615bb8565b91507f4d696e696d756d20737562736372697074696f6e2069732031680000000000006000830152602082019050919050565b6000614beb602b83615bb8565b91507f56616c7565206c656e67746820616e6420666565644944206c656e677468206460008301527f6f206e6f74206d617463680000000000000000000000000000000000000000006020830152604082019050919050565b6000614c51601383615bb8565b91507f5468726573686f6c642063616e742062652030000000000000000000000000006000830152602082019050919050565b6000614c91601783615bb8565b91507f666163746f72792063616e206e6f74206265206e756c6c0000000000000000006000830152602082019050919050565b6000614cd1602583615bb8565b91507f4f6e6c792061207369676e65722063616e20706572666f726d2074686973206160008301527f6374696f6e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d37601383615bb8565b91507f50726f706f73616c206e6f7420616374697665000000000000000000000000006000830152602082019050919050565b6000614d77601483615bb8565b91507f466565642070726963652063616e7420626520300000000000000000000000006000830152602082019050919050565b6000614db7602883615bb8565b91507f5468726573686f6c642063616e74206265206d6f7265207468656e207369676e60008301527f657220636f756e740000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1d602a83615bb8565b91507f4e6f7420656e6f7567682066756e64732073656e7420746f20636f766572206f60008301527f7261636c652066656573000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e83602683615bb8565b91507f4d73672e76616c756520646f6573206e6f74206d65657420737570706f72742060008301527f76616c75657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ee9601783615bb8565b91507f4e6f20737562736372697074696f6e20746f20666565640000000000000000006000830152602082019050919050565b6000614f29601b83615bb8565b91507f4c657373207369676e657273207468616e207468726573686f6c6400000000006000830152602082019050919050565b6000614f69601b83615bb8565b91507f57726f6e6720726576656e75654d6f646520706172616d6574657200000000006000830152602082019050919050565b6000614fa9601383615bb8565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b6000614fe9601083615bb8565b91507f4e6f74207a65726f2061646472657373000000000000000000000000000000006000830152602082019050919050565b6000615029601483615bb8565b91507f54696d65736c6f742063616e6e6f7420626520300000000000000000000000006000830152602082019050919050565b6000615069602f83615bb8565b91507f5468726573686f6c642063616e7420626520626967676572207468656e206c6560008301527f6e677468206f66207369676e65727300000000000000000000000000000000006020830152604082019050919050565b60006150cf601583615bb8565b91507f5369676e657220616c72656164792065786973747300000000000000000000006000830152602082019050919050565b600061510f602183615bb8565b91507f496e76616c696420617267756d656e7420666f7220726576656e7565204d6f6460008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615175601783615bb8565b91507f446563696d616c20706c6163657320746f6f20686967680000000000000000006000830152602082019050919050565b60006151b5600f83615bb8565b91507f4c656e677468206d69736d6174636800000000000000000000000000000000006000830152602082019050919050565b60006151f5601283615bb8565b91507f4e6f7420656e6f756768207061796d656e7400000000000000000000000000006000830152602082019050919050565b6000615235601f83615bb8565b91507f466565647320616e642054696d657374616d7073206d757374206d61746368006000830152602082019050919050565b6000615275601c83615bb8565b91507f537562736372697074696f6e2050617373207475726e6564206f6666000000006000830152602082019050919050565b60006152b5602483615bb8565b91507f4164647265737320746f2072656d6f76652068617320746f206265206120736960008301527f676e6572000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61531781615c0d565b82525050565b61532681615c0d565b82525050565b6000602082019050615341600083018461496c565b92915050565b600060208201905061535c600083018461494e565b92915050565b6000606082019050818103600083015261537c818661497b565b905061538b602083018561531d565b615398604083018461493f565b949350505050565b600060a08201905081810360008301526153ba81886149d9565b905081810360208301526153ce8187614a4e565b905081810360408301526153e28186614a4e565b905081810360608301526153f68185614a4e565b9050818103608083015261540a8184614a4e565b90509695505050505050565b600060208201905081810360008301526154308184614a4e565b905092915050565b600060608201905081810360008301526154528186614a4e565b905081810360208301526154668185614a4e565b9050818103604083015261547a8184614a4e565b9050949350505050565b600060e082019050818103600083015261549e818a614ae5565b905081810360208301526154b28189614ae5565b90506154c1604083018861531d565b6154ce606083018761531d565b6154db608083018661531d565b6154e860a083018561531d565b6154f560c083018461531d565b98975050505050505050565b6000602082019050818103600083015261551a81614b1e565b9050919050565b6000602082019050818103600083015261553a81614b5e565b9050919050565b6000602082019050818103600083015261555a81614b9e565b9050919050565b6000602082019050818103600083015261557a81614bde565b9050919050565b6000602082019050818103600083015261559a81614c44565b9050919050565b600060208201905081810360008301526155ba81614c84565b9050919050565b600060208201905081810360008301526155da81614cc4565b9050919050565b600060208201905081810360008301526155fa81614d2a565b9050919050565b6000602082019050818103600083015261561a81614d6a565b9050919050565b6000602082019050818103600083015261563a81614daa565b9050919050565b6000602082019050818103600083015261565a81614e10565b9050919050565b6000602082019050818103600083015261567a81614e76565b9050919050565b6000602082019050818103600083015261569a81614edc565b9050919050565b600060208201905081810360008301526156ba81614f1c565b9050919050565b600060208201905081810360008301526156da81614f5c565b9050919050565b600060208201905081810360008301526156fa81614f9c565b9050919050565b6000602082019050818103600083015261571a81614fdc565b9050919050565b6000602082019050818103600083015261573a8161501c565b9050919050565b6000602082019050818103600083015261575a8161505c565b9050919050565b6000602082019050818103600083015261577a816150c2565b9050919050565b6000602082019050818103600083015261579a81615102565b9050919050565b600060208201905081810360008301526157ba81615168565b9050919050565b600060208201905081810360008301526157da816151a8565b9050919050565b600060208201905081810360008301526157fa816151e8565b9050919050565b6000602082019050818103600083015261581a81615228565b9050919050565b6000602082019050818103600083015261583a81615268565b9050919050565b6000602082019050818103600083015261585a816152a8565b9050919050565b6000602082019050615876600083018461531d565b92915050565b6000604082019050615891600083018561531d565b61589e602083018461493f565b9392505050565b600060c0820190506158ba600083018961531d565b6158c7602083018861496c565b6158d4604083018761496c565b6158e1606083018661531d565b6158ee608083018561531d565b6158fb60a083018461531d565b979650505050505050565b600060408201905061591b600083018561531d565b615928602083018461531d565b9392505050565b600060a082019050615944600083018861531d565b615951602083018761531d565b61595e604083018661496c565b61596b606083018561531d565b615978608083018461493f565b9695505050505050565b6000606082019050615997600083018661531d565b6159a4602083018561531d565b6159b1604083018461531d565b949350505050565b600060a0820190506159ce600083018861531d565b6159db602083018761531d565b6159e8604083018661531d565b6159f5606083018561531d565b615a02608083018461493f565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715615a3357615a32615c8f565b5b8060405250919050565b600067ffffffffffffffff821115615a5857615a57615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615a8457615a83615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615ab057615aaf615c8f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615adc57615adb615c8f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615bd482615bed565b9050919050565b6000615be682615bed565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615c2282615c29565b9050919050565b6000615c3482615c3b565b9050919050565b6000615c4682615bed565b9050919050565b82818337600083830152505050565b60005b83811015615c7a578082015181840152602081019050615c5f565b83811115615c89576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b615cab81615bc9565b8114615cb657600080fd5b50565b615cc281615bdb565b8114615ccd57600080fd5b50565b615cd981615c0d565b8114615ce457600080fd5b5056fea26469706673582212200473977c2ba1ae8d3232d8c2f6c7eed485875e7529cca20f654d811486b8422964736f6c63430007060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.