Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Tailchakra/292cf2597a16aa2a4e785370cbf4d567 to your computer and use it in GitHub Desktop.
Save Tailchakra/292cf2597a16aa2a4e785370cbf4d567 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.5.7+commit.6da8b019.js&optimize=false&runs=200&gist=
pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;
import "./lib/Withdrawable.sol";
import "./lib/Pausable.sol";
import "./lib/TokenTransferProxy.sol";
import "./lib/Utils.sol";
import "./lib/ERC20SafeTransfer.sol";
import "./lib/Partner.sol";
import "./lib/Math.sol";
import "./lib/TokenBalanceLibrary.sol";
import "./exchange_handlers/ExchangeHandler.sol";
/// @title The primary contract for aggregator
contract AggregatorEntry is Withdrawable, Pausable {
/*
* State Variables
*/
TokenTransferProxy public tokenTransferProxy;
mapping(address => bool) public signers;
/*
* Types
*/
// Structs
struct Order {
address payable exchangeHandler;
bytes encodedPayload;
uint256 minSourceAmount;
uint256 maxSourceAmount;
}
struct Trade {
address sourceToken;
address destinationToken;
uint256 amount;
bool isSourceAmount; //true if amount is sourceToken, false if it's destinationToken
Order[] orders;
}
struct Swap {
Trade[] trades;
uint256 minimumExchangeRate;
uint256 minimumDestinationAmount;
uint256 sourceAmount;
uint256 tradeToTakeFeeFrom;
bool takeFeeFromSource; //Takes the fee before the trade if true, takes it after if false
address payable redirectAddress;
bool required;
}
struct SwapCollection {
Swap[] swaps;
address payable partnerContract;
uint256 expirationBlock;
bytes32 id;
uint256 maxGasPrice;
uint8 v;
bytes32 r;
bytes32 s;
}
/*
* Events
*/
event LogSwapCollection(
bytes32 indexed id,
address indexed partnerContract,
address indexed user
);
event LogSwap(
bytes32 indexed id,
address sourceAsset,
address destinationAsset,
uint256 sourceAmount,
uint256 destinationAmount,
address feeAsset,
uint256 feeAmount
);
/// @notice Constructor
/// @param _tokenTransferProxy address of the TokenTransferProxy
/// @param _signer the suggester's address that signs the payloads. More can be added with add/removeSigner functions
constructor(address _tokenTransferProxy, address _signer) public {
tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);
signers[_signer] = true;
}
/*
* Public functions
*/
modifier notExpired(SwapCollection memory swaps) {
require(swaps.expirationBlock > block.number, "Expired");
_;
}
modifier validSignature(SwapCollection memory swaps) {
bytes32 hash = keccak256(
abi.encode(
swaps.swaps,
swaps.partnerContract,
swaps.expirationBlock,
swaps.id,
swaps.maxGasPrice,
msg.sender
)
);
require(
signers[ecrecover(
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
),
swaps.v,
swaps.r,
swaps.s
)],
"Invalid signature"
);
_;
}
modifier notAboveMaxGas(SwapCollection memory swaps) {
require(tx.gasprice <= swaps.maxGasPrice, "Gas price too high");
_;
}
/// @notice Performs the requested set of swaps
/// @param swaps The struct that defines the collection of swaps to perform
function performSwapCollection(SwapCollection memory swaps) public payable whenNotPaused notExpired(swaps) validSignature(swaps) notAboveMaxGas(swaps) {
uint256 startingGas = 0;
TokenBalanceLibrary.TokenBalance[20] memory balances;
balances[0] = TokenBalanceLibrary.TokenBalance(
address(Utils.eth_address()),
msg.value
);
for (
uint256 swapIndex = 0;
swapIndex < swaps.swaps.length;
swapIndex++
) {
performSwap(
swaps.id,
swaps.swaps[swapIndex],
balances,
swaps.partnerContract
);
}
emit LogSwapCollection(swaps.id, swaps.partnerContract, msg.sender);
transferAllTokensToUser(balances);
}
function addSigner(address newSigner) public onlyOwner {
signers[newSigner] = true;
}
function removeSigner(address signer) public onlyOwner {
signers[signer] = false;
}
/*
* Internal functions
*/
function performSwap(bytes32 swapCollectionId, Swap memory swap, TokenBalanceLibrary.TokenBalance[20] memory balances, address payable partnerContract) internal {
if (
!transferFromSenderDifference(
balances,
swap.trades[0].sourceToken,
swap.sourceAmount
)
) {
if (swap.required) {
revert("Failed to get tokens for swap");
} else {
return;
}
}
uint256 amountSpentFirstTrade = 0;
uint256 amountReceived = 0;
uint256 feeAmount = 0;
for (
uint256 tradeIndex = 0;
tradeIndex < swap.trades.length;
tradeIndex++
) {
if (
tradeIndex == swap.tradeToTakeFeeFrom && swap.takeFeeFromSource
) {
feeAmount = takeFee(
balances,
swap.trades[tradeIndex].sourceToken,
partnerContract,
tradeIndex == 0 ? swap.sourceAmount : amountReceived
);
}
uint256 tempSpent;
(tempSpent, amountReceived) = performTrade(
swap.trades[tradeIndex],
balances,
Utils.min(
tradeIndex == 0 ? swap.sourceAmount : amountReceived,
balances[TokenBalanceLibrary.findToken(
balances,
swap.trades[tradeIndex].sourceToken
)]
.balance
)
);
if (
!swap.trades[tradeIndex].isSourceAmount &&
amountReceived < swap.trades[tradeIndex].amount
) {
if (swap.required) {
revert("Not enough destination amount");
}
return;
}
if (tradeIndex == 0) {
amountSpentFirstTrade = tempSpent;
if (feeAmount != 0) {
amountSpentFirstTrade += feeAmount;
}
}
if (
tradeIndex == swap.tradeToTakeFeeFrom && !swap.takeFeeFromSource
) {
feeAmount = takeFee(
balances,
swap.trades[tradeIndex].destinationToken,
partnerContract,
amountReceived
);
amountReceived -= feeAmount;
}
}
emit LogSwap(
swapCollectionId,
swap.trades[0].sourceToken,
swap.trades[swap.trades.length - 1].destinationToken,
amountSpentFirstTrade,
amountReceived,
swap.takeFeeFromSource
? swap.trades[swap.tradeToTakeFeeFrom].sourceToken
: swap.trades[swap.tradeToTakeFeeFrom].destinationToken,
feeAmount
);
if (amountReceived < swap.minimumDestinationAmount) {
revert("Got less than minimumDestinationAmount");
} else if (
minimumRateFailed(
swap.trades[0].sourceToken,
swap.trades[swap.trades.length - 1].destinationToken,
swap.sourceAmount,
amountReceived,
swap.minimumExchangeRate
)
) {
revert("Minimum exchange rate not met");
}
if (
swap.redirectAddress != msg.sender &&
swap.redirectAddress != address(0x0)
) {
uint256 destinationTokenIndex = TokenBalanceLibrary.findToken(
balances,
swap.trades[swap.trades.length - 1].destinationToken
);
uint256 amountToSend = Math.min(
amountReceived,
balances[destinationTokenIndex].balance
);
transferTokens(
balances,
destinationTokenIndex,
swap.redirectAddress,
amountToSend
);
TokenBalanceLibrary.removeBalance(
balances,
swap.trades[swap.trades.length - 1].destinationToken,
amountToSend
);
}
}
function performTrade(Trade memory trade, TokenBalanceLibrary.TokenBalance[20] memory balances, uint256 availableToSpend) internal returns (uint256 totalSpent, uint256 totalReceived) {
uint256 tempSpent = 0;
uint256 tempReceived = 0;
uint256 missingSpend = 0;
// This is the amount that we expected to have spent, but didn't. Not to be confused with the total amount left to spend
uint256 totalRemainingExcess = getTotalExcess(trade);
for (
uint256 orderIndex = 0;
orderIndex < trade.orders.length;
orderIndex++
) {
if ((availableToSpend - totalSpent) * 10000 < availableToSpend) {
break;
} else if (trade.isSourceAmount && tempSpent == trade.amount) {
break;
}
uint256 targetSpend = getTargetSpend(
trade.orders[orderIndex].minSourceAmount,
trade.orders[orderIndex].maxSourceAmount,
totalRemainingExcess,
missingSpend);
(tempSpent, tempReceived) = performOrder(
trade.orders[orderIndex],
availableToSpend - totalSpent,
trade.isSourceAmount,
trade.sourceToken,
balances
);
totalRemainingExcess -= (trade.orders[orderIndex].maxSourceAmount -
trade.orders[orderIndex].minSourceAmount);
if (tempSpent < trade.orders[orderIndex].minSourceAmount) {
missingSpend += (targetSpend - tempSpent);
}
totalSpent += tempSpent;
totalReceived += tempReceived;
}
TokenBalanceLibrary.addBalance(
balances,
trade.destinationToken,
totalReceived
);
TokenBalanceLibrary.removeBalance(
balances,
trade.sourceToken,
totalSpent
);
}
function performOrder(Order memory order, uint256 targetAmount, bool isSourceAmount, address tokenToSpend, TokenBalanceLibrary.TokenBalance[20] memory balances) internal returns (uint256 spent, uint256 received) {
if (tokenToSpend == Utils.eth_address()) {
(spent, received) = ExchangeHandler(order.exchangeHandler)
.performOrder
.value(targetAmount)(
order.encodedPayload,
targetAmount,
targetAmount,
isSourceAmount
);
} else {
transferTokens(
balances,
TokenBalanceLibrary.findToken(balances, tokenToSpend),
order.exchangeHandler,
targetAmount
);
(spent, received) = ExchangeHandler(order.exchangeHandler)
.performOrder(
order.encodedPayload,
targetAmount,
targetAmount,
isSourceAmount
);
}
}
function getTargetSpend(uint256 minOrderAmount, uint256 maxOrderAmount, uint256 totalRemainingExcess, uint256 missingSpend) internal returns (uint256 targetSpend) {
if (missingSpend == 0 || minOrderAmount == maxOrderAmount) {
return minOrderAmount;
} else {
return
((maxOrderAmount - minOrderAmount) * missingSpend) /
totalRemainingExcess;
}
}
function getTotalExcess(Trade memory trade) internal returns (uint256 totalExcess){
for (uint8 index = 0; index < trade.orders.length; index++) {
totalExcess +=
trade.orders[index].maxSourceAmount -
trade.orders[index].minSourceAmount;
}
return totalExcess;
}
function minimumRateFailed(address sourceToken, address destinationToken, uint256 sourceAmount, uint256 destinationAmount, uint256 minimumExchangeRate) internal returns (bool failed) {
uint256 sourceDecimals = sourceToken == Utils.eth_address()
? 18
: Utils.getDecimals(sourceToken);
uint256 destinationDecimals = destinationToken == Utils.eth_address()
? 18
: Utils.getDecimals(destinationToken);
uint256 rateGot = Utils.calcRateFromQty(
sourceAmount,
destinationAmount,
sourceDecimals,
destinationDecimals
);
return rateGot < minimumExchangeRate;
}
function takeFee(TokenBalanceLibrary.TokenBalance[20] memory balances, address token, address payable partnerContract, uint256 amountTraded) internal returns (uint256 feeAmount) {
Partner partner = Partner(partnerContract);
uint256 feePercentage = partner.getTotalFeePercentage();
feeAmount = calculateFee(amountTraded, feePercentage);
transferTokens(
balances,
TokenBalanceLibrary.findToken(balances, token),
partnerContract,
feeAmount
);
TokenBalanceLibrary.removeBalance(
balances,
TokenBalanceLibrary.findToken(balances, token),
feeAmount
);
return feeAmount;
}
function transferFromSenderDifference(TokenBalanceLibrary.TokenBalance[20] memory balances, address token, uint256 sourceAmount) internal returns (bool) {
if (token == Utils.eth_address()) {
if (sourceAmount > balances[0].balance) {
return false;
}
return true;
}
uint256 tokenIndex = TokenBalanceLibrary.findToken(balances, token);
if (sourceAmount > balances[tokenIndex].balance) {
bool success;
(success,) = address(tokenTransferProxy).call(
abi.encodeWithSignature(
"transferFrom(address,address,address,uint256)",
token,
msg.sender,
address(this),
sourceAmount - balances[tokenIndex].balance
)
);
if (success) {
balances[tokenIndex].balance = sourceAmount;
return true;
}
return false;
}
return true;
}
function transferAllTokensToUser(TokenBalanceLibrary.TokenBalance[20] memory balances) internal {
for (
uint256 balanceIndex = 0;
balanceIndex < balances.length;
balanceIndex++
) {
if (
balanceIndex != 0 &&
balances[balanceIndex].tokenAddress == address(0x0)
) {
return;
}
transferTokens(
balances,
balanceIndex,
msg.sender,
balances[balanceIndex].balance
);
}
}
function transferTokens(TokenBalanceLibrary.TokenBalance[20] memory balances, uint256 tokenIndex, address payable destination, uint256 tokenAmount) internal {
if (tokenAmount > 0) {
if (balances[tokenIndex].tokenAddress == Utils.eth_address()) {
destination.transfer(tokenAmount);
} else {
require(
ERC20SafeTransfer.safeTransfer(
balances[tokenIndex].tokenAddress,
destination,
tokenAmount
),
"Transfer failed"
);
}
}
}
// @notice Calculates the fee amount given a fee percentage and amount
// @param amount the amount to calculate the fee based on
// @param fee the percentage, out of 1 eth (e.g. 0.01 ETH would be 1%)
function calculateFee(uint256 amount, uint256 fee) internal pure returns (uint256){
return SafeMath.div(SafeMath.mul(amount, fee), 1 ether);
}
/*
* Payable fallback function
*/
/// @notice payable fallback to allow handler or exchange contracts to return ether
/// @dev only accounts containing code (ie. contracts) can send ether to contract
function() external payable whenNotPaused {
// Check in here that the sender is a contract! (to stop accidents)
uint256 size;
address sender = msg.sender;
assembly {
size := extcodesize(sender)
}
if (size == 0) {
revert("EOA cannot send ether to primary fallback");
}
}
}
// this line is added to create a gist. Empty file is not allowed.
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "signer",
"type": "address"
}
],
"name": "removeSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "tokenTransferProxy",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"components": [
{
"components": [
{
"name": "sourceToken",
"type": "address"
},
{
"name": "destinationToken",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
},
{
"name": "isSourceAmount",
"type": "bool"
},
{
"components": [
{
"name": "exchangeHandler",
"type": "address"
},
{
"name": "encodedPayload",
"type": "bytes"
},
{
"name": "minSourceAmount",
"type": "uint256"
},
{
"name": "maxSourceAmount",
"type": "uint256"
}
],
"name": "orders",
"type": "tuple[]"
}
],
"name": "trades",
"type": "tuple[]"
},
{
"name": "minimumExchangeRate",
"type": "uint256"
},
{
"name": "minimumDestinationAmount",
"type": "uint256"
},
{
"name": "sourceAmount",
"type": "uint256"
},
{
"name": "tradeToTakeFeeFrom",
"type": "uint256"
},
{
"name": "takeFeeFromSource",
"type": "bool"
},
{
"name": "redirectAddress",
"type": "address"
},
{
"name": "required",
"type": "bool"
}
],
"name": "swaps",
"type": "tuple[]"
},
{
"name": "partnerContract",
"type": "address"
},
{
"name": "expirationBlock",
"type": "uint256"
},
{
"name": "id",
"type": "bytes32"
},
{
"name": "maxGasPrice",
"type": "uint256"
},
{
"name": "v",
"type": "uint8"
},
{
"name": "r",
"type": "bytes32"
},
{
"name": "s",
"type": "bytes32"
}
],
"name": "swaps",
"type": "tuple"
}
],
"name": "performSwapCollection",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "unpause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "paused",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "signers",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "pause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newSigner",
"type": "address"
}
],
"name": "addSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_tokenTransferProxy",
"type": "address"
},
{
"name": "_signer",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"name": "partnerContract",
"type": "address"
},
{
"indexed": true,
"name": "user",
"type": "address"
}
],
"name": "LogSwapCollection",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"name": "sourceAsset",
"type": "address"
},
{
"indexed": false,
"name": "destinationAsset",
"type": "address"
},
{
"indexed": false,
"name": "sourceAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "destinationAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "feeAsset",
"type": "address"
},
{
"indexed": false,
"name": "feeAmount",
"type": "uint256"
}
],
"name": "LogSwap",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"constructor": {
"params": {
"_signer": "the suggester's address that signs the payloads. More can be added with add/removeSigner functions"
}
},
"pause()": {
"details": "called by the owner to pause, triggers stopped state\r"
},
"paused()": {
"return": "true if the contract is paused, false otherwise.\r"
},
"performSwapCollection((((address,address,uint256,bool,(address,bytes,uint256,uint256)[])[],uint256,uint256,uint256,uint256,bool,address,bool)[],address,uint256,bytes32,uint256,uint8,bytes32,bytes32))": {
"params": {
"swaps": "The struct that defines the collection of swaps to perform"
}
},
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"unpause()": {
"details": "called by the owner to unpause, returns to normal state\r"
},
"withdrawETH(uint256)": {
"params": {
"_amount": "The amount of ether that the caller wants to withdraw"
}
},
"withdrawToken(address,uint256)": {
"return": "bool value indicating whether the transfer was successful"
}
},
"title": "The primary contract for aggregator"
},
"userdoc": {
"methods": {
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/AggregatorEntry.sol": "AggregatorEntry"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/AggregatorEntry.sol": {
"keccak256": "0x8ed2e244c18d6107046189858cf39fada5ef9b917f56f4049d0442b6f0886dcf",
"urls": [
"bzzr://b4223da8890f933ad0aae89602a15f1705ac5ff7cdf339563aa5118da81847a4"
]
},
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Partner.sol": {
"keccak256": "0xf2b7173c4b6bd2c3c6b3b0f0fa56bdce9db13e0996074f1d3abadee8b419bace",
"urls": [
"bzzr://4b5d11c9ff92107ecea8b5ecb530940df23a8b7fc2fab141299cc9a717030a55"
]
},
"contracts/aggregator/lib/PartnerRegistry.sol": {
"keccak256": "0x4dc6bbee07663a2ad09e4f805ad49a0c891de7cf68f78f3e6cf8331c3a34e1ba",
"urls": [
"bzzr://17f106cfa0e9cb6823cf8063450877da6bbf45e847775da814eb60e3ecf45d6b"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TokenBalanceLibrary.sol": {
"keccak256": "0x3001426047497ae457587c51fb74def6ae024ae7fcf0412909b604e4bab2c697",
"urls": [
"bzzr://e48c885ba1bb387d481b1932ccd1161fa4ccc4960bee7bd42ed9bd124ab3361c"
]
},
"contracts/aggregator/lib/TokenTransferProxy.sol": {
"keccak256": "0x6cc92eb9b75096ed98bd151e206a5702831d45d70b99a06688d690c71a219190",
"urls": [
"bzzr://5d6db058a18b2b74505fae135e056daa102a1c76d15db3c97004cc946ec0a8a3"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"freeUpTo(uint256)": "6366b936"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "freeUpTo",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "freeUpTo",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/AggregatorEntry.sol": "IGST2"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/AggregatorEntry.sol": {
"keccak256": "0x2831649d6cc400f671cafd08c9f0507220712ef0fb7421578b532e3fbcd56969",
"urls": [
"bzzr://8b007fcc8bd7e6bfb5e720d35a5f0c38f88a53662b0adaac7ba0403756d12096"
]
},
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Partner.sol": {
"keccak256": "0xf2b7173c4b6bd2c3c6b3b0f0fa56bdce9db13e0996074f1d3abadee8b419bace",
"urls": [
"bzzr://4b5d11c9ff92107ecea8b5ecb530940df23a8b7fc2fab141299cc9a717030a55"
]
},
"contracts/aggregator/lib/PartnerRegistry.sol": {
"keccak256": "0x4dc6bbee07663a2ad09e4f805ad49a0c891de7cf68f78f3e6cf8331c3a34e1ba",
"urls": [
"bzzr://17f106cfa0e9cb6823cf8063450877da6bbf45e847775da814eb60e3ecf45d6b"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TokenBalanceLibrary.sol": {
"keccak256": "0x3001426047497ae457587c51fb74def6ae024ae7fcf0412909b604e4bab2c697",
"urls": [
"bzzr://e48c885ba1bb387d481b1932ccd1161fa4ccc4960bee7bd42ed9bd124ab3361c"
]
},
"contracts/aggregator/lib/TokenTransferProxy.sol": {
"keccak256": "0x6cc92eb9b75096ed98bd151e206a5702831d45d70b99a06688d690c71a219190",
"urls": [
"bzzr://5d6db058a18b2b74505fae135e056daa102a1c76d15db3c97004cc946ec0a8a3"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "608060405260008060146101000a81548160ff0219169083151502179055506404a817c8006003553480156200003457600080fd5b5060405160408062003bdc83398101806040526200005691908101906200014d565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050620001c2565b60006200014582516200018e565b905092915050565b600080604083850312156200016157600080fd5b6000620001718582860162000137565b9250506020620001848582860162000137565b9150509250929050565b60006200019b82620001a2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b613a0a80620001d26000396000f3fe6080604052600436106100f35760003560e01c80638456cb591161008a578063c571c67e11610059578063c571c67e14610370578063eb12d61e14610399578063f14210a6146103c2578063f2fde38b146103eb576100f3565b80638456cb59146102c65780638af8d4c3146102dd5780638da5cb5b146103085780639e281a9814610333576100f3565b80635c975abb116100c65780635c975abb1461021c578063715018a614610247578063736c0d5b1461025e5780637822b9ae1461029b576100f3565b80630e316ab7146101955780630eefdbad146101be57806311a861a7146101e95780633f4ba83a14610205575b600060149054906101000a900460ff1615610143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a906135fc565b60405180910390fd5b600080339050803b91506000821415610191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101889061353c565b60405180910390fd5b5050005b3480156101a157600080fd5b506101bc60048036036101b79190810190612907565b610414565b005b3480156101ca57600080fd5b506101d36104c8565b6040516101e091906134e1565b60405180910390f35b61020360048036036101fe9190810190612995565b6104ee565b005b34801561021157600080fd5b5061021a610858565b005b34801561022857600080fd5b50610231610948565b60405161023e919061341a565b60405180910390f35b34801561025357600080fd5b5061025c61095e565b005b34801561026a57600080fd5b5061028560048036036102809190810190612907565b610a5e565b604051610292919061341a565b60405180910390f35b3480156102a757600080fd5b506102b0610a7e565b6040516102bd919061365c565b60405180910390f35b3480156102d257600080fd5b506102db610a84565b005b3480156102e957600080fd5b506102f2610b76565b6040516102ff91906134c6565b60405180910390f35b34801561031457600080fd5b5061031d610b89565b60405161032a91906132c8565b60405180910390f35b34801561033f57600080fd5b5061035a60048036036103559190810190612959565b610bae565b604051610367919061341a565b60405180910390f35b34801561037c57600080fd5b50610397600480360361039291908101906129d6565b610c3d565b005b3480156103a557600080fd5b506103c060048036036103bb9190810190612907565b610ca0565b005b3480156103ce57600080fd5b506103e960048036036103e491908101906129d6565b610d54565b005b3480156103f757600080fd5b50610412600480360361040d9190810190612930565b610e18565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046d57600080fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060149054906101000a900460ff161561053e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610535906135fc565b60405180910390fd5b8043816040015111610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c9061363c565b60405180910390fd5b81600081600001518260200151836040015184606001518560800151336040516020016105b7969594939291906133b2565b604051602081830303815290604052805190602001209050600260006001836040516020016105e6919061328d565b604051602081830303815290604052805190602001208560a001518660c001518760e00151604051600081526020016040526040516106289493929190613435565b6020604051602081039080840390855afa15801561064a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d29061355c565b60405180910390fd5b8380608001513a1115610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a9061357c565b60405180910390fd5b60008090506003543a10610735575a90505b61073d612385565b6040518060400160405280610750610e7d565b73ffffffffffffffffffffffffffffffffffffffff168152602001348152508160006014811061077c57fe5b602002018190525060008090505b8760000151518110156107cf576107c28860600151896000015183815181106107af57fe5b6020026020010151848b60200151610e85565b808060010191505061078a565b503373ffffffffffffffffffffffffffffffffffffffff16876020015173ffffffffffffffffffffffffffffffffffffffff1688606001517fc3dcfccc2c1c6fe2a908d1825ba2e62b5b2d61a6b9c500791f75cdc538bdeb9d60405160405180910390a461083c816113be565b600082111561084f5761084e8261145b565b5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b157600080fd5b600060149054906101000a900460ff16610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f7906134fc565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b60008060149054906101000a900460ff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109b757600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026020528060005260406000206000915054906101000a900460ff1681565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610add57600080fd5b600060149054906101000a900460ff1615610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906135fc565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b6eb3f879cb30fe243b4dfee438691c0481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c0957600080fd5b610c35836000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611534565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9657600080fd5b8060038190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cf957600080fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dad57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e14573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7157600080fd5b610e7a81611683565b50565b600080905090565b610eb0828460000151600081518110610e9a57fe5b602002602001015160000151856060015161177b565b610efe578260e0015115610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef0906135bc565b60405180910390fd5b6113b8565b60008090506000809050600080905060008090505b8660000151518110156110ff57866080015181148015610f3457508660a001515b15610f7657610f738688600001518381518110610f4d57fe5b6020026020010151600001518760008514610f685786610f6e565b8a606001515b61198e565b91505b6000610fee88600001518381518110610f8b57fe5b602002602001015188610fe960008614610fa55787610fab565b8b606001515b8b610fd18d8f600001518a81518110610fc057fe5b602002602001015160000151611a58565b60148110610fdb57fe5b602002015160200151611b6e565b611b87565b80955081925050508760000151828151811061100657fe5b60200260200101516060015115801561103957508760000151828151811061102a57fe5b60200260200101516040015184105b1561108d578760e0015115611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a9061361c565b60405180910390fd5b50505050506113b8565b60008214156110a857809450600083146110a75782850194505b5b8760800151821480156110bd57508760a00151155b156110f1576110e987896000015184815181106110d657fe5b602002602001015160200151888761198e565b925082840393505b508080600101915050610f13565b50867f7c396f87ca37e7dab636d7ffad74fe2ef4729fda118a0a2c105bf74f4890437f876000015160008151811061113357fe5b602002602001015160000151886000015160018a6000015151038151811061115757fe5b60200260200101516020015186868b60a00151611193578b600001518c608001518151811061118257fe5b6020026020010151602001516111b4565b8b600001518c60800151815181106111a757fe5b6020026020010151600001515b876040516111c796959493929190613328565b60405180910390a28560400151821015611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906135dc565b60405180910390fd5b61126a866000015160008151811061122a57fe5b60200260200101516000015187600001516001896000015151038151811061124e57fe5b6020026020010151602001518860600151858a60200151611d11565b156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061359c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168660c0015173ffffffffffffffffffffffffffffffffffffffff161415801561131b5750600073ffffffffffffffffffffffffffffffffffffffff168660c0015173ffffffffffffffffffffffffffffffffffffffff1614155b156113b457600061134f86886000015160018a6000015151038151811061133e57fe5b602002602001015160200151611a58565b905060006113718488846014811061136357fe5b602002015160200151611dd1565b905061138387838a60c0015184611dea565b6113b187896000015160018b6000015151038151811061139f57fe5b60200260200101516020015183611ef4565b50505b5050505b50505050565b60008090505b6014811015611456576000811415801561141e5750600073ffffffffffffffffffffffffffffffffffffffff168282601481106113fd57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff16145b156114295750611458565b61144982823385856014811061143b57fe5b602002015160200151611dea565b80806001019150506113c4565b505b50565b60005a905060008183039050600061149161a0aa61374a84018161147b57fe5b04611b6c616c3e86038161148b57fe5b04611dd1565b90506eb3f879cb30fe243b4dfee438691c0473ffffffffffffffffffffffffffffffffffffffff16636366b936826040518263ffffffff1660e01b81526004016114db919061365c565b602060405180830381600087803b1580156114f557600080fd5b505af1158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152d91908101906129ff565b5050505050565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051602401611560929190613389565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115ea9190613276565b6000604051808303816000865af19150503d8060008114611627576040519150601f19603f3d011682016040523d82523d6000602084013e61162c565b606091505b50508091505080611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116699061351c565b60405180910390fd5b61167a611f13565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116bd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611785610e7d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117e757836000601481106117c557fe5b6020020151602001518211156117de5760009050611987565b60019050611987565b60006117f38585611a58565b905084816014811061180157fe5b602002015160200151831115611981576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685333089866014811061185b57fe5b602002015160200151880360405160240161187994939291906132e3565b6040516020818303038152906040527f15dacbea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119039190613276565b6000604051808303816000865af19150503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b5050809150508015611976578386836014811061195e57fe5b60200201516020018181525050600192505050611987565b600092505050611987565b60019150505b9392505050565b60008083905060008173ffffffffffffffffffffffffffffffffffffffff1663064367bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119dc57600080fd5b505afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a1491908101906129ff565b9050611a208482611f44565b9250611a3787611a308989611a58565b8786611dea565b611a4b87611a458989611a58565b85611f69565b8292505050949350505050565b600080600090505b6014811015611b66578273ffffffffffffffffffffffffffffffffffffffff16848260148110611a8c57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff161415611aba5780915050611b68565b60008114158015611b0b5750600073ffffffffffffffffffffffffffffffffffffffff16848260148110611aea57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff16145b15611b595760405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250848260148110611b4857fe5b602002018190525080915050611b68565b8080600101915050611a60565b505b92915050565b6000818310611b7d5781611b7f565b825b905092915050565b6000806000809050600080905060008090506000611ba489611f8e565b905060008090505b896080015151811015611ce65787612710888a03021015611bcc57611ce6565b89606001518015611be05750896040015185145b15611bea57611ce6565b6000611c2e8b608001518381518110611bff57fe5b6020026020010151604001518c608001518481518110611c1b57fe5b6020026020010151606001518587611fff565b9050611c5e8b608001518381518110611c4357fe5b6020026020010151898b038d606001518e600001518e612034565b80965081975050508a608001518281518110611c7657fe5b6020026020010151604001518b608001518381518110611c9257fe5b60200260200101516060015103830392508a608001518281518110611cb357fe5b602002602001015160400151861015611cce57858103840193505b85880197508487019650508080600101915050611bac565b50611cf6888a60200151876121dc565b611d05888a6000015188611ef4565b50505050935093915050565b600080611d1c610e7d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611d5c57611d57876121fb565b611d5f565b60125b90506000611d6b610e7d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611dab57611da6876121fb565b611dae565b60125b90506000611dbe8787858561225d565b9050848110935050505095945050505050565b6000818310611de05781611de2565b825b905092915050565b6000811115611eee57611dfb610e7d565b73ffffffffffffffffffffffffffffffffffffffff16848460148110611e1d57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff161415611e8e578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e88573d6000803e3d6000fd5b50611eed565b611ead848460148110611e9d57fe5b6020020151600001518383611534565b611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061351c565b60405180910390fd5b5b5b50505050565b6000611f008484611a58565b9050611f0d848284611f69565b50505050565b60003d60008114611f2b5760208114611f3457600080fd5b60019150611f40565b60206000803e60005191505b5090565b6000611f61611f538484612300565b670de0b6b3a764000061233a565b905092915050565b80838360148110611f7657fe5b60200201516020018181510391508181525050505050565b600080600090505b8260800151518160ff161015611ff65782608001518160ff1681518110611fb957fe5b60200260200101516040015183608001518260ff1681518110611fd857fe5b60200260200101516060015103820191508080600101915050611f96565b50809050919050565b60008082148061200e57508385145b1561201b5784905061202c565b8282868603028161202857fe5b0490505b949350505050565b60008061203f610e7d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561211857866000015173ffffffffffffffffffffffffffffffffffffffff16630345c2a6878960200151898a8a6040518663ffffffff1660e01b81526004016120ba949392919061347a565b60408051808303818588803b1580156120d257600080fd5b505af11580156120e6573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525061210b9190810190612a28565b80925081935050506121d2565b612131836121268587611a58565b896000015189611dea565b866000015173ffffffffffffffffffffffffffffffffffffffff16630345c2a688602001518889896040518563ffffffff1660e01b8152600401612178949392919061347a565b6040805180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c99190810190612a28565b80925081935050505b9550959350505050565b60006121e88484611a58565b90506121f5848284612360565b50505050565b60008060405161220a906132b3565b60405180910390209050604051818152600460208083838560008a5af1806000811461223d57600181146122465761224b565b6000965061224b565b845196505b50600484016040525050505050919050565b60006b204fce5e3e2502611000000085111561227857600080fd5b6b204fce5e3e2502611000000084111561229157600080fd5b8282106122ca57601283830311156122a857600080fd5b84838303600a0a02670de0b6b3a76400008502816122c257fe5b0490506122f8565b601282840311156122da57600080fd5b84828403600a0a670de0b6b3a7640000860202816122f457fe5b0490505b949350505050565b6000808314156123135760009050612334565b600082840290508284828161232457fe5b041461232f57600080fd5b809150505b92915050565b600080821161234857600080fd5b600082848161235357fe5b0490508091505092915050565b8083836014811061236d57fe5b60200201516020018181510191508181525050505050565b6040518061050001604052806014905b61239d6123b3565b8152602001906001900390816123955790505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b60006123ef82356138ba565b905092915050565b600061240382356138cc565b905092915050565b600082601f83011261241c57600080fd5b813561242f61242a826136a4565b613677565b9150818183526020840193506020810190508360005b83811015612475578135860161245b88826125e3565b845260208401935060208301925050600181019050612445565b5050505092915050565b600082601f83011261249057600080fd5b81356124a361249e826136cc565b613677565b9150818183526020840193506020810190508360005b838110156124e957813586016124cf888261274d565b8452602084019350602083019250506001810190506124b9565b5050505092915050565b600082601f83011261250457600080fd5b8135612517612512826136f4565b613677565b9150818183526020840193506020810190508360005b8381101561255d5781358601612543888261282b565b84526020840193506020830192505060018101905061252d565b5050505092915050565b600061257382356138de565b905092915050565b600061258782356138ea565b905092915050565b600082601f8301126125a057600080fd5b81356125b36125ae8261371c565b613677565b915080825260208301602083018583830111156125cf57600080fd5b6125da838284613973565b50505092915050565b6000608082840312156125f557600080fd5b6125ff6080613677565b9050600061260f848285016123f7565b600083015250602082013567ffffffffffffffff81111561262f57600080fd5b61263b8482850161258f565b602083015250604061264f848285016128cb565b6040830152506060612663848285016128cb565b60608301525092915050565b6000610100828403121561268257600080fd5b61268d610100613677565b9050600082013567ffffffffffffffff8111156126a957600080fd5b6126b58482850161247f565b60008301525060206126c9848285016123f7565b60208301525060406126dd848285016128cb565b60408301525060606126f18482850161257b565b6060830152506080612705848285016128cb565b60808301525060a0612719848285016128f3565b60a08301525060c061272d8482850161257b565b60c08301525060e06127418482850161257b565b60e08301525092915050565b6000610100828403121561276057600080fd5b61276b610100613677565b9050600082013567ffffffffffffffff81111561278757600080fd5b612793848285016124f3565b60008301525060206127a7848285016128cb565b60208301525060406127bb848285016128cb565b60408301525060606127cf848285016128cb565b60608301525060806127e3848285016128cb565b60808301525060a06127f784828501612567565b60a08301525060c061280b848285016123f7565b60c08301525060e061281f84828501612567565b60e08301525092915050565b600060a0828403121561283d57600080fd5b61284760a0613677565b90506000612857848285016123e3565b600083015250602061286b848285016123e3565b602083015250604061287f848285016128cb565b604083015250606061289384828501612567565b606083015250608082013567ffffffffffffffff8111156128b357600080fd5b6128bf8482850161240b565b60808301525092915050565b60006128d78235613914565b905092915050565b60006128eb8251613914565b905092915050565b60006128ff823561391e565b905092915050565b60006020828403121561291957600080fd5b6000612927848285016123e3565b91505092915050565b60006020828403121561294257600080fd5b6000612950848285016123f7565b91505092915050565b6000806040838503121561296c57600080fd5b600061297a858286016123e3565b925050602061298b858286016128cb565b9150509250929050565b6000602082840312156129a757600080fd5b600082013567ffffffffffffffff8111156129c157600080fd5b6129cd8482850161266f565b91505092915050565b6000602082840312156129e857600080fd5b60006129f6848285016128cb565b91505092915050565b600060208284031215612a1157600080fd5b6000612a1f848285016128df565b91505092915050565b60008060408385031215612a3b57600080fd5b6000612a49858286016128df565b9250506020612a5a858286016128df565b9150509250929050565b6000612a7083836130c0565b905092915050565b6000612a848383613123565b905092915050565b6000612a9883836131d3565b905092915050565b612aa98161385b565b82525050565b612ab88161385b565b82525050565b612ac781613849565b82525050565b612ad681613849565b82525050565b6000612ae78261376f565b612af181856137cd565b935083602082028501612b0385613748565b60005b84811015612b3c578383038852612b1e838351612a64565b9250612b29826137a6565b9150602088019750600181019050612b06565b508196508694505050505092915050565b6000612b588261377a565b612b6281856137de565b935083602082028501612b7485613755565b60005b84811015612bad578383038852612b8f838351612a78565b9250612b9a826137b3565b9150602088019750600181019050612b77565b508196508694505050505092915050565b6000612bc982613785565b612bd381856137ef565b935083602082028501612be585613762565b60005b84811015612c1e578383038852612c00838351612a8c565b9250612c0b826137c0565b9150602088019750600181019050612be8565b508196508694505050505092915050565b612c388161386d565b82525050565b612c478161386d565b82525050565b612c5681613879565b82525050565b612c6d612c6882613879565b6139b5565b82525050565b6000612c7e8261379b565b612c888185613822565b9350612c98818560208601613982565b80840191505092915050565b6000612caf82613790565b612cb98185613800565b9350612cc9818560208601613982565b612cd2816139bf565b840191505092915050565b6000612ce882613790565b612cf28185613811565b9350612d02818560208601613982565b612d0b816139bf565b840191505092915050565b612d1f8161392b565b82525050565b612d2e8161394f565b82525050565b6000612d4160148361382d565b91507f436f6e7472616374206e6f74207061757365642e0000000000000000000000006000830152602082019050919050565b6000612d81601c8361383e565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612dc1600f8361382d565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b6000612e01600a8361383e565b91507f646563696d616c732829000000000000000000000000000000000000000000006000830152600a82019050919050565b6000612e4160298361382d565b91507f454f412063616e6e6f742073656e6420657468657220746f207072696d61727960008301527f2066616c6c6261636b00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ea760118361382d565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000612ee760128361382d565b91507f47617320707269636520746f6f206869676800000000000000000000000000006000830152602082019050919050565b6000612f27601d8361382d565b91507f4d696e696d756d2065786368616e67652072617465206e6f74206d65740000006000830152602082019050919050565b6000612f67601d8361382d565b91507f4661696c656420746f2067657420746f6b656e7320666f7220737761700000006000830152602082019050919050565b6000612fa760268361382d565b91507f476f74206c657373207468616e206d696e696d756d44657374696e6174696f6e60008301527f416d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061300d60138361382d565b91507f436f6e7472616374206973207061757365642e000000000000000000000000006000830152602082019050919050565b600061304d601d8361382d565b91507f4e6f7420656e6f7567682064657374696e6174696f6e20616d6f756e740000006000830152602082019050919050565b600061308d60078361382d565b91507f45787069726564000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006080830160008301516130d86000860182612aa0565b50602083015184820360208601526130f08282612ca4565b91505060408301516131056040860182613249565b5060608301516131186060860182613249565b508091505092915050565b60006101008301600083015184820360008601526131418282612bbe565b91505060208301516131566020860182613249565b5060408301516131696040860182613249565b50606083015161317c6060860182613249565b50608083015161318f6080860182613249565b5060a08301516131a260a0860182612c2f565b5060c08301516131b560c0860182612aa0565b5060e08301516131c860e0860182612c2f565b508091505092915050565b600060a0830160008301516131eb6000860182612abe565b5060208301516131fe6020860182612abe565b5060408301516132116040860182613249565b5060608301516132246060860182612c2f565b506080830151848203608086015261323c8282612adc565b9150508091505092915050565b613252816138a3565b82525050565b613261816138a3565b82525050565b613270816138ad565b82525050565b60006132828284612c73565b915081905092915050565b600061329882612d74565b91506132a48284612c5c565b60208201915081905092915050565b60006132be82612df4565b9150819050919050565b60006020820190506132dd6000830184612aaf565b92915050565b60006080820190506132f86000830187612acd565b6133056020830186612aaf565b6133126040830185612aaf565b61331f6060830184613258565b95945050505050565b600060c08201905061333d6000830189612acd565b61334a6020830188612acd565b6133576040830187613258565b6133646060830186613258565b6133716080830185612acd565b61337e60a0830184613258565b979650505050505050565b600060408201905061339e6000830185612acd565b6133ab6020830184613258565b9392505050565b600060c08201905081810360008301526133cc8189612b4d565b90506133db6020830188612aaf565b6133e86040830187613258565b6133f56060830186612c4d565b6134026080830185613258565b61340f60a0830184612aaf565b979650505050505050565b600060208201905061342f6000830184612c3e565b92915050565b600060808201905061344a6000830187612c4d565b6134576020830186613267565b6134646040830185612c4d565b6134716060830184612c4d565b95945050505050565b600060808201905081810360008301526134948187612cdd565b90506134a36020830186613258565b6134b06040830185613258565b6134bd6060830184612c3e565b95945050505050565b60006020820190506134db6000830184612d16565b92915050565b60006020820190506134f66000830184612d25565b92915050565b6000602082019050818103600083015261351581612d34565b9050919050565b6000602082019050818103600083015261353581612db4565b9050919050565b6000602082019050818103600083015261355581612e34565b9050919050565b6000602082019050818103600083015261357581612e9a565b9050919050565b6000602082019050818103600083015261359581612eda565b9050919050565b600060208201905081810360008301526135b581612f1a565b9050919050565b600060208201905081810360008301526135d581612f5a565b9050919050565b600060208201905081810360008301526135f581612f9a565b9050919050565b6000602082019050818103600083015261361581613000565b9050919050565b6000602082019050818103600083015261363581613040565b9050919050565b6000602082019050818103600083015261365581613080565b9050919050565b60006020820190506136716000830184613258565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561369a57600080fd5b8060405250919050565b600067ffffffffffffffff8211156136bb57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156136e357600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561370b57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561373357600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061385482613883565b9050919050565b600061386682613883565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006138c5826138f4565b9050919050565b60006138d7826138f4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139368261393d565b9050919050565b600061394882613883565b9050919050565b600061395a82613961565b9050919050565b600061396c82613883565b9050919050565b82818337600083830152505050565b60005b838110156139a0578082015181840152602081019050613985565b838111156139af576000848401525b50505050565b6000819050919050565b6000601f19601f830116905091905056fea265627a7a72305820f9812b51ef221eddfdba64e552942c5796406b051efb3593c09e0fe5a532021f6c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH5 0x4A817C800 PUSH1 0x3 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x40 DUP1 PUSH3 0x3BDC DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x56 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x14D JUMP JUMPDEST CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP POP PUSH3 0x1C2 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x145 DUP3 MLOAD PUSH3 0x18E JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x171 DUP6 DUP3 DUP7 ADD PUSH3 0x137 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH3 0x184 DUP6 DUP3 DUP7 ADD PUSH3 0x137 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x19B DUP3 PUSH3 0x1A2 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3A0A DUP1 PUSH3 0x1D2 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xF3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8456CB59 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xC571C67E GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC571C67E EQ PUSH2 0x370 JUMPI DUP1 PUSH4 0xEB12D61E EQ PUSH2 0x399 JUMPI DUP1 PUSH4 0xF14210A6 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3EB JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x2C6 JUMPI DUP1 PUSH4 0x8AF8D4C3 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x308 JUMPI DUP1 PUSH4 0x9E281A98 EQ PUSH2 0x333 JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0x5C975ABB GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x247 JUMPI DUP1 PUSH4 0x736C0D5B EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0x7822B9AE EQ PUSH2 0x29B JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0xE316AB7 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0xEEFDBAD EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x11A861A7 EQ PUSH2 0x1E9 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x205 JUMPI JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x143 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLER SWAP1 POP DUP1 EXTCODESIZE SWAP2 POP PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0x191 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x188 SWAP1 PUSH2 0x353C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1B7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D3 PUSH2 0x4C8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E0 SWAP2 SWAP1 PUSH2 0x34E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x203 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1FE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2995 JUMP JUMPDEST PUSH2 0x4EE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x858 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x948 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25C PUSH2 0x95E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x285 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x280 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0xA5E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x292 SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B0 PUSH2 0xA7E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2BD SWAP2 SWAP1 PUSH2 0x365C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DB PUSH2 0xA84 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F2 PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2FF SWAP2 SWAP1 PUSH2 0x34C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x314 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31D PUSH2 0xB89 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x32A SWAP2 SWAP1 PUSH2 0x32C8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x35A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x355 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2959 JUMP JUMPDEST PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x367 SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x397 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x392 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29D6 JUMP JUMPDEST PUSH2 0xC3D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3C0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0xCA0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x3E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29D6 JUMP JUMPDEST PUSH2 0xD54 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x412 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x40D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0xE18 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x53E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 NUMBER DUP2 PUSH1 0x40 ADD MLOAD GT PUSH2 0x585 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x57C SWAP1 PUSH2 0x363C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP5 PUSH1 0x60 ADD MLOAD DUP6 PUSH1 0x80 ADD MLOAD CALLER PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x5B7 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x33B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x2 PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x5E6 SWAP2 SWAP1 PUSH2 0x328D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP6 PUSH1 0xA0 ADD MLOAD DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xE0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x628 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3435 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x64A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x6DB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6D2 SWAP1 PUSH2 0x355C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 DUP1 PUSH1 0x80 ADD MLOAD GASPRICE GT ISZERO PUSH2 0x723 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x71A SWAP1 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x3 SLOAD GASPRICE LT PUSH2 0x735 JUMPI GAS SWAP1 POP JUMPDEST PUSH2 0x73D PUSH2 0x2385 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x750 PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLVALUE DUP2 MSTORE POP DUP2 PUSH1 0x0 PUSH1 0x14 DUP2 LT PUSH2 0x77C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP8 PUSH1 0x0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x7CF JUMPI PUSH2 0x7C2 DUP9 PUSH1 0x60 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x7AF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP12 PUSH1 0x20 ADD MLOAD PUSH2 0xE85 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x78A JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH1 0x60 ADD MLOAD PUSH32 0xC3DCFCCC2C1C6FE2A908D1825BA2E62B5B2D61A6B9C500791F75CDC538BDEB9D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x83C DUP2 PUSH2 0x13BE JUMP JUMPDEST PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x84F JUMPI PUSH2 0x84E DUP3 PUSH2 0x145B JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x900 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8F7 SWAP1 PUSH2 0x34FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0xA45F47FDEA8A1EFDD9029A5691C7F759C32B7C698632B563573E155625D16933 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xADD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB24 SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x9E87FAC88FF661F02D44F95383C817FECE4BCE600A3DAB7A54406878B965E752 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH15 0xB3F879CB30FE243B4DFEE438691C04 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC35 DUP4 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x1534 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xCF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xDAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE7A DUP2 PUSH2 0x1683 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xEB0 DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xE9A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x177B JUMP JUMPDEST PUSH2 0xEFE JUMPI DUP3 PUSH1 0xE0 ADD MLOAD ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEF0 SWAP1 PUSH2 0x35BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x13B8 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP7 PUSH1 0x0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x10FF JUMPI DUP7 PUSH1 0x80 ADD MLOAD DUP2 EQ DUP1 ISZERO PUSH2 0xF34 JUMPI POP DUP7 PUSH1 0xA0 ADD MLOAD JUMPDEST ISZERO PUSH2 0xF76 JUMPI PUSH2 0xF73 DUP7 DUP9 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF4D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x0 DUP6 EQ PUSH2 0xF68 JUMPI DUP7 PUSH2 0xF6E JUMP JUMPDEST DUP11 PUSH1 0x60 ADD MLOAD JUMPDEST PUSH2 0x198E JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xFEE DUP9 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF8B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP9 PUSH2 0xFE9 PUSH1 0x0 DUP7 EQ PUSH2 0xFA5 JUMPI DUP8 PUSH2 0xFAB JUMP JUMPDEST DUP12 PUSH1 0x60 ADD MLOAD JUMPDEST DUP12 PUSH2 0xFD1 DUP14 DUP16 PUSH1 0x0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH2 0xFC0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH2 0x1A58 JUMP JUMPDEST PUSH1 0x14 DUP2 LT PUSH2 0xFDB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1B87 JUMP JUMPDEST DUP1 SWAP6 POP DUP2 SWAP3 POP POP POP DUP8 PUSH1 0x0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1006 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD ISZERO DUP1 ISZERO PUSH2 0x1039 JUMPI POP DUP8 PUSH1 0x0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x102A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP5 LT JUMPDEST ISZERO PUSH2 0x108D JUMPI DUP8 PUSH1 0xE0 ADD MLOAD ISZERO PUSH2 0x1083 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x107A SWAP1 PUSH2 0x361C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x13B8 JUMP JUMPDEST PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0x10A8 JUMPI DUP1 SWAP5 POP PUSH1 0x0 DUP4 EQ PUSH2 0x10A7 JUMPI DUP3 DUP6 ADD SWAP5 POP JUMPDEST JUMPDEST DUP8 PUSH1 0x80 ADD MLOAD DUP3 EQ DUP1 ISZERO PUSH2 0x10BD JUMPI POP DUP8 PUSH1 0xA0 ADD MLOAD ISZERO JUMPDEST ISZERO PUSH2 0x10F1 JUMPI PUSH2 0x10E9 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x10D6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 DUP8 PUSH2 0x198E JUMP JUMPDEST SWAP3 POP DUP3 DUP5 SUB SWAP4 POP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xF13 JUMP JUMPDEST POP DUP7 PUSH32 0x7C396F87CA37E7DAB636D7FFAD74FE2EF4729FDA118A0A2C105BF74F4890437F DUP8 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1133 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP11 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1157 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP7 DUP7 DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1193 JUMPI DUP12 PUSH1 0x0 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP2 MLOAD DUP2 LT PUSH2 0x1182 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x11B4 JUMP JUMPDEST DUP12 PUSH1 0x0 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP2 MLOAD DUP2 LT PUSH2 0x11A7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD JUMPDEST DUP8 PUSH1 0x40 MLOAD PUSH2 0x11C7 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3328 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP6 PUSH1 0x40 ADD MLOAD DUP3 LT ISZERO PUSH2 0x1216 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120D SWAP1 PUSH2 0x35DC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x122A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x124E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD DUP6 DUP11 PUSH1 0x20 ADD MLOAD PUSH2 0x1D11 JUMP JUMPDEST ISZERO PUSH2 0x12AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x12A1 SWAP1 PUSH2 0x359C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x131B JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x13B4 JUMPI PUSH1 0x0 PUSH2 0x134F DUP7 DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP11 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x133E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1371 DUP5 DUP9 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1363 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1DD1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1383 DUP8 DUP4 DUP11 PUSH1 0xC0 ADD MLOAD DUP5 PUSH2 0x1DEA JUMP JUMPDEST PUSH2 0x13B1 DUP8 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP12 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x139F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP4 PUSH2 0x1EF4 JUMP JUMPDEST POP POP JUMPDEST POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x1456 JUMPI PUSH1 0x0 DUP2 EQ ISZERO DUP1 ISZERO PUSH2 0x141E JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x13FD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH2 0x1429 JUMPI POP PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x1449 DUP3 DUP3 CALLER DUP6 DUP6 PUSH1 0x14 DUP2 LT PUSH2 0x143B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1DEA JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x13C4 JUMP JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x0 DUP2 DUP4 SUB SWAP1 POP PUSH1 0x0 PUSH2 0x1491 PUSH2 0xA0AA PUSH2 0x374A DUP5 ADD DUP2 PUSH2 0x147B JUMPI INVALID JUMPDEST DIV PUSH2 0x1B6C PUSH2 0x6C3E DUP7 SUB DUP2 PUSH2 0x148B JUMPI INVALID JUMPDEST DIV PUSH2 0x1DD1 JUMP JUMPDEST SWAP1 POP PUSH15 0xB3F879CB30FE243B4DFEE438691C04 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6366B936 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x14DB SWAP2 SWAP1 PUSH2 0x365C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1509 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x152D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29FF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1560 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x15EA SWAP2 SWAP1 PUSH2 0x3276 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1627 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x162C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 PUSH2 0x1672 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1669 SWAP1 PUSH2 0x351C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x167A PUSH2 0x1F13 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x16BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1785 PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x17E7 JUMPI DUP4 PUSH1 0x0 PUSH1 0x14 DUP2 LT PUSH2 0x17C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP3 GT ISZERO PUSH2 0x17DE JUMPI PUSH1 0x0 SWAP1 POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17F3 DUP6 DUP6 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 PUSH1 0x14 DUP2 LT PUSH2 0x1801 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP4 GT ISZERO PUSH2 0x1981 JUMPI PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 CALLER ADDRESS DUP10 DUP7 PUSH1 0x14 DUP2 LT PUSH2 0x185B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 SUB PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1879 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x32E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0x15DACBEA00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x1903 SWAP2 SWAP1 PUSH2 0x3276 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1940 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 ISZERO PUSH2 0x1976 JUMPI DUP4 DUP7 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x195E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 SWAP1 POP PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x64367BB PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x19F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1A14 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29FF JUMP JUMPDEST SWAP1 POP PUSH2 0x1A20 DUP5 DUP3 PUSH2 0x1F44 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A37 DUP8 PUSH2 0x1A30 DUP10 DUP10 PUSH2 0x1A58 JUMP JUMPDEST DUP8 DUP7 PUSH2 0x1DEA JUMP JUMPDEST PUSH2 0x1A4B DUP8 PUSH2 0x1A45 DUP10 DUP10 PUSH2 0x1A58 JUMP JUMPDEST DUP6 PUSH2 0x1F69 JUMP JUMPDEST DUP3 SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x1B66 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1A8C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1ABA JUMPI DUP1 SWAP2 POP POP PUSH2 0x1B68 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ ISZERO DUP1 ISZERO PUSH2 0x1B0B JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1AEA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH2 0x1B59 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1B48 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP DUP1 SWAP2 POP POP PUSH2 0x1B68 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1A60 JUMP JUMPDEST POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B7D JUMPI DUP2 PUSH2 0x1B7F JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 PUSH2 0x1BA4 DUP10 PUSH2 0x1F8E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP10 PUSH1 0x80 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x1CE6 JUMPI DUP8 PUSH2 0x2710 DUP9 DUP11 SUB MUL LT ISZERO PUSH2 0x1BCC JUMPI PUSH2 0x1CE6 JUMP JUMPDEST DUP10 PUSH1 0x60 ADD MLOAD DUP1 ISZERO PUSH2 0x1BE0 JUMPI POP DUP10 PUSH1 0x40 ADD MLOAD DUP6 EQ JUMPDEST ISZERO PUSH2 0x1BEA JUMPI PUSH2 0x1CE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C2E DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1BFF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1C1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD DUP6 DUP8 PUSH2 0x1FFF JUMP JUMPDEST SWAP1 POP PUSH2 0x1C5E DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1C43 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP10 DUP12 SUB DUP14 PUSH1 0x60 ADD MLOAD DUP15 PUSH1 0x0 ADD MLOAD DUP15 PUSH2 0x2034 JUMP JUMPDEST DUP1 SWAP7 POP DUP2 SWAP8 POP POP POP DUP11 PUSH1 0x80 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1C76 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1C92 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD SUB DUP4 SUB SWAP3 POP DUP11 PUSH1 0x80 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1CB3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP7 LT ISZERO PUSH2 0x1CCE JUMPI DUP6 DUP2 SUB DUP5 ADD SWAP4 POP JUMPDEST DUP6 DUP9 ADD SWAP8 POP DUP5 DUP8 ADD SWAP7 POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1BAC JUMP JUMPDEST POP PUSH2 0x1CF6 DUP9 DUP11 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x21DC JUMP JUMPDEST PUSH2 0x1D05 DUP9 DUP11 PUSH1 0x0 ADD MLOAD DUP9 PUSH2 0x1EF4 JUMP JUMPDEST POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D1C PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1D5C JUMPI PUSH2 0x1D57 DUP8 PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1D5F JUMP JUMPDEST PUSH1 0x12 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D6B PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1DAB JUMPI PUSH2 0x1DA6 DUP8 PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1DAE JUMP JUMPDEST PUSH1 0x12 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1DBE DUP8 DUP8 DUP6 DUP6 PUSH2 0x225D JUMP JUMPDEST SWAP1 POP DUP5 DUP2 LT SWAP4 POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1DE0 JUMPI DUP2 PUSH2 0x1DE2 JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1DFB PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1E1D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E8E JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1E88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x1EED JUMP JUMPDEST PUSH2 0x1EAD DUP5 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1E9D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD DUP4 DUP4 PUSH2 0x1534 JUMP JUMPDEST PUSH2 0x1EEC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EE3 SWAP1 PUSH2 0x351C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1F00 DUP5 DUP5 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH2 0x1F0D DUP5 DUP3 DUP5 PUSH2 0x1F69 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 RETURNDATASIZE PUSH1 0x0 DUP2 EQ PUSH2 0x1F2B JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0x1F34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP2 POP PUSH2 0x1F40 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD SWAP2 POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1F61 PUSH2 0x1F53 DUP5 DUP5 PUSH2 0x2300 JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 PUSH2 0x233A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 DUP4 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x1F76 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MLOAD SUB SWAP2 POP DUP2 DUP2 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 PUSH1 0x80 ADD MLOAD MLOAD DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x1FF6 JUMPI DUP3 PUSH1 0x80 ADD MLOAD DUP2 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x1FB9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x1FD8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD SUB DUP3 ADD SWAP2 POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1F96 JUMP JUMPDEST POP DUP1 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 EQ DUP1 PUSH2 0x200E JUMPI POP DUP4 DUP6 EQ JUMPDEST ISZERO PUSH2 0x201B JUMPI DUP5 SWAP1 POP PUSH2 0x202C JUMP JUMPDEST DUP3 DUP3 DUP7 DUP7 SUB MUL DUP2 PUSH2 0x2028 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x203F PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2118 JUMPI DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x345C2A6 DUP8 DUP10 PUSH1 0x20 ADD MLOAD DUP10 DUP11 DUP11 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x20BA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x347A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20E6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x210B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2A28 JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP PUSH2 0x21D2 JUMP JUMPDEST PUSH2 0x2131 DUP4 PUSH2 0x2126 DUP6 DUP8 PUSH2 0x1A58 JUMP JUMPDEST DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH2 0x1DEA JUMP JUMPDEST DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x345C2A6 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP10 DUP10 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2178 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x347A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x21C9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2A28 JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP JUMPDEST SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x21E8 DUP5 DUP5 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH2 0x21F5 DUP5 DUP3 DUP5 PUSH2 0x2360 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH2 0x220A SWAP1 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 DUP1 DUP4 DUP4 DUP6 PUSH1 0x0 DUP11 GAS CALL DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x223D JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x2246 JUMPI PUSH2 0x224B JUMP JUMPDEST PUSH1 0x0 SWAP7 POP PUSH2 0x224B JUMP JUMPDEST DUP5 MLOAD SWAP7 POP JUMPDEST POP PUSH1 0x4 DUP5 ADD PUSH1 0x40 MSTORE POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH12 0x204FCE5E3E25026110000000 DUP6 GT ISZERO PUSH2 0x2278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH12 0x204FCE5E3E25026110000000 DUP5 GT ISZERO PUSH2 0x2291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 LT PUSH2 0x22CA JUMPI PUSH1 0x12 DUP4 DUP4 SUB GT ISZERO PUSH2 0x22A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 DUP4 DUP4 SUB PUSH1 0xA EXP MUL PUSH8 0xDE0B6B3A7640000 DUP6 MUL DUP2 PUSH2 0x22C2 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x22F8 JUMP JUMPDEST PUSH1 0x12 DUP3 DUP5 SUB GT ISZERO PUSH2 0x22DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 DUP3 DUP5 SUB PUSH1 0xA EXP PUSH8 0xDE0B6B3A7640000 DUP7 MUL MUL DUP2 PUSH2 0x22F4 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 EQ ISZERO PUSH2 0x2313 JUMPI PUSH1 0x0 SWAP1 POP PUSH2 0x2334 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MUL SWAP1 POP DUP3 DUP5 DUP3 DUP2 PUSH2 0x2324 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x232F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x2348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x2353 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 DUP4 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x236D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MLOAD ADD SWAP2 POP DUP2 DUP2 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x500 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 SWAP1 JUMPDEST PUSH2 0x239D PUSH2 0x23B3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2395 JUMPI SWAP1 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23EF DUP3 CALLDATALOAD PUSH2 0x38BA JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2403 DUP3 CALLDATALOAD PUSH2 0x38CC JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x241C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x242F PUSH2 0x242A DUP3 PUSH2 0x36A4 JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2475 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x245B DUP9 DUP3 PUSH2 0x25E3 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2445 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x24A3 PUSH2 0x249E DUP3 PUSH2 0x36CC JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x24E9 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x24CF DUP9 DUP3 PUSH2 0x274D JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x24B9 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2517 PUSH2 0x2512 DUP3 PUSH2 0x36F4 JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x255D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x2543 DUP9 DUP3 PUSH2 0x282B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x252D JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2573 DUP3 CALLDATALOAD PUSH2 0x38DE JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2587 DUP3 CALLDATALOAD PUSH2 0x38EA JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x25A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x25B3 PUSH2 0x25AE DUP3 PUSH2 0x371C JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x25CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25DA DUP4 DUP3 DUP5 PUSH2 0x3973 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x25F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25FF PUSH1 0x80 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x260F DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x262F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x263B DUP5 DUP3 DUP6 ADD PUSH2 0x258F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x264F DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2663 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2682 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268D PUSH2 0x100 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP5 DUP3 DUP6 ADD PUSH2 0x247F JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x26C9 DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x26DD DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x26F1 DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2705 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x2719 DUP5 DUP3 DUP6 ADD PUSH2 0x28F3 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x272D DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x2741 DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x276B PUSH2 0x100 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2787 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2793 DUP5 DUP3 DUP6 ADD PUSH2 0x24F3 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x27A7 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x27BB DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x27CF DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x27E3 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x27F7 DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x280B DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x281F DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x283D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2847 PUSH1 0xA0 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2857 DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x286B DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x287F DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2893 DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x28B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28BF DUP5 DUP3 DUP6 ADD PUSH2 0x240B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28D7 DUP3 CALLDATALOAD PUSH2 0x3914 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28EB DUP3 MLOAD PUSH2 0x3914 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28FF DUP3 CALLDATALOAD PUSH2 0x391E JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2927 DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2942 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2950 DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x296C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x297A DUP6 DUP3 DUP7 ADD PUSH2 0x23E3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x298B DUP6 DUP3 DUP7 ADD PUSH2 0x28CB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x29A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29CD DUP5 DUP3 DUP6 ADD PUSH2 0x266F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x29E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29F6 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2A11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2A1F DUP5 DUP3 DUP6 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2A3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2A49 DUP6 DUP3 DUP7 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2A5A DUP6 DUP3 DUP7 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A70 DUP4 DUP4 PUSH2 0x30C0 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A84 DUP4 DUP4 PUSH2 0x3123 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A98 DUP4 DUP4 PUSH2 0x31D3 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2AA9 DUP2 PUSH2 0x385B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AB8 DUP2 PUSH2 0x385B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AC7 DUP2 PUSH2 0x3849 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AD6 DUP2 PUSH2 0x3849 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AE7 DUP3 PUSH2 0x376F JUMP JUMPDEST PUSH2 0x2AF1 DUP2 DUP6 PUSH2 0x37CD JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2B03 DUP6 PUSH2 0x3748 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2B3C JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2B1E DUP4 DUP4 MLOAD PUSH2 0x2A64 JUMP JUMPDEST SWAP3 POP PUSH2 0x2B29 DUP3 PUSH2 0x37A6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2B06 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B58 DUP3 PUSH2 0x377A JUMP JUMPDEST PUSH2 0x2B62 DUP2 DUP6 PUSH2 0x37DE JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2B74 DUP6 PUSH2 0x3755 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2BAD JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2B8F DUP4 DUP4 MLOAD PUSH2 0x2A78 JUMP JUMPDEST SWAP3 POP PUSH2 0x2B9A DUP3 PUSH2 0x37B3 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2B77 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2BC9 DUP3 PUSH2 0x3785 JUMP JUMPDEST PUSH2 0x2BD3 DUP2 DUP6 PUSH2 0x37EF JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2BE5 DUP6 PUSH2 0x3762 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2C1E JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2C00 DUP4 DUP4 MLOAD PUSH2 0x2A8C JUMP JUMPDEST SWAP3 POP PUSH2 0x2C0B DUP3 PUSH2 0x37C0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2BE8 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2C38 DUP2 PUSH2 0x386D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C47 DUP2 PUSH2 0x386D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C56 DUP2 PUSH2 0x3879 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C6D PUSH2 0x2C68 DUP3 PUSH2 0x3879 JUMP JUMPDEST PUSH2 0x39B5 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C7E DUP3 PUSH2 0x379B JUMP JUMPDEST PUSH2 0x2C88 DUP2 DUP6 PUSH2 0x3822 JUMP JUMPDEST SWAP4 POP PUSH2 0x2C98 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CAF DUP3 PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x2CB9 DUP2 DUP6 PUSH2 0x3800 JUMP JUMPDEST SWAP4 POP PUSH2 0x2CC9 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST PUSH2 0x2CD2 DUP2 PUSH2 0x39BF JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CE8 DUP3 PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x2CF2 DUP2 DUP6 PUSH2 0x3811 JUMP JUMPDEST SWAP4 POP PUSH2 0x2D02 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST PUSH2 0x2D0B DUP2 PUSH2 0x39BF JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2D1F DUP2 PUSH2 0x392B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2D2E DUP2 PUSH2 0x394F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D41 PUSH1 0x14 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x436F6E7472616374206E6F74207061757365642E000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D81 PUSH1 0x1C DUP4 PUSH2 0x383E JUMP JUMPDEST SWAP2 POP PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x1C DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DC1 PUSH1 0xF DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x5472616E73666572206661696C65640000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E01 PUSH1 0xA DUP4 PUSH2 0x383E JUMP JUMPDEST SWAP2 POP PUSH32 0x646563696D616C73282900000000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0xA DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E41 PUSH1 0x29 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x454F412063616E6E6F742073656E6420657468657220746F207072696D617279 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2066616C6C6261636B0000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2EA7 PUSH1 0x11 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2EE7 PUSH1 0x12 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x47617320707269636520746F6F20686967680000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F27 PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4D696E696D756D2065786368616E67652072617465206E6F74206D6574000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F67 PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4661696C656420746F2067657420746F6B656E7320666F722073776170000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FA7 PUSH1 0x26 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x476F74206C657373207468616E206D696E696D756D44657374696E6174696F6E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x416D6F756E740000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x300D PUSH1 0x13 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x436F6E7472616374206973207061757365642E00000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x304D PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4E6F7420656E6F7567682064657374696E6174696F6E20616D6F756E74000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308D PUSH1 0x7 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4578706972656400000000000000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x30D8 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x2AA0 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x30F0 DUP3 DUP3 PUSH2 0x2CA4 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3105 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3118 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x0 DUP7 ADD MSTORE PUSH2 0x3141 DUP3 DUP3 PUSH2 0x2BBE JUMP JUMPDEST SWAP2 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x3156 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3169 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x317C PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x318F PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x31A2 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x31B5 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2AA0 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x31C8 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x31EB PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x2ABE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x31FE PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x2ABE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3211 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3224 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x323C DUP3 DUP3 PUSH2 0x2ADC JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3252 DUP2 PUSH2 0x38A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3261 DUP2 PUSH2 0x38A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3270 DUP2 PUSH2 0x38AD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3282 DUP3 DUP5 PUSH2 0x2C73 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3298 DUP3 PUSH2 0x2D74 JUMP JUMPDEST SWAP2 POP PUSH2 0x32A4 DUP3 DUP5 PUSH2 0x2C5C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32BE DUP3 PUSH2 0x2DF4 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x32DD PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2AAF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x32F8 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x3305 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x3312 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x331F PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 ADD SWAP1 POP PUSH2 0x333D PUSH1 0x0 DUP4 ADD DUP10 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x334A PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x3357 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x3364 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x3371 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x337E PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x339E PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x33AB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x33CC DUP2 DUP10 PUSH2 0x2B4D JUMP JUMPDEST SWAP1 POP PUSH2 0x33DB PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x33E8 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x33F5 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3402 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x340F PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x2AAF JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x342F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2C3E JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x344A PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3457 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3267 JUMP JUMPDEST PUSH2 0x3464 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3471 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2C4D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3494 DUP2 DUP8 PUSH2 0x2CDD JUMP JUMPDEST SWAP1 POP PUSH2 0x34A3 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x34B0 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x34BD PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2C3E JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x34DB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2D16 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x34F6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2D25 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3515 DUP2 PUSH2 0x2D34 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3535 DUP2 PUSH2 0x2DB4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3555 DUP2 PUSH2 0x2E34 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3575 DUP2 PUSH2 0x2E9A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3595 DUP2 PUSH2 0x2EDA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35B5 DUP2 PUSH2 0x2F1A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35D5 DUP2 PUSH2 0x2F5A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35F5 DUP2 PUSH2 0x2F9A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3615 DUP2 PUSH2 0x3000 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3635 DUP2 PUSH2 0x3040 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3655 DUP2 PUSH2 0x3080 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3671 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x369A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x36BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x36E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x370B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3854 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3866 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38C5 DUP3 PUSH2 0x38F4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38D7 DUP3 PUSH2 0x38F4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3936 DUP3 PUSH2 0x393D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3948 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x395A DUP3 PUSH2 0x3961 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x396C DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x39A0 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3985 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x39AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 0xf9 DUP2 0x2b MLOAD 0xef 0x22 0x1e 0xdd REVERT 0xba PUSH5 0xE552942C57 SWAP7 BLOCKHASH PUSH12 0x51EFB3593C09E0FE5A53202 0x1f PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "511:18683:13:-;;;269:5:7;246:28;;;;;;;;;;;;;;;;;;;;852:11:13;814:49;;2586:178;8:9:-1;5:2;;;30:1;27;20:12;5:2;2586:178:13;;;;;;;;;;;;;;;;;;;;;;602:10:4;594:5;;:18;;;;;;;;;;;;;;;;;;2702:19:13;2662:18;;:60;;;;;;;;;;;;;;;;;;2752:4;2733:7;:16;2741:7;2733:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;2586:178;;511:18683;;5:122:-1;;83:39;114:6;108:13;83:39;;;74:48;;68:59;;;;;134:399;;;266:2;254:9;245:7;241:23;237:32;234:2;;;282:1;279;272:12;234:2;317:1;334:64;390:7;381:6;370:9;366:22;334:64;;;324:74;;296:108;435:2;453:64;509:7;500:6;489:9;485:22;453:64;;;443:74;;414:109;228:305;;;;;;540:105;;609:31;634:5;609:31;;;598:42;;592:53;;;;652:128;;732:42;725:5;721:54;710:65;;704:76;;;;511:18683:13;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "6080604052600436106100f35760003560e01c80638456cb591161008a578063c571c67e11610059578063c571c67e14610370578063eb12d61e14610399578063f14210a6146103c2578063f2fde38b146103eb576100f3565b80638456cb59146102c65780638af8d4c3146102dd5780638da5cb5b146103085780639e281a9814610333576100f3565b80635c975abb116100c65780635c975abb1461021c578063715018a614610247578063736c0d5b1461025e5780637822b9ae1461029b576100f3565b80630e316ab7146101955780630eefdbad146101be57806311a861a7146101e95780633f4ba83a14610205575b600060149054906101000a900460ff1615610143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a906135fc565b60405180910390fd5b600080339050803b91506000821415610191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101889061353c565b60405180910390fd5b5050005b3480156101a157600080fd5b506101bc60048036036101b79190810190612907565b610414565b005b3480156101ca57600080fd5b506101d36104c8565b6040516101e091906134e1565b60405180910390f35b61020360048036036101fe9190810190612995565b6104ee565b005b34801561021157600080fd5b5061021a610858565b005b34801561022857600080fd5b50610231610948565b60405161023e919061341a565b60405180910390f35b34801561025357600080fd5b5061025c61095e565b005b34801561026a57600080fd5b5061028560048036036102809190810190612907565b610a5e565b604051610292919061341a565b60405180910390f35b3480156102a757600080fd5b506102b0610a7e565b6040516102bd919061365c565b60405180910390f35b3480156102d257600080fd5b506102db610a84565b005b3480156102e957600080fd5b506102f2610b76565b6040516102ff91906134c6565b60405180910390f35b34801561031457600080fd5b5061031d610b89565b60405161032a91906132c8565b60405180910390f35b34801561033f57600080fd5b5061035a60048036036103559190810190612959565b610bae565b604051610367919061341a565b60405180910390f35b34801561037c57600080fd5b50610397600480360361039291908101906129d6565b610c3d565b005b3480156103a557600080fd5b506103c060048036036103bb9190810190612907565b610ca0565b005b3480156103ce57600080fd5b506103e960048036036103e491908101906129d6565b610d54565b005b3480156103f757600080fd5b50610412600480360361040d9190810190612930565b610e18565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461046d57600080fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060149054906101000a900460ff161561053e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610535906135fc565b60405180910390fd5b8043816040015111610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c9061363c565b60405180910390fd5b81600081600001518260200151836040015184606001518560800151336040516020016105b7969594939291906133b2565b604051602081830303815290604052805190602001209050600260006001836040516020016105e6919061328d565b604051602081830303815290604052805190602001208560a001518660c001518760e00151604051600081526020016040526040516106289493929190613435565b6020604051602081039080840390855afa15801561064a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d29061355c565b60405180910390fd5b8380608001513a1115610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a9061357c565b60405180910390fd5b60008090506003543a10610735575a90505b61073d612385565b6040518060400160405280610750610e7d565b73ffffffffffffffffffffffffffffffffffffffff168152602001348152508160006014811061077c57fe5b602002018190525060008090505b8760000151518110156107cf576107c28860600151896000015183815181106107af57fe5b6020026020010151848b60200151610e85565b808060010191505061078a565b503373ffffffffffffffffffffffffffffffffffffffff16876020015173ffffffffffffffffffffffffffffffffffffffff1688606001517fc3dcfccc2c1c6fe2a908d1825ba2e62b5b2d61a6b9c500791f75cdc538bdeb9d60405160405180910390a461083c816113be565b600082111561084f5761084e8261145b565b5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b157600080fd5b600060149054906101000a900460ff16610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f7906134fc565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b60008060149054906101000a900460ff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109b757600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026020528060005260406000206000915054906101000a900460ff1681565b60035481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610add57600080fd5b600060149054906101000a900460ff1615610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906135fc565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b6eb3f879cb30fe243b4dfee438691c0481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c0957600080fd5b610c35836000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611534565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9657600080fd5b8060038190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cf957600080fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dad57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e14573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7157600080fd5b610e7a81611683565b50565b600080905090565b610eb0828460000151600081518110610e9a57fe5b602002602001015160000151856060015161177b565b610efe578260e0015115610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef0906135bc565b60405180910390fd5b6113b8565b60008090506000809050600080905060008090505b8660000151518110156110ff57866080015181148015610f3457508660a001515b15610f7657610f738688600001518381518110610f4d57fe5b6020026020010151600001518760008514610f685786610f6e565b8a606001515b61198e565b91505b6000610fee88600001518381518110610f8b57fe5b602002602001015188610fe960008614610fa55787610fab565b8b606001515b8b610fd18d8f600001518a81518110610fc057fe5b602002602001015160000151611a58565b60148110610fdb57fe5b602002015160200151611b6e565b611b87565b80955081925050508760000151828151811061100657fe5b60200260200101516060015115801561103957508760000151828151811061102a57fe5b60200260200101516040015184105b1561108d578760e0015115611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a9061361c565b60405180910390fd5b50505050506113b8565b60008214156110a857809450600083146110a75782850194505b5b8760800151821480156110bd57508760a00151155b156110f1576110e987896000015184815181106110d657fe5b602002602001015160200151888761198e565b925082840393505b508080600101915050610f13565b50867f7c396f87ca37e7dab636d7ffad74fe2ef4729fda118a0a2c105bf74f4890437f876000015160008151811061113357fe5b602002602001015160000151886000015160018a6000015151038151811061115757fe5b60200260200101516020015186868b60a00151611193578b600001518c608001518151811061118257fe5b6020026020010151602001516111b4565b8b600001518c60800151815181106111a757fe5b6020026020010151600001515b876040516111c796959493929190613328565b60405180910390a28560400151821015611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906135dc565b60405180910390fd5b61126a866000015160008151811061122a57fe5b60200260200101516000015187600001516001896000015151038151811061124e57fe5b6020026020010151602001518860600151858a60200151611d11565b156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a19061359c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168660c0015173ffffffffffffffffffffffffffffffffffffffff161415801561131b5750600073ffffffffffffffffffffffffffffffffffffffff168660c0015173ffffffffffffffffffffffffffffffffffffffff1614155b156113b457600061134f86886000015160018a6000015151038151811061133e57fe5b602002602001015160200151611a58565b905060006113718488846014811061136357fe5b602002015160200151611dd1565b905061138387838a60c0015184611dea565b6113b187896000015160018b6000015151038151811061139f57fe5b60200260200101516020015183611ef4565b50505b5050505b50505050565b60008090505b6014811015611456576000811415801561141e5750600073ffffffffffffffffffffffffffffffffffffffff168282601481106113fd57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff16145b156114295750611458565b61144982823385856014811061143b57fe5b602002015160200151611dea565b80806001019150506113c4565b505b50565b60005a905060008183039050600061149161a0aa61374a84018161147b57fe5b04611b6c616c3e86038161148b57fe5b04611dd1565b90506eb3f879cb30fe243b4dfee438691c0473ffffffffffffffffffffffffffffffffffffffff16636366b936826040518263ffffffff1660e01b81526004016114db919061365c565b602060405180830381600087803b1580156114f557600080fd5b505af1158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152d91908101906129ff565b5050505050565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051602401611560929190613389565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115ea9190613276565b6000604051808303816000865af19150503d8060008114611627576040519150601f19603f3d011682016040523d82523d6000602084013e61162c565b606091505b50508091505080611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116699061351c565b60405180910390fd5b61167a611f13565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116bd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611785610e7d565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117e757836000601481106117c557fe5b6020020151602001518211156117de5760009050611987565b60019050611987565b60006117f38585611a58565b905084816014811061180157fe5b602002015160200151831115611981576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685333089866014811061185b57fe5b602002015160200151880360405160240161187994939291906132e3565b6040516020818303038152906040527f15dacbea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119039190613276565b6000604051808303816000865af19150503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b5050809150508015611976578386836014811061195e57fe5b60200201516020018181525050600192505050611987565b600092505050611987565b60019150505b9392505050565b60008083905060008173ffffffffffffffffffffffffffffffffffffffff1663064367bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119dc57600080fd5b505afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a1491908101906129ff565b9050611a208482611f44565b9250611a3787611a308989611a58565b8786611dea565b611a4b87611a458989611a58565b85611f69565b8292505050949350505050565b600080600090505b6014811015611b66578273ffffffffffffffffffffffffffffffffffffffff16848260148110611a8c57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff161415611aba5780915050611b68565b60008114158015611b0b5750600073ffffffffffffffffffffffffffffffffffffffff16848260148110611aea57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff16145b15611b595760405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250848260148110611b4857fe5b602002018190525080915050611b68565b8080600101915050611a60565b505b92915050565b6000818310611b7d5781611b7f565b825b905092915050565b6000806000809050600080905060008090506000611ba489611f8e565b905060008090505b896080015151811015611ce65787612710888a03021015611bcc57611ce6565b89606001518015611be05750896040015185145b15611bea57611ce6565b6000611c2e8b608001518381518110611bff57fe5b6020026020010151604001518c608001518481518110611c1b57fe5b6020026020010151606001518587611fff565b9050611c5e8b608001518381518110611c4357fe5b6020026020010151898b038d606001518e600001518e612034565b80965081975050508a608001518281518110611c7657fe5b6020026020010151604001518b608001518381518110611c9257fe5b60200260200101516060015103830392508a608001518281518110611cb357fe5b602002602001015160400151861015611cce57858103840193505b85880197508487019650508080600101915050611bac565b50611cf6888a60200151876121dc565b611d05888a6000015188611ef4565b50505050935093915050565b600080611d1c610e7d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611d5c57611d57876121fb565b611d5f565b60125b90506000611d6b610e7d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611dab57611da6876121fb565b611dae565b60125b90506000611dbe8787858561225d565b9050848110935050505095945050505050565b6000818310611de05781611de2565b825b905092915050565b6000811115611eee57611dfb610e7d565b73ffffffffffffffffffffffffffffffffffffffff16848460148110611e1d57fe5b60200201516000015173ffffffffffffffffffffffffffffffffffffffff161415611e8e578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e88573d6000803e3d6000fd5b50611eed565b611ead848460148110611e9d57fe5b6020020151600001518383611534565b611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061351c565b60405180910390fd5b5b5b50505050565b6000611f008484611a58565b9050611f0d848284611f69565b50505050565b60003d60008114611f2b5760208114611f3457600080fd5b60019150611f40565b60206000803e60005191505b5090565b6000611f61611f538484612300565b670de0b6b3a764000061233a565b905092915050565b80838360148110611f7657fe5b60200201516020018181510391508181525050505050565b600080600090505b8260800151518160ff161015611ff65782608001518160ff1681518110611fb957fe5b60200260200101516040015183608001518260ff1681518110611fd857fe5b60200260200101516060015103820191508080600101915050611f96565b50809050919050565b60008082148061200e57508385145b1561201b5784905061202c565b8282868603028161202857fe5b0490505b949350505050565b60008061203f610e7d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561211857866000015173ffffffffffffffffffffffffffffffffffffffff16630345c2a6878960200151898a8a6040518663ffffffff1660e01b81526004016120ba949392919061347a565b60408051808303818588803b1580156120d257600080fd5b505af11580156120e6573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525061210b9190810190612a28565b80925081935050506121d2565b612131836121268587611a58565b896000015189611dea565b866000015173ffffffffffffffffffffffffffffffffffffffff16630345c2a688602001518889896040518563ffffffff1660e01b8152600401612178949392919061347a565b6040805180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121c99190810190612a28565b80925081935050505b9550959350505050565b60006121e88484611a58565b90506121f5848284612360565b50505050565b60008060405161220a906132b3565b60405180910390209050604051818152600460208083838560008a5af1806000811461223d57600181146122465761224b565b6000965061224b565b845196505b50600484016040525050505050919050565b60006b204fce5e3e2502611000000085111561227857600080fd5b6b204fce5e3e2502611000000084111561229157600080fd5b8282106122ca57601283830311156122a857600080fd5b84838303600a0a02670de0b6b3a76400008502816122c257fe5b0490506122f8565b601282840311156122da57600080fd5b84828403600a0a670de0b6b3a7640000860202816122f457fe5b0490505b949350505050565b6000808314156123135760009050612334565b600082840290508284828161232457fe5b041461232f57600080fd5b809150505b92915050565b600080821161234857600080fd5b600082848161235357fe5b0490508091505092915050565b8083836014811061236d57fe5b60200201516020018181510191508181525050505050565b6040518061050001604052806014905b61239d6123b3565b8152602001906001900390816123955790505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b60006123ef82356138ba565b905092915050565b600061240382356138cc565b905092915050565b600082601f83011261241c57600080fd5b813561242f61242a826136a4565b613677565b9150818183526020840193506020810190508360005b83811015612475578135860161245b88826125e3565b845260208401935060208301925050600181019050612445565b5050505092915050565b600082601f83011261249057600080fd5b81356124a361249e826136cc565b613677565b9150818183526020840193506020810190508360005b838110156124e957813586016124cf888261274d565b8452602084019350602083019250506001810190506124b9565b5050505092915050565b600082601f83011261250457600080fd5b8135612517612512826136f4565b613677565b9150818183526020840193506020810190508360005b8381101561255d5781358601612543888261282b565b84526020840193506020830192505060018101905061252d565b5050505092915050565b600061257382356138de565b905092915050565b600061258782356138ea565b905092915050565b600082601f8301126125a057600080fd5b81356125b36125ae8261371c565b613677565b915080825260208301602083018583830111156125cf57600080fd5b6125da838284613973565b50505092915050565b6000608082840312156125f557600080fd5b6125ff6080613677565b9050600061260f848285016123f7565b600083015250602082013567ffffffffffffffff81111561262f57600080fd5b61263b8482850161258f565b602083015250604061264f848285016128cb565b6040830152506060612663848285016128cb565b60608301525092915050565b6000610100828403121561268257600080fd5b61268d610100613677565b9050600082013567ffffffffffffffff8111156126a957600080fd5b6126b58482850161247f565b60008301525060206126c9848285016123f7565b60208301525060406126dd848285016128cb565b60408301525060606126f18482850161257b565b6060830152506080612705848285016128cb565b60808301525060a0612719848285016128f3565b60a08301525060c061272d8482850161257b565b60c08301525060e06127418482850161257b565b60e08301525092915050565b6000610100828403121561276057600080fd5b61276b610100613677565b9050600082013567ffffffffffffffff81111561278757600080fd5b612793848285016124f3565b60008301525060206127a7848285016128cb565b60208301525060406127bb848285016128cb565b60408301525060606127cf848285016128cb565b60608301525060806127e3848285016128cb565b60808301525060a06127f784828501612567565b60a08301525060c061280b848285016123f7565b60c08301525060e061281f84828501612567565b60e08301525092915050565b600060a0828403121561283d57600080fd5b61284760a0613677565b90506000612857848285016123e3565b600083015250602061286b848285016123e3565b602083015250604061287f848285016128cb565b604083015250606061289384828501612567565b606083015250608082013567ffffffffffffffff8111156128b357600080fd5b6128bf8482850161240b565b60808301525092915050565b60006128d78235613914565b905092915050565b60006128eb8251613914565b905092915050565b60006128ff823561391e565b905092915050565b60006020828403121561291957600080fd5b6000612927848285016123e3565b91505092915050565b60006020828403121561294257600080fd5b6000612950848285016123f7565b91505092915050565b6000806040838503121561296c57600080fd5b600061297a858286016123e3565b925050602061298b858286016128cb565b9150509250929050565b6000602082840312156129a757600080fd5b600082013567ffffffffffffffff8111156129c157600080fd5b6129cd8482850161266f565b91505092915050565b6000602082840312156129e857600080fd5b60006129f6848285016128cb565b91505092915050565b600060208284031215612a1157600080fd5b6000612a1f848285016128df565b91505092915050565b60008060408385031215612a3b57600080fd5b6000612a49858286016128df565b9250506020612a5a858286016128df565b9150509250929050565b6000612a7083836130c0565b905092915050565b6000612a848383613123565b905092915050565b6000612a9883836131d3565b905092915050565b612aa98161385b565b82525050565b612ab88161385b565b82525050565b612ac781613849565b82525050565b612ad681613849565b82525050565b6000612ae78261376f565b612af181856137cd565b935083602082028501612b0385613748565b60005b84811015612b3c578383038852612b1e838351612a64565b9250612b29826137a6565b9150602088019750600181019050612b06565b508196508694505050505092915050565b6000612b588261377a565b612b6281856137de565b935083602082028501612b7485613755565b60005b84811015612bad578383038852612b8f838351612a78565b9250612b9a826137b3565b9150602088019750600181019050612b77565b508196508694505050505092915050565b6000612bc982613785565b612bd381856137ef565b935083602082028501612be585613762565b60005b84811015612c1e578383038852612c00838351612a8c565b9250612c0b826137c0565b9150602088019750600181019050612be8565b508196508694505050505092915050565b612c388161386d565b82525050565b612c478161386d565b82525050565b612c5681613879565b82525050565b612c6d612c6882613879565b6139b5565b82525050565b6000612c7e8261379b565b612c888185613822565b9350612c98818560208601613982565b80840191505092915050565b6000612caf82613790565b612cb98185613800565b9350612cc9818560208601613982565b612cd2816139bf565b840191505092915050565b6000612ce882613790565b612cf28185613811565b9350612d02818560208601613982565b612d0b816139bf565b840191505092915050565b612d1f8161392b565b82525050565b612d2e8161394f565b82525050565b6000612d4160148361382d565b91507f436f6e7472616374206e6f74207061757365642e0000000000000000000000006000830152602082019050919050565b6000612d81601c8361383e565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612dc1600f8361382d565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b6000612e01600a8361383e565b91507f646563696d616c732829000000000000000000000000000000000000000000006000830152600a82019050919050565b6000612e4160298361382d565b91507f454f412063616e6e6f742073656e6420657468657220746f207072696d61727960008301527f2066616c6c6261636b00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ea760118361382d565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000612ee760128361382d565b91507f47617320707269636520746f6f206869676800000000000000000000000000006000830152602082019050919050565b6000612f27601d8361382d565b91507f4d696e696d756d2065786368616e67652072617465206e6f74206d65740000006000830152602082019050919050565b6000612f67601d8361382d565b91507f4661696c656420746f2067657420746f6b656e7320666f7220737761700000006000830152602082019050919050565b6000612fa760268361382d565b91507f476f74206c657373207468616e206d696e696d756d44657374696e6174696f6e60008301527f416d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061300d60138361382d565b91507f436f6e7472616374206973207061757365642e000000000000000000000000006000830152602082019050919050565b600061304d601d8361382d565b91507f4e6f7420656e6f7567682064657374696e6174696f6e20616d6f756e740000006000830152602082019050919050565b600061308d60078361382d565b91507f45787069726564000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006080830160008301516130d86000860182612aa0565b50602083015184820360208601526130f08282612ca4565b91505060408301516131056040860182613249565b5060608301516131186060860182613249565b508091505092915050565b60006101008301600083015184820360008601526131418282612bbe565b91505060208301516131566020860182613249565b5060408301516131696040860182613249565b50606083015161317c6060860182613249565b50608083015161318f6080860182613249565b5060a08301516131a260a0860182612c2f565b5060c08301516131b560c0860182612aa0565b5060e08301516131c860e0860182612c2f565b508091505092915050565b600060a0830160008301516131eb6000860182612abe565b5060208301516131fe6020860182612abe565b5060408301516132116040860182613249565b5060608301516132246060860182612c2f565b506080830151848203608086015261323c8282612adc565b9150508091505092915050565b613252816138a3565b82525050565b613261816138a3565b82525050565b613270816138ad565b82525050565b60006132828284612c73565b915081905092915050565b600061329882612d74565b91506132a48284612c5c565b60208201915081905092915050565b60006132be82612df4565b9150819050919050565b60006020820190506132dd6000830184612aaf565b92915050565b60006080820190506132f86000830187612acd565b6133056020830186612aaf565b6133126040830185612aaf565b61331f6060830184613258565b95945050505050565b600060c08201905061333d6000830189612acd565b61334a6020830188612acd565b6133576040830187613258565b6133646060830186613258565b6133716080830185612acd565b61337e60a0830184613258565b979650505050505050565b600060408201905061339e6000830185612acd565b6133ab6020830184613258565b9392505050565b600060c08201905081810360008301526133cc8189612b4d565b90506133db6020830188612aaf565b6133e86040830187613258565b6133f56060830186612c4d565b6134026080830185613258565b61340f60a0830184612aaf565b979650505050505050565b600060208201905061342f6000830184612c3e565b92915050565b600060808201905061344a6000830187612c4d565b6134576020830186613267565b6134646040830185612c4d565b6134716060830184612c4d565b95945050505050565b600060808201905081810360008301526134948187612cdd565b90506134a36020830186613258565b6134b06040830185613258565b6134bd6060830184612c3e565b95945050505050565b60006020820190506134db6000830184612d16565b92915050565b60006020820190506134f66000830184612d25565b92915050565b6000602082019050818103600083015261351581612d34565b9050919050565b6000602082019050818103600083015261353581612db4565b9050919050565b6000602082019050818103600083015261355581612e34565b9050919050565b6000602082019050818103600083015261357581612e9a565b9050919050565b6000602082019050818103600083015261359581612eda565b9050919050565b600060208201905081810360008301526135b581612f1a565b9050919050565b600060208201905081810360008301526135d581612f5a565b9050919050565b600060208201905081810360008301526135f581612f9a565b9050919050565b6000602082019050818103600083015261361581613000565b9050919050565b6000602082019050818103600083015261363581613040565b9050919050565b6000602082019050818103600083015261365581613080565b9050919050565b60006020820190506136716000830184613258565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561369a57600080fd5b8060405250919050565b600067ffffffffffffffff8211156136bb57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156136e357600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561370b57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561373357600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061385482613883565b9050919050565b600061386682613883565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006138c5826138f4565b9050919050565b60006138d7826138f4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139368261393d565b9050919050565b600061394882613883565b9050919050565b600061395a82613961565b9050919050565b600061396c82613883565b9050919050565b82818337600083830152505050565b60005b838110156139a0578082015181840152602081019050613985565b838111156139af576000848401525b50505050565b6000819050919050565b6000601f19601f830116905091905056fea265627a7a72305820f9812b51ef221eddfdba64e552942c5796406b051efb3593c09e0fe5a532021f6c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xF3 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8456CB59 GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xC571C67E GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC571C67E EQ PUSH2 0x370 JUMPI DUP1 PUSH4 0xEB12D61E EQ PUSH2 0x399 JUMPI DUP1 PUSH4 0xF14210A6 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3EB JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x2C6 JUMPI DUP1 PUSH4 0x8AF8D4C3 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x308 JUMPI DUP1 PUSH4 0x9E281A98 EQ PUSH2 0x333 JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0x5C975ABB GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x247 JUMPI DUP1 PUSH4 0x736C0D5B EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0x7822B9AE EQ PUSH2 0x29B JUMPI PUSH2 0xF3 JUMP JUMPDEST DUP1 PUSH4 0xE316AB7 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0xEEFDBAD EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x11A861A7 EQ PUSH2 0x1E9 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x205 JUMPI JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x143 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x13A SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLER SWAP1 POP DUP1 EXTCODESIZE SWAP2 POP PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0x191 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x188 SWAP1 PUSH2 0x353C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1B7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D3 PUSH2 0x4C8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E0 SWAP2 SWAP1 PUSH2 0x34E1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x203 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1FE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2995 JUMP JUMPDEST PUSH2 0x4EE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21A PUSH2 0x858 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x231 PUSH2 0x948 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25C PUSH2 0x95E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x285 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x280 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0xA5E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x292 SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B0 PUSH2 0xA7E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2BD SWAP2 SWAP1 PUSH2 0x365C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DB PUSH2 0xA84 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F2 PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2FF SWAP2 SWAP1 PUSH2 0x34C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x314 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31D PUSH2 0xB89 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x32A SWAP2 SWAP1 PUSH2 0x32C8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x35A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x355 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2959 JUMP JUMPDEST PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x367 SWAP2 SWAP1 PUSH2 0x341A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x397 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x392 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29D6 JUMP JUMPDEST PUSH2 0xC3D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3C0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x3BB SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2907 JUMP JUMPDEST PUSH2 0xCA0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x3E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29D6 JUMP JUMPDEST PUSH2 0xD54 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x412 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x40D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0xE18 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x53E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 NUMBER DUP2 PUSH1 0x40 ADD MLOAD GT PUSH2 0x585 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x57C SWAP1 PUSH2 0x363C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP5 PUSH1 0x60 ADD MLOAD DUP6 PUSH1 0x80 ADD MLOAD CALLER PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x5B7 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x33B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x2 PUSH1 0x0 PUSH1 0x1 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x5E6 SWAP2 SWAP1 PUSH2 0x328D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP6 PUSH1 0xA0 ADD MLOAD DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xE0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x628 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3435 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x64A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x6DB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6D2 SWAP1 PUSH2 0x355C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 DUP1 PUSH1 0x80 ADD MLOAD GASPRICE GT ISZERO PUSH2 0x723 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x71A SWAP1 PUSH2 0x357C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x3 SLOAD GASPRICE LT PUSH2 0x735 JUMPI GAS SWAP1 POP JUMPDEST PUSH2 0x73D PUSH2 0x2385 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x750 PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLVALUE DUP2 MSTORE POP DUP2 PUSH1 0x0 PUSH1 0x14 DUP2 LT PUSH2 0x77C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP8 PUSH1 0x0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x7CF JUMPI PUSH2 0x7C2 DUP9 PUSH1 0x60 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x7AF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP12 PUSH1 0x20 ADD MLOAD PUSH2 0xE85 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x78A JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP9 PUSH1 0x60 ADD MLOAD PUSH32 0xC3DCFCCC2C1C6FE2A908D1825BA2E62B5B2D61A6B9C500791F75CDC538BDEB9D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH2 0x83C DUP2 PUSH2 0x13BE JUMP JUMPDEST PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x84F JUMPI PUSH2 0x84E DUP3 PUSH2 0x145B JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x900 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8F7 SWAP1 PUSH2 0x34FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0xA45F47FDEA8A1EFDD9029A5691C7F759C32B7C698632B563573E155625D16933 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xADD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB24 SWAP1 PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH32 0x9E87FAC88FF661F02D44F95383C817FECE4BCE600A3DAB7A54406878B965E752 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH15 0xB3F879CB30FE243B4DFEE438691C04 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC35 DUP4 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x1534 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xCF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xDAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE7A DUP2 PUSH2 0x1683 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xEB0 DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xE9A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x177B JUMP JUMPDEST PUSH2 0xEFE JUMPI DUP3 PUSH1 0xE0 ADD MLOAD ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEF0 SWAP1 PUSH2 0x35BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x13B8 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP7 PUSH1 0x0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x10FF JUMPI DUP7 PUSH1 0x80 ADD MLOAD DUP2 EQ DUP1 ISZERO PUSH2 0xF34 JUMPI POP DUP7 PUSH1 0xA0 ADD MLOAD JUMPDEST ISZERO PUSH2 0xF76 JUMPI PUSH2 0xF73 DUP7 DUP9 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF4D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x0 DUP6 EQ PUSH2 0xF68 JUMPI DUP7 PUSH2 0xF6E JUMP JUMPDEST DUP11 PUSH1 0x60 ADD MLOAD JUMPDEST PUSH2 0x198E JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xFEE DUP9 PUSH1 0x0 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF8B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP9 PUSH2 0xFE9 PUSH1 0x0 DUP7 EQ PUSH2 0xFA5 JUMPI DUP8 PUSH2 0xFAB JUMP JUMPDEST DUP12 PUSH1 0x60 ADD MLOAD JUMPDEST DUP12 PUSH2 0xFD1 DUP14 DUP16 PUSH1 0x0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH2 0xFC0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH2 0x1A58 JUMP JUMPDEST PUSH1 0x14 DUP2 LT PUSH2 0xFDB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1B87 JUMP JUMPDEST DUP1 SWAP6 POP DUP2 SWAP3 POP POP POP DUP8 PUSH1 0x0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1006 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD ISZERO DUP1 ISZERO PUSH2 0x1039 JUMPI POP DUP8 PUSH1 0x0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x102A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP5 LT JUMPDEST ISZERO PUSH2 0x108D JUMPI DUP8 PUSH1 0xE0 ADD MLOAD ISZERO PUSH2 0x1083 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x107A SWAP1 PUSH2 0x361C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x13B8 JUMP JUMPDEST PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0x10A8 JUMPI DUP1 SWAP5 POP PUSH1 0x0 DUP4 EQ PUSH2 0x10A7 JUMPI DUP3 DUP6 ADD SWAP5 POP JUMPDEST JUMPDEST DUP8 PUSH1 0x80 ADD MLOAD DUP3 EQ DUP1 ISZERO PUSH2 0x10BD JUMPI POP DUP8 PUSH1 0xA0 ADD MLOAD ISZERO JUMPDEST ISZERO PUSH2 0x10F1 JUMPI PUSH2 0x10E9 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x10D6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 DUP8 PUSH2 0x198E JUMP JUMPDEST SWAP3 POP DUP3 DUP5 SUB SWAP4 POP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xF13 JUMP JUMPDEST POP DUP7 PUSH32 0x7C396F87CA37E7DAB636D7FFAD74FE2EF4729FDA118A0A2C105BF74F4890437F DUP8 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1133 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP11 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x1157 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP7 DUP7 DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1193 JUMPI DUP12 PUSH1 0x0 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP2 MLOAD DUP2 LT PUSH2 0x1182 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x11B4 JUMP JUMPDEST DUP12 PUSH1 0x0 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP2 MLOAD DUP2 LT PUSH2 0x11A7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD JUMPDEST DUP8 PUSH1 0x40 MLOAD PUSH2 0x11C7 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3328 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP6 PUSH1 0x40 ADD MLOAD DUP3 LT ISZERO PUSH2 0x1216 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x120D SWAP1 PUSH2 0x35DC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x122A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x124E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD DUP6 DUP11 PUSH1 0x20 ADD MLOAD PUSH2 0x1D11 JUMP JUMPDEST ISZERO PUSH2 0x12AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x12A1 SWAP1 PUSH2 0x359C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x131B JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x13B4 JUMPI PUSH1 0x0 PUSH2 0x134F DUP7 DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP11 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x133E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1371 DUP5 DUP9 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1363 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1DD1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1383 DUP8 DUP4 DUP11 PUSH1 0xC0 ADD MLOAD DUP5 PUSH2 0x1DEA JUMP JUMPDEST PUSH2 0x13B1 DUP8 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x1 DUP12 PUSH1 0x0 ADD MLOAD MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x139F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP4 PUSH2 0x1EF4 JUMP JUMPDEST POP POP JUMPDEST POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x1456 JUMPI PUSH1 0x0 DUP2 EQ ISZERO DUP1 ISZERO PUSH2 0x141E JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x13FD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH2 0x1429 JUMPI POP PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x1449 DUP3 DUP3 CALLER DUP6 DUP6 PUSH1 0x14 DUP2 LT PUSH2 0x143B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x1DEA JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x13C4 JUMP JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 GAS SWAP1 POP PUSH1 0x0 DUP2 DUP4 SUB SWAP1 POP PUSH1 0x0 PUSH2 0x1491 PUSH2 0xA0AA PUSH2 0x374A DUP5 ADD DUP2 PUSH2 0x147B JUMPI INVALID JUMPDEST DIV PUSH2 0x1B6C PUSH2 0x6C3E DUP7 SUB DUP2 PUSH2 0x148B JUMPI INVALID JUMPDEST DIV PUSH2 0x1DD1 JUMP JUMPDEST SWAP1 POP PUSH15 0xB3F879CB30FE243B4DFEE438691C04 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6366B936 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x14DB SWAP2 SWAP1 PUSH2 0x365C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1509 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x152D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29FF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1560 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x15EA SWAP2 SWAP1 PUSH2 0x3276 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1627 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x162C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 PUSH2 0x1672 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1669 SWAP1 PUSH2 0x351C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x167A PUSH2 0x1F13 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x16BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1785 PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x17E7 JUMPI DUP4 PUSH1 0x0 PUSH1 0x14 DUP2 LT PUSH2 0x17C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP3 GT ISZERO PUSH2 0x17DE JUMPI PUSH1 0x0 SWAP1 POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x17F3 DUP6 DUP6 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 PUSH1 0x14 DUP2 LT PUSH2 0x1801 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP4 GT ISZERO PUSH2 0x1981 JUMPI PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 CALLER ADDRESS DUP10 DUP7 PUSH1 0x14 DUP2 LT PUSH2 0x185B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD MLOAD DUP9 SUB PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1879 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x32E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0x15DACBEA00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x1903 SWAP2 SWAP1 PUSH2 0x3276 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1940 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 ISZERO PUSH2 0x1976 JUMPI DUP4 DUP7 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x195E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 SWAP3 POP POP POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1987 JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 SWAP1 POP PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x64367BB PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x19F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1A14 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x29FF JUMP JUMPDEST SWAP1 POP PUSH2 0x1A20 DUP5 DUP3 PUSH2 0x1F44 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A37 DUP8 PUSH2 0x1A30 DUP10 DUP10 PUSH2 0x1A58 JUMP JUMPDEST DUP8 DUP7 PUSH2 0x1DEA JUMP JUMPDEST PUSH2 0x1A4B DUP8 PUSH2 0x1A45 DUP10 DUP10 PUSH2 0x1A58 JUMP JUMPDEST DUP6 PUSH2 0x1F69 JUMP JUMPDEST DUP3 SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x14 DUP2 LT ISZERO PUSH2 0x1B66 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1A8C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1ABA JUMPI DUP1 SWAP2 POP POP PUSH2 0x1B68 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ ISZERO DUP1 ISZERO PUSH2 0x1B0B JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1AEA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH2 0x1B59 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP DUP5 DUP3 PUSH1 0x14 DUP2 LT PUSH2 0x1B48 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP DUP1 SWAP2 POP POP PUSH2 0x1B68 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1A60 JUMP JUMPDEST POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1B7D JUMPI DUP2 PUSH2 0x1B7F JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP PUSH1 0x0 PUSH2 0x1BA4 DUP10 PUSH2 0x1F8E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP10 PUSH1 0x80 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH2 0x1CE6 JUMPI DUP8 PUSH2 0x2710 DUP9 DUP11 SUB MUL LT ISZERO PUSH2 0x1BCC JUMPI PUSH2 0x1CE6 JUMP JUMPDEST DUP10 PUSH1 0x60 ADD MLOAD DUP1 ISZERO PUSH2 0x1BE0 JUMPI POP DUP10 PUSH1 0x40 ADD MLOAD DUP6 EQ JUMPDEST ISZERO PUSH2 0x1BEA JUMPI PUSH2 0x1CE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C2E DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1BFF JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP13 PUSH1 0x80 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1C1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD DUP6 DUP8 PUSH2 0x1FFF JUMP JUMPDEST SWAP1 POP PUSH2 0x1C5E DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1C43 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP10 DUP12 SUB DUP14 PUSH1 0x60 ADD MLOAD DUP15 PUSH1 0x0 ADD MLOAD DUP15 PUSH2 0x2034 JUMP JUMPDEST DUP1 SWAP7 POP DUP2 SWAP8 POP POP POP DUP11 PUSH1 0x80 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1C76 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP12 PUSH1 0x80 ADD MLOAD DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x1C92 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD SUB DUP4 SUB SWAP3 POP DUP11 PUSH1 0x80 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1CB3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP7 LT ISZERO PUSH2 0x1CCE JUMPI DUP6 DUP2 SUB DUP5 ADD SWAP4 POP JUMPDEST DUP6 DUP9 ADD SWAP8 POP DUP5 DUP8 ADD SWAP7 POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1BAC JUMP JUMPDEST POP PUSH2 0x1CF6 DUP9 DUP11 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x21DC JUMP JUMPDEST PUSH2 0x1D05 DUP9 DUP11 PUSH1 0x0 ADD MLOAD DUP9 PUSH2 0x1EF4 JUMP JUMPDEST POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D1C PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1D5C JUMPI PUSH2 0x1D57 DUP8 PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1D5F JUMP JUMPDEST PUSH1 0x12 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D6B PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1DAB JUMPI PUSH2 0x1DA6 DUP8 PUSH2 0x21FB JUMP JUMPDEST PUSH2 0x1DAE JUMP JUMPDEST PUSH1 0x12 JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1DBE DUP8 DUP8 DUP6 DUP6 PUSH2 0x225D JUMP JUMPDEST SWAP1 POP DUP5 DUP2 LT SWAP4 POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1DE0 JUMPI DUP2 PUSH2 0x1DE2 JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1DFB PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1E1D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E8E JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1E88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x1EED JUMP JUMPDEST PUSH2 0x1EAD DUP5 DUP5 PUSH1 0x14 DUP2 LT PUSH2 0x1E9D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x0 ADD MLOAD DUP4 DUP4 PUSH2 0x1534 JUMP JUMPDEST PUSH2 0x1EEC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EE3 SWAP1 PUSH2 0x351C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1F00 DUP5 DUP5 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH2 0x1F0D DUP5 DUP3 DUP5 PUSH2 0x1F69 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 RETURNDATASIZE PUSH1 0x0 DUP2 EQ PUSH2 0x1F2B JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0x1F34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP2 POP PUSH2 0x1F40 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD SWAP2 POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1F61 PUSH2 0x1F53 DUP5 DUP5 PUSH2 0x2300 JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 PUSH2 0x233A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 DUP4 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x1F76 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MLOAD SUB SWAP2 POP DUP2 DUP2 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST DUP3 PUSH1 0x80 ADD MLOAD MLOAD DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x1FF6 JUMPI DUP3 PUSH1 0x80 ADD MLOAD DUP2 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x1FB9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x1FD8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD SUB DUP3 ADD SWAP2 POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1F96 JUMP JUMPDEST POP DUP1 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 EQ DUP1 PUSH2 0x200E JUMPI POP DUP4 DUP6 EQ JUMPDEST ISZERO PUSH2 0x201B JUMPI DUP5 SWAP1 POP PUSH2 0x202C JUMP JUMPDEST DUP3 DUP3 DUP7 DUP7 SUB MUL DUP2 PUSH2 0x2028 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x203F PUSH2 0xE7D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2118 JUMPI DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x345C2A6 DUP8 DUP10 PUSH1 0x20 ADD MLOAD DUP10 DUP11 DUP11 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x20BA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x347A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20E6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x210B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2A28 JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP PUSH2 0x21D2 JUMP JUMPDEST PUSH2 0x2131 DUP4 PUSH2 0x2126 DUP6 DUP8 PUSH2 0x1A58 JUMP JUMPDEST DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH2 0x1DEA JUMP JUMPDEST DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x345C2A6 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP10 DUP10 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2178 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x347A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x21C9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2A28 JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP JUMPDEST SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x21E8 DUP5 DUP5 PUSH2 0x1A58 JUMP JUMPDEST SWAP1 POP PUSH2 0x21F5 DUP5 DUP3 DUP5 PUSH2 0x2360 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 MLOAD PUSH2 0x220A SWAP1 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 DUP1 DUP4 DUP4 DUP6 PUSH1 0x0 DUP11 GAS CALL DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x223D JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x2246 JUMPI PUSH2 0x224B JUMP JUMPDEST PUSH1 0x0 SWAP7 POP PUSH2 0x224B JUMP JUMPDEST DUP5 MLOAD SWAP7 POP JUMPDEST POP PUSH1 0x4 DUP5 ADD PUSH1 0x40 MSTORE POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH12 0x204FCE5E3E25026110000000 DUP6 GT ISZERO PUSH2 0x2278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH12 0x204FCE5E3E25026110000000 DUP5 GT ISZERO PUSH2 0x2291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 LT PUSH2 0x22CA JUMPI PUSH1 0x12 DUP4 DUP4 SUB GT ISZERO PUSH2 0x22A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 DUP4 DUP4 SUB PUSH1 0xA EXP MUL PUSH8 0xDE0B6B3A7640000 DUP6 MUL DUP2 PUSH2 0x22C2 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x22F8 JUMP JUMPDEST PUSH1 0x12 DUP3 DUP5 SUB GT ISZERO PUSH2 0x22DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 DUP3 DUP5 SUB PUSH1 0xA EXP PUSH8 0xDE0B6B3A7640000 DUP7 MUL MUL DUP2 PUSH2 0x22F4 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 EQ ISZERO PUSH2 0x2313 JUMPI PUSH1 0x0 SWAP1 POP PUSH2 0x2334 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MUL SWAP1 POP DUP3 DUP5 DUP3 DUP2 PUSH2 0x2324 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x232F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x2348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x2353 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 DUP4 DUP4 PUSH1 0x14 DUP2 LT PUSH2 0x236D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x20 ADD DUP2 DUP2 MLOAD ADD SWAP2 POP DUP2 DUP2 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x500 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 SWAP1 JUMPDEST PUSH2 0x239D PUSH2 0x23B3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2395 JUMPI SWAP1 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23EF DUP3 CALLDATALOAD PUSH2 0x38BA JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2403 DUP3 CALLDATALOAD PUSH2 0x38CC JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x241C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x242F PUSH2 0x242A DUP3 PUSH2 0x36A4 JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2475 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x245B DUP9 DUP3 PUSH2 0x25E3 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2445 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x24A3 PUSH2 0x249E DUP3 PUSH2 0x36CC JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x24E9 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x24CF DUP9 DUP3 PUSH2 0x274D JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x24B9 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2517 PUSH2 0x2512 DUP3 PUSH2 0x36F4 JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x255D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x2543 DUP9 DUP3 PUSH2 0x282B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD SWAP3 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x252D JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2573 DUP3 CALLDATALOAD PUSH2 0x38DE JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2587 DUP3 CALLDATALOAD PUSH2 0x38EA JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x25A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x25B3 PUSH2 0x25AE DUP3 PUSH2 0x371C JUMP JUMPDEST PUSH2 0x3677 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x25CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25DA DUP4 DUP3 DUP5 PUSH2 0x3973 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x25F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25FF PUSH1 0x80 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x260F DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x262F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x263B DUP5 DUP3 DUP6 ADD PUSH2 0x258F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x264F DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2663 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2682 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268D PUSH2 0x100 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP5 DUP3 DUP6 ADD PUSH2 0x247F JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x26C9 DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x26DD DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x26F1 DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2705 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x2719 DUP5 DUP3 DUP6 ADD PUSH2 0x28F3 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x272D DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x2741 DUP5 DUP3 DUP6 ADD PUSH2 0x257B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x276B PUSH2 0x100 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2787 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2793 DUP5 DUP3 DUP6 ADD PUSH2 0x24F3 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x27A7 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x27BB DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x27CF DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x27E3 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x27F7 DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x280B DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x281F DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x283D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2847 PUSH1 0xA0 PUSH2 0x3677 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2857 DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 PUSH2 0x286B DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x287F DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2893 DUP5 DUP3 DUP6 ADD PUSH2 0x2567 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x28B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28BF DUP5 DUP3 DUP6 ADD PUSH2 0x240B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28D7 DUP3 CALLDATALOAD PUSH2 0x3914 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28EB DUP3 MLOAD PUSH2 0x3914 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28FF DUP3 CALLDATALOAD PUSH2 0x391E JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2927 DUP5 DUP3 DUP6 ADD PUSH2 0x23E3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2942 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2950 DUP5 DUP3 DUP6 ADD PUSH2 0x23F7 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x296C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x297A DUP6 DUP3 DUP7 ADD PUSH2 0x23E3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x298B DUP6 DUP3 DUP7 ADD PUSH2 0x28CB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x29A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x29C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29CD DUP5 DUP3 DUP6 ADD PUSH2 0x266F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x29E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29F6 DUP5 DUP3 DUP6 ADD PUSH2 0x28CB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2A11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2A1F DUP5 DUP3 DUP6 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2A3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2A49 DUP6 DUP3 DUP7 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2A5A DUP6 DUP3 DUP7 ADD PUSH2 0x28DF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A70 DUP4 DUP4 PUSH2 0x30C0 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A84 DUP4 DUP4 PUSH2 0x3123 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A98 DUP4 DUP4 PUSH2 0x31D3 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2AA9 DUP2 PUSH2 0x385B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AB8 DUP2 PUSH2 0x385B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AC7 DUP2 PUSH2 0x3849 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2AD6 DUP2 PUSH2 0x3849 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AE7 DUP3 PUSH2 0x376F JUMP JUMPDEST PUSH2 0x2AF1 DUP2 DUP6 PUSH2 0x37CD JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2B03 DUP6 PUSH2 0x3748 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2B3C JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2B1E DUP4 DUP4 MLOAD PUSH2 0x2A64 JUMP JUMPDEST SWAP3 POP PUSH2 0x2B29 DUP3 PUSH2 0x37A6 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2B06 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B58 DUP3 PUSH2 0x377A JUMP JUMPDEST PUSH2 0x2B62 DUP2 DUP6 PUSH2 0x37DE JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2B74 DUP6 PUSH2 0x3755 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2BAD JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2B8F DUP4 DUP4 MLOAD PUSH2 0x2A78 JUMP JUMPDEST SWAP3 POP PUSH2 0x2B9A DUP3 PUSH2 0x37B3 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2B77 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2BC9 DUP3 PUSH2 0x3785 JUMP JUMPDEST PUSH2 0x2BD3 DUP2 DUP6 PUSH2 0x37EF JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2BE5 DUP6 PUSH2 0x3762 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2C1E JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2C00 DUP4 DUP4 MLOAD PUSH2 0x2A8C JUMP JUMPDEST SWAP3 POP PUSH2 0x2C0B DUP3 PUSH2 0x37C0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP9 ADD SWAP8 POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x2BE8 JUMP JUMPDEST POP DUP2 SWAP7 POP DUP7 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2C38 DUP2 PUSH2 0x386D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C47 DUP2 PUSH2 0x386D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C56 DUP2 PUSH2 0x3879 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2C6D PUSH2 0x2C68 DUP3 PUSH2 0x3879 JUMP JUMPDEST PUSH2 0x39B5 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C7E DUP3 PUSH2 0x379B JUMP JUMPDEST PUSH2 0x2C88 DUP2 DUP6 PUSH2 0x3822 JUMP JUMPDEST SWAP4 POP PUSH2 0x2C98 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CAF DUP3 PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x2CB9 DUP2 DUP6 PUSH2 0x3800 JUMP JUMPDEST SWAP4 POP PUSH2 0x2CC9 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST PUSH2 0x2CD2 DUP2 PUSH2 0x39BF JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CE8 DUP3 PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x2CF2 DUP2 DUP6 PUSH2 0x3811 JUMP JUMPDEST SWAP4 POP PUSH2 0x2D02 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x3982 JUMP JUMPDEST PUSH2 0x2D0B DUP2 PUSH2 0x39BF JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2D1F DUP2 PUSH2 0x392B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x2D2E DUP2 PUSH2 0x394F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D41 PUSH1 0x14 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x436F6E7472616374206E6F74207061757365642E000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D81 PUSH1 0x1C DUP4 PUSH2 0x383E JUMP JUMPDEST SWAP2 POP PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x1C DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DC1 PUSH1 0xF DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x5472616E73666572206661696C65640000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E01 PUSH1 0xA DUP4 PUSH2 0x383E JUMP JUMPDEST SWAP2 POP PUSH32 0x646563696D616C73282900000000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0xA DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E41 PUSH1 0x29 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x454F412063616E6E6F742073656E6420657468657220746F207072696D617279 PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x2066616C6C6261636B0000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2EA7 PUSH1 0x11 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x496E76616C6964207369676E6174757265000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2EE7 PUSH1 0x12 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x47617320707269636520746F6F20686967680000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F27 PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4D696E696D756D2065786368616E67652072617465206E6F74206D6574000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F67 PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4661696C656420746F2067657420746F6B656E7320666F722073776170000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2FA7 PUSH1 0x26 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x476F74206C657373207468616E206D696E696D756D44657374696E6174696F6E PUSH1 0x0 DUP4 ADD MSTORE PUSH32 0x416D6F756E740000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x300D PUSH1 0x13 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x436F6E7472616374206973207061757365642E00000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x304D PUSH1 0x1D DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4E6F7420656E6F7567682064657374696E6174696F6E20616D6F756E74000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308D PUSH1 0x7 DUP4 PUSH2 0x382D JUMP JUMPDEST SWAP2 POP PUSH32 0x4578706972656400000000000000000000000000000000000000000000000000 PUSH1 0x0 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x30D8 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x2AA0 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x30F0 DUP3 DUP3 PUSH2 0x2CA4 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3105 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3118 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x0 DUP7 ADD MSTORE PUSH2 0x3141 DUP3 DUP3 PUSH2 0x2BBE JUMP JUMPDEST SWAP2 POP POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x3156 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3169 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x317C PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x318F PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x31A2 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x31B5 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2AA0 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x31C8 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0x31EB PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0x2ABE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x31FE PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x2ABE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x3211 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x3249 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x3224 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x2C2F JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x323C DUP3 DUP3 PUSH2 0x2ADC JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3252 DUP2 PUSH2 0x38A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3261 DUP2 PUSH2 0x38A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3270 DUP2 PUSH2 0x38AD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3282 DUP3 DUP5 PUSH2 0x2C73 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3298 DUP3 PUSH2 0x2D74 JUMP JUMPDEST SWAP2 POP PUSH2 0x32A4 DUP3 DUP5 PUSH2 0x2C5C JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32BE DUP3 PUSH2 0x2DF4 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x32DD PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2AAF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x32F8 PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x3305 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x3312 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x331F PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 ADD SWAP1 POP PUSH2 0x333D PUSH1 0x0 DUP4 ADD DUP10 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x334A PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x3357 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x3364 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x3371 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x337E PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x339E PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x2ACD JUMP JUMPDEST PUSH2 0x33AB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x33CC DUP2 DUP10 PUSH2 0x2B4D JUMP JUMPDEST SWAP1 POP PUSH2 0x33DB PUSH1 0x20 DUP4 ADD DUP9 PUSH2 0x2AAF JUMP JUMPDEST PUSH2 0x33E8 PUSH1 0x40 DUP4 ADD DUP8 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x33F5 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3402 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x340F PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x2AAF JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x342F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2C3E JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP PUSH2 0x344A PUSH1 0x0 DUP4 ADD DUP8 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3457 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3267 JUMP JUMPDEST PUSH2 0x3464 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x3471 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2C4D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3494 DUP2 DUP8 PUSH2 0x2CDD JUMP JUMPDEST SWAP1 POP PUSH2 0x34A3 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x34B0 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3258 JUMP JUMPDEST PUSH2 0x34BD PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x2C3E JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x34DB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2D16 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x34F6 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x2D25 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3515 DUP2 PUSH2 0x2D34 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3535 DUP2 PUSH2 0x2DB4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3555 DUP2 PUSH2 0x2E34 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3575 DUP2 PUSH2 0x2E9A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3595 DUP2 PUSH2 0x2EDA JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35B5 DUP2 PUSH2 0x2F1A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35D5 DUP2 PUSH2 0x2F5A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x35F5 DUP2 PUSH2 0x2F9A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3615 DUP2 PUSH2 0x3000 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3635 DUP2 PUSH2 0x3040 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3655 DUP2 PUSH2 0x3080 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x3671 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3258 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x369A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x36BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x36E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x370B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x3733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3854 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3866 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38C5 DUP3 PUSH2 0x38F4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38D7 DUP3 PUSH2 0x38F4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3936 DUP3 PUSH2 0x393D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3948 DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x395A DUP3 PUSH2 0x3961 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x396C DUP3 PUSH2 0x3883 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x39A0 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3985 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x39AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH6 0x627A7A723058 KECCAK256 0xf9 DUP2 0x2b MLOAD 0xef 0x22 0x1e 0xdd REVERT 0xba PUSH5 0xE552942C57 SWAP7 BLOCKHASH PUSH12 0x51EFB3593C09E0FE5A53202 0x1f PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
"sourceMap": "511:18683:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;577:7:7;;;;;;;;;;;576:8;568:40;;;;;;;;;;;;;;;;;;;;;;18954:12:13;18977:14;18994:10;18977:27;;19061:6;19049:19;19041:27;;19103:1;19095:4;:9;19091:93;;;19121:51;;;;;;;;;;;;;;;;;;;19091:93;615:1:7;;511:18683:13;5438:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5438:97:13;;;;;;;;;;;;;;;;:::i;:::-;;717:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;717:44:13;;;:::i;:::-;;;;;;;;;;;;;;;;3909:1054;;;;;;;;;;;;;;;;:::i;:::-;;1073:97:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1073:97:7;;;:::i;:::-;;358:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;358:72:7;;;:::i;:::-;;;;;;;;;;;;;;;;1045:114:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1045:114:4;;;:::i;:::-;;768:39:13;;8:9:-1;5:2;;;30:1;27;20:12;5:2;768:39:13;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;814:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;814:49:13;;;:::i;:::-;;;;;;;;;;;;;;;;891:95:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;891:95:7;;;:::i;:::-;;611:99:13;;8:9:-1;5:2;;;30:1;27;20:12;5:2;611:99:13;;;:::i;:::-;;;;;;;;;;;;;;;;242:28:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;242:28:4;;;:::i;:::-;;;;;;;;;;;;;;;;623:170:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;623:170:12;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5543:159:13;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5543:159:13;;;;;;;;;;;;;;;;:::i;:::-;;5331:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5331:99:13;;;;;;;;;;;;;;;;:::i;:::-;;1044::12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1044:99:12;;;;;;;;;;;;;;;;:::i;:::-;;1327:113:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1327:113:4;;;;;;;;;;;;;;;;:::i;:::-;;5438:97:13;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;5522:5:13;5504:7;:15;5512:6;5504:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;5438:97;:::o;717:44::-;;;;;;;;;;;;;:::o;3909:1054::-;577:7:7;;;;;;;;;;;576:8;568:40;;;;;;;;;;;;;;;;;;;;;;4029:5:13;2910:12;2886:5;:21;;;:36;2878:56;;;;;;;;;;;;;;;;;;;;;;4056:5;3026:12;3094:5;:11;;;3124:5;:21;;;3164:5;:21;;;3204:5;:8;;;3231:5;:17;;;3267:10;3065:227;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3065:227:13;;;3041:262;;;;;;3026:277;;3336:7;:211;3344:202;3449:4;3396:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3396:58:13;;;3368:101;;;;;;3484:5;:7;;;3506:5;:7;;;3528:5;:7;;;3344:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3344:202:13;;;;;;;;3336:211;;;;;;;;;;;;;;;;;;;;;;;;;3314:278;;;;;;;;;;;;;;;;;;;;;;4083:5;3707;:17;;;3692:11;:32;;3684:63;;;;;;;;;;;;;;;;;;;;;;4106:19;4128:1;4106:23;;4159:20;;4144:11;:35;4140:91;;4210:9;4196:23;;4140:91;4245:52;;:::i;:::-;4322:110;;;;;;;;4377:19;:17;:19::i;:::-;4322:110;;;;;;4412:9;4322:110;;;4308:8;4317:1;4308:11;;;;;;;;;;:124;;;;4462:17;4482:1;4462:21;;4443:311;4510:5;:11;;;:18;4498:9;:30;4443:311;;;4581:161;4611:5;:8;;;4638:5;:11;;;4650:9;4638:22;;;;;;;;;;;;;;4679:8;4706:5;:21;;;4581:11;:161::i;:::-;4543:11;;;;;;;4443:311;;;;4820:10;4769:62;;4797:5;:21;;;4769:62;;4787:5;:8;;;4769:62;;;;;;;;;;4842:33;4866:8;4842:23;:33::i;:::-;4904:1;4890:11;:15;4886:70;;;4922:22;4932:11;4922:9;:22::i;:::-;4886:70;3758:1;;3603;2945;;615::7;3909:1054:13;:::o;1073:97:7:-;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;761:7:7;;;;;;;;;;;753:40;;;;;;;;;;;;;;;;;;;;;;1137:5;1127:7;;:15;;;;;;;;;;;;;;;;;;1154:10;;;;;;;;;;1073:97::o;358:72::-;397:4;417:7;;;;;;;;;;;410:14;;358:72;:::o;1045:114:4:-;753:5;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1122:5;;;;;;;;;;;1103:25;;;;;;;;;;;;1151:1;1135:5;;:18;;;;;;;;;;;;;;;;;;1045:114::o;768:39:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;814:49::-;;;;:::o;891:95:7:-;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;577:7:7;;;;;;;;;;;576:8;568:40;;;;;;;;;;;;;;;;;;;;;;956:4;946:7;;:14;;;;;;;;;;;;;;;;;;972:8;;;;;;;;;;891:95::o;611:99:13:-;661:42;611:99;:::o;242:28:4:-;;;;;;;;;;;;;:::o;623:170:12:-;707:4;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;:54:12;762:6;770:5;;;;;;;;;;;777:7;731:30;:54::i;:::-;724:61;;623:170;;;;:::o;5543:159:13:-;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;5674:20:13;5651;:43;;;;5543:159;:::o;5331:99::-;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;5418:4:13;5397:7;:18;5405:9;5397:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;5331:99;:::o;1044::12:-;753:5:4;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1112:5:12;;;;;;;;;;;:14;;:23;1127:7;1112:23;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1112:23:12;1044:99;:::o;1327:113:4:-;753:5;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1405:29;1424:9;1405:18;:29::i;:::-;1327:113;:::o;1152:78:11:-;1198:7;548:3;1209:18;;1152:78;:::o;5758:4435:13:-;5992:135;6035:8;6058:4;:11;;;6070:1;6058:14;;;;;;;;;;;;;;:26;;;6099:4;:17;;;5992:28;:135::i;:::-;5973:332;;6158:4;:13;;;6154:140;;;6192:39;;;;;;;;;;;;;;;;;;;6154:140;6272:7;;5973:332;6315:29;6347:1;6315:33;;6359:22;6384:1;6359:26;;6396:17;6416:1;6396:21;;6447:18;6468:1;6447:22;;6428:1972;6497:4;:11;;;:18;6484:10;:31;6428:1972;;;6605:4;:23;;;6591:10;:37;:63;;;;;6632:4;:22;;;6591:63;6569:376;;;6701:228;6731:8;6762:4;:11;;;6774:10;6762:23;;;;;;;;;;;;;;:35;;;6820:15;6872:1;6858:10;:15;:52;;6896:14;6858:52;;;6876:4;:17;;;6858:52;6701:7;:228::i;:::-;6689:240;;6569:376;6959:17;7021:430;7052:4;:11;;;7064:10;7052:23;;;;;;;;;;;;;;7094:8;7121:315;7167:1;7153:10;:15;:52;;7191:14;7153:52;;;7171:4;:17;;;7153:52;7228:8;7237:149;7293:8;7328:4;:11;;;7340:10;7328:23;;;;;;;;;;;;;;:35;;;7237:29;:149::i;:::-;7228:159;;;;;;;;;;;:189;;;7121:9;:315::i;:::-;7021:12;:430::i;:::-;6991:460;;;;;;;;7489:4;:11;;;7501:10;7489:23;;;;;;;;;;;;;;:38;;;7488:39;:103;;;;;7561:4;:11;;;7573:10;7561:23;;;;;;;;;;;;;;:30;;;7544:14;:47;7488:103;7466:301;;;7630:4;:13;;;7626:101;;;7668:39;;;;;;;;;;;;;;;;;;;7626:101;7745:7;;;;;;;7466:301;7799:1;7785:10;:15;7781:204;;;7845:9;7821:33;;7890:1;7877:9;:14;7873:97;;7941:9;7916:34;;;;7873:97;7781:204;8035:4;:23;;;8021:10;:37;:64;;;;;8063:4;:22;;;8062:23;8021:64;7999:390;;;8132:195;8162:8;8193:4;:11;;;8205:10;8193:23;;;;;;;;;;;;;;:40;;;8256:15;8294:14;8132:7;:195::i;:::-;8120:207;;8364:9;8346:27;;;;7999:390;6428:1972;6530:12;;;;;;;6428:1972;;;;8437:16;8415:416;8468:4;:11;;;8480:1;8468:14;;;;;;;;;;;;;;:26;;;8509:4;:11;;;8542:1;8521:4;:11;;;:18;:22;8509:35;;;;;;;;;;;;;;:52;;;8576:21;8612:14;8641:4;:22;;;:155;;8743:4;:11;;;8755:4;:23;;;8743:36;;;;;;;;;;;;;;:53;;;8641:155;;;8679:4;:11;;;8691:4;:23;;;8679:36;;;;;;;;;;;;;;:48;;;8641:155;8811:9;8415:416;;;;;;;;;;;;;;;;;;;;8865:4;:29;;;8848:14;:46;8844:489;;;8911:48;;;;;;;;;;;;;;;;;;;8844:489;8995:260;9031:4;:11;;;9043:1;9031:14;;;;;;;;;;;;;;:26;;;9076:4;:11;;;9109:1;9088:4;:11;;;:18;:22;9076:35;;;;;;;;;;;;;;:52;;;9147:4;:17;;;9183:14;9216:4;:24;;;8995:17;:260::i;:::-;8977:356;;;9282:39;;;;;;;;;;;;;;;;;;;8977:356;9385:10;9361:34;;:4;:20;;;:34;;;;:87;;;;;9444:3;9412:36;;:4;:20;;;:36;;;;9361:87;9343:843;;;9475:29;9507:142;9555:8;9582:4;:11;;;9615:1;9594:4;:11;;;:18;:22;9582:35;;;;;;;;;;;;;;:52;;;9507:29;:142::i;:::-;9475:174;;9664:20;9687:114;9714:14;9747:8;9756:21;9747:31;;;;;;;;;;;:39;;;9687:8;:114::i;:::-;9664:137;;9816:166;9849:8;9876:21;9916:4;:20;;;9955:12;9816:14;:166::i;:::-;9997:177;10049:8;10076:4;:11;;;10109:1;10088:4;:11;;;:18;:22;10076:35;;;;;;;;;;;;;;:52;;;10147:12;9997:33;:177::i;:::-;9343:843;;;5758:4435;;;;;;;;:::o;16830:633::-;16972:20;16995:1;16972:24;;16953:503;17026:15;17011:12;:30;16953:503;;;17135:1;17119:12;:17;;:89;;;;;17204:3;17157:51;;:8;17166:12;17157:22;;;;;;;;;;;:35;;;:51;;;17119:89;17097:168;;;17243:7;;;17097:168;17279:165;17312:8;17339:12;17370:10;17399:8;17408:12;17399:22;;;;;;;;;;;:30;;;17279:14;:165::i;:::-;17056:14;;;;;;;16953:503;;;;16830:633;;:::o;4971:352::-;5031:20;5054:9;5031:32;;5074:16;5107:12;5093:11;:26;5074:45;;5130:20;5153:119;5197:5;5188;5177:8;:16;5176:26;;;;;;5243:17;5233:5;5218:12;:20;5217:44;;;;;;5153:8;:119::i;:::-;5130:142;;661:42;5283:18;;;5302:12;5283:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5283:32:13;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5283:32:13;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5283:32:13;;;;;;;;;;4971:352;;;;:::o;59:306:2:-;151:12;189:13;:18;;261:3;266:6;208:65;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;208:65:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;208:65:2;189:85;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;176:98:2;;;;;293:7;285:35;;;;;;;;;;;;;;;;;;;;;;340:17;:15;:17::i;:::-;333:24;;59:306;;;;;:::o;1581:183:4:-;1681:1;1660:23;;:9;:23;;;;1652:32;;;;;;1724:9;1696:38;;1717:5;;;;;;;;;;;1696:38;;;;;;;;;;;;1749:9;1741:5;;:17;;;;;;;;;;;;;;;;;;1581:183;:::o;15713:1109:13:-;15894:4;15924:19;:17;:19::i;:::-;15915:28;;:5;:28;;;15911:173;;;15979:8;15988:1;15979:11;;;;;;;;;;;:19;;;15964:12;:34;15960:87;;;16026:5;16019:12;;;;15960:87;16068:4;16061:11;;;;15911:173;16096:18;16117:46;16147:8;16157:5;16117:29;:46::i;:::-;16096:67;;16193:8;16202:10;16193:20;;;;;;;;;;;:28;;;16178:12;:43;16174:619;;;16238:12;16286:18;;;;;;;;;;;16278:32;;16445:5;16473:10;16514:4;16557:8;16566:10;16557:20;;;;;;;;;;;:28;;;16542:12;:43;16329:275;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16329:275:13;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;16329:275:13;16278:341;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;16265:354:13;;;;;16638:7;16634:121;;;16697:12;16666:8;16675:10;16666:20;;;;;;;;;;;:28;;:43;;;;;16735:4;16728:11;;;;;;16634:121;16776:5;16769:12;;;;;;16174:619;16810:4;16803:11;;;15713:1109;;;;;;:::o;14929:776::-;15131:17;15161:15;15187;15161:42;;15214:21;15238:7;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15238:31:13;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15238:31:13;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15238:31:13;;;;;;;;;15214:55;;15292:41;15305:12;15319:13;15292:12;:41::i;:::-;15280:53;;15344:163;15373:8;15396:46;15426:8;15436:5;15396:29;:46::i;:::-;15457:15;15487:9;15344:14;:163::i;:::-;15518:152;15566:8;15589:46;15619:8;15629:5;15589:29;:46::i;:::-;15650:9;15518:33;:152::i;:::-;15688:9;15681:16;;;;14929:776;;;;;;:::o;189:532:9:-;307:7;337:13;353:1;337:17;;332:382;364:15;356:5;:23;332:382;;;441:5;409:37;;:8;418:5;409:15;;;;;;;;;;;:28;;;:37;;;405:298;;;474:5;467:12;;;;;405:298;532:1;523:5;:10;;:58;;;;;577:3;537:44;;:8;546:5;537:15;;;;;;;;;;;:28;;;:44;;;523:58;501:202;;;634:22;;;;;;;;647:5;634:22;;;;;;654:1;634:22;;;616:8;625:5;616:15;;;;;;;;;;:40;;;;682:5;675:12;;;;;501:202;381:7;;;;;;;332:382;;;;189:532;;;;;:::o;6540:106:11:-;6598:7;6629:1;6625;:5;:13;;6637:1;6625:13;;;6633:1;6625:13;6618:20;;6540:106;;;;:::o;10201:2033:13:-;10375:18;10395:21;10429:17;10449:1;10429:21;;10461:20;10484:1;10461:24;;10496:20;10519:1;10496:24;;10661:28;10692:21;10707:5;10692:14;:21::i;:::-;10661:52;;10743:18;10764:1;10743:22;;10724:1228;10793:5;:12;;;:19;10780:10;:32;10724:1228;;;10912:16;10904:5;10890:10;10871:16;:29;10870:39;:58;10866:205;;;10949:5;;10866:205;10980:5;:20;;;:49;;;;;11017:5;:12;;;11004:9;:25;10980:49;10976:95;;;11050:5;;10976:95;11085:19;11107:203;11140:5;:12;;;11153:10;11140:24;;;;;;;;;;;;;;:40;;;11199:5;:12;;;11212:10;11199:24;;;;;;;;;;;;;;:40;;;11258:20;11297:12;11107:14;:203::i;:::-;11085:225;;11353:220;11384:5;:12;;;11397:10;11384:24;;;;;;;;;;;;;;11446:10;11427:16;:29;11475:5;:20;;;11514:5;:17;;;11550:8;11353:12;:220::i;:::-;11325:248;;;;;;;;11669:5;:12;;;11682:10;11669:24;;;;;;;;;;;;;;:40;;;11613:5;:12;;;11626:10;11613:24;;;;;;;;;;;;;;:40;;;:96;11588:122;;;;11741:5;:12;;;11754:10;11741:24;;;;;;;;;;;;;;:40;;;11729:9;:52;11725:134;;;11833:9;11819:11;:23;11802:41;;;;11725:134;11887:9;11873:23;;;;11928:12;11911:29;;;;10724:1228;10827:12;;;;;;;10724:1228;;;;11962:129;12007:8;12030:5;:22;;;12067:13;11962:30;:129::i;:::-;12102:124;12150:8;12173:5;:17;;;12205:10;12102:33;:124::i;:::-;10201:2033;;;;;;;;;;:::o;14181:740::-;14403:11;14427:22;14467:19;:17;:19::i;:::-;14452:34;;:11;:34;;;:90;;14512:30;14530:11;14512:17;:30::i;:::-;14452:90;;;14498:2;14452:90;14427:115;;14553:27;14603:19;:17;:19::i;:::-;14583:39;;:16;:39;;;:100;;14648:35;14666:16;14648:17;:35::i;:::-;14583:100;;;14634:2;14583:100;14553:130;;14694:15;14712:154;14748:12;14775:17;14807:14;14836:19;14712:21;:154::i;:::-;14694:172;;14894:19;14884:7;:29;14877:36;;;;;14181:740;;;;;;;:::o;213:100:3:-;271:7;298:1;294;:5;:13;;306:1;294:13;;;302:1;294:13;287:20;;213:100;;;;:::o;17471:714:13:-;17700:1;17686:11;:15;17682:496;;;17759:19;:17;:19::i;:::-;17722:56;;:8;17731:10;17722:20;;;;;;;;;;;:33;;;:56;;;17718:449;;;17799:11;:20;;:33;17820:11;17799:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17799:33:13;17718:449;;;17903:189;17960:8;17969:10;17960:20;;;;;;;;;;;:33;;;18020:11;18058;17903:30;:189::i;:::-;17873:278;;;;;;;;;;;;;;;;;;;;;;17718:449;17682:496;17471:714;;;;:::o;1228:286:9:-;1390:18;1411:33;1421:8;1431:12;1411:9;:33::i;:::-;1390:54;;1455:51;1469:8;1479:10;1491:14;1455:13;:51::i;:::-;1228:286;;;;:::o;1052:391:2:-;1102:12;1157:16;1192:1;1187:53;;;;1259:2;1254:103;;;;1408:1;1405;1398:12;1187:53;1224:1;1213:12;;1187:53;;1254:103;1302:2;1299:1;1296;1281:24;1340:1;1334:8;1323:19;;1150:275;;1135:301;:::o;18408:177:13:-;18497:7;18529:48;18542:25;18555:6;18563:3;18542:12;:25::i;:::-;18569:7;18529:12;:48::i;:::-;18522:55;;18408:177;;;;:::o;1522:218:9:-;1718:14;1684:8;1693:12;1684:22;;;;;;;;;;;:30;;:48;;;;;;;;;;;1522:218;;;:::o;13827:346:13:-;13899:19;13941:11;13955:1;13941:15;;13936:201;13966:5;:12;;;:19;13958:5;:27;;;13936:201;;;14090:5;:12;;;14103:5;14090:19;;;;;;;;;;;;;;;;:35;;;14039:5;:12;;;14052:5;14039:19;;;;;;;;;;;;;;;;:35;;;:86;14011:114;;;;13987:7;;;;;;;13936:201;;;;14154:11;14147:18;;13827:346;;;:::o;13349:470::-;13534:19;13586:1;13570:12;:17;:53;;;;13609:14;13591;:32;13570:53;13566:246;;;13647:14;13640:21;;;;13566:246;13780:20;13751:12;13733:14;13716;:31;13715:48;13714:86;;;;;;13694:106;;13349:470;;;;;;;:::o;12242:1099::-;12473:13;12488:16;12537:19;:17;:19::i;:::-;12521:35;;:12;:35;;;12517:817;;;12609:5;:21;;;12593:65;;;12679:12;12711:5;:20;;;12750:12;12781;12812:14;12593:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12593:248:13;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12593:248:13;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12593:248:13;;;;;;;;;12573:268;;;;;;;;12517:817;;;12874:199;12907:8;12934:53;12964:8;12974:12;12934:29;:53::i;:::-;13006:5;:21;;;13046:12;12874:14;:199::i;:::-;13124:5;:21;;;13108:65;;;13192:5;:20;;;13231:12;13262;13293:14;13108:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13108:214:13;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13108:214:13;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13108:214:13;;;;;;;;;13088:234;;;;;;;;12517:817;12242:1099;;;;;;;;:::o;729:274:9:-;885:18;906:33;916:8;926:12;906:9;:33::i;:::-;885:54;;950:45;961:8;971:10;983:11;950:10;:45::i;:::-;729:274;;;;:::o;1615:1531:11:-;1687:16;1721:18;1749:23;;;;;;;;;;;;;;1721:52;;2040:4;2034:11;2120;2116:3;2109:23;2171:4;2207;2661:10;2575:3;2507:17;2448:3;2395:1;2336:5;2281:3;2242:497;2762:7;2788:1;2783:122;;;;2924:1;2919:104;;;;2755:268;;2783:122;2821:1;2809:13;;2783:122;;2919:104;2963:3;2957:10;2945:22;;2755:268;;3057:4;3053:3;3049:13;3044:4;3037:26;1959:1180;;;;;;;;:::o;5792:628::-;5918:4;229:6;5948:9;:20;;5940:29;;;;;;229:6;5988:10;:21;;5980:30;;;;;;6042:11;6027;:26;6023:390;;389:2;6093:11;6079;:25;6078:43;;6070:52;;;;;;6209:9;6193:11;6179;:25;6172:2;:33;6171:47;176:6;6145:10;:22;:74;;;;;;6137:83;;;;6023:390;389:2;6276:11;6262;:25;6261:43;;6253:52;;;;;;6391:9;6375:11;6361;:25;6354:2;:33;176:6;6328:10;:22;:60;:72;;;;;;6320:81;;5792:628;;;;;;;:::o;213:400:8:-;273:7;507:1;501:2;:7;497:38;;;526:1;519:8;;;;497:38;543:9;560:2;555;:7;543:19;;587:2;581;577:1;:6;;;;;;:12;569:21;;;;;;606:1;599:8;;;213:400;;;;;:::o;728:285::-;788:7;817:1;812:2;:6;804:15;;;;;;884:9;901:2;896;:7;;;;;;884:19;;1006:1;999:8;;;728:285;;;;:::o;1011:209:9:-;1201:11;1167:8;1176:12;1167:22;;;;;;;;;;;:30;;:45;;;;;;;;;;;1011:209;;;:::o;511:18683:13:-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;;57:66;;;;;130:134;;205:54;251:6;238:20;205:54;;;196:63;;190:74;;;;;307:727;;439:3;432:4;424:6;420:17;416:27;406:2;;457:1;454;447:12;406:2;494:6;481:20;516:95;531:79;603:6;531:79;;;516:95;;;507:104;;628:5;653:6;646:5;639:21;683:4;675:6;671:17;661:27;;705:4;700:3;696:14;689:21;;758:6;791:1;776:252;801:6;798:1;795:13;776:252;;;884:3;871:17;863:6;859:30;908:56;960:3;948:10;908:56;;;903:3;896:69;988:4;983:3;979:14;972:21;;1016:4;1011:3;1007:14;1000:21;;833:195;823:1;820;816:9;811:14;;776:252;;;780:14;399:635;;;;;;;;1077:724;;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1263:6;1250:20;1285:94;1300:78;1371:6;1300:78;;;1285:94;;;1276:103;;1396:5;1421:6;1414:5;1407:21;1451:4;1443:6;1439:17;1429:27;;1473:4;1468:3;1464:14;1457:21;;1526:6;1559:1;1544:251;1569:6;1566:1;1563:13;1544:251;;;1652:3;1639:17;1631:6;1627:30;1676:55;1727:3;1715:10;1676:55;;;1671:3;1664:68;1755:4;1750:3;1746:14;1739:21;;1783:4;1778:3;1774:14;1767:21;;1601:194;1591:1;1588;1584:9;1579:14;;1544:251;;;1548:14;1168:633;;;;;;;;1845:727;;1977:3;1970:4;1962:6;1958:17;1954:27;1944:2;;1995:1;1992;1985:12;1944:2;2032:6;2019:20;2054:95;2069:79;2141:6;2069:79;;;2054:95;;;2045:104;;2166:5;2191:6;2184:5;2177:21;2221:4;2213:6;2209:17;2199:27;;2243:4;2238:3;2234:14;2227:21;;2296:6;2329:1;2314:252;2339:6;2336:1;2333:13;2314:252;;;2422:3;2409:17;2401:6;2397:30;2446:56;2498:3;2486:10;2446:56;;;2441:3;2434:69;2526:4;2521:3;2517:14;2510:21;;2554:4;2549:3;2545:14;2538:21;;2371:195;2361:1;2358;2354:9;2349:14;;2314:252;;;2318:14;1937:635;;;;;;;;2580:112;;2644:43;2679:6;2666:20;2644:43;;;2635:52;;2629:63;;;;;2699:118;;2766:46;2804:6;2791:20;2766:46;;;2757:55;;2751:66;;;;;2825:432;;2922:3;2915:4;2907:6;2903:17;2899:27;2889:2;;2940:1;2937;2930:12;2889:2;2977:6;2964:20;2999:60;3014:44;3051:6;3014:44;;;2999:60;;;2990:69;;3079:6;3072:5;3065:21;3115:4;3107:6;3103:17;3148:4;3141:5;3137:16;3183:3;3174:6;3169:3;3165:16;3162:25;3159:2;;;3200:1;3197;3190:12;3159:2;3210:41;3244:6;3239:3;3234;3210:41;;;2882:375;;;;;;;;3297:890;;3405:4;3393:9;3388:3;3384:19;3380:30;3377:2;;;3423:1;3420;3413:12;3377:2;3441:20;3456:4;3441:20;;;3432:29;;3522:1;3553:57;3606:3;3597:6;3586:9;3582:22;3553:57;;;3547:3;3540:5;3536:15;3529:82;3471:151;3710:2;3699:9;3695:18;3682:32;3734:18;3726:6;3723:30;3720:2;;;3766:1;3763;3756:12;3720:2;3801:54;3851:3;3842:6;3831:9;3827:22;3801:54;;;3794:4;3787:5;3783:16;3776:80;3632:235;3928:2;3961:49;4006:3;3997:6;3986:9;3982:22;3961:49;;;3954:4;3947:5;3943:16;3936:75;3877:145;4083:2;4116:49;4161:3;4152:6;4141:9;4137:22;4116:49;;;4109:4;4102:5;4098:16;4091:75;4032:145;3371:816;;;;;4235:1493;;4356:5;4344:9;4339:3;4335:19;4331:31;4328:2;;;4375:1;4372;4365:12;4328:2;4393:21;4408:5;4393:21;;;4384:30;;4493:1;4482:9;4478:17;4465:31;4516:18;4508:6;4505:30;4502:2;;;4548:1;4545;4538:12;4502:2;4582:88;4666:3;4657:6;4646:9;4642:22;4582:88;;;4576:3;4569:5;4565:15;4558:113;4424:258;4743:2;4776:57;4829:3;4820:6;4809:9;4805:22;4776:57;;;4769:4;4762:5;4758:16;4751:83;4692:153;4906:2;4939:49;4984:3;4975:6;4964:9;4960:22;4939:49;;;4932:4;4925:5;4921:16;4914:75;4855:145;5048:2;5081:49;5126:3;5117:6;5106:9;5102:22;5081:49;;;5074:4;5067:5;5063:16;5056:75;5010:132;5199:3;5233:49;5278:3;5269:6;5258:9;5254:22;5233:49;;;5226:4;5219:5;5215:16;5208:75;5152:142;5341:3;5375:47;5418:3;5409:6;5398:9;5394:22;5375:47;;;5368:4;5361:5;5357:16;5350:73;5304:130;5481:3;5515:49;5560:3;5551:6;5540:9;5536:22;5515:49;;;5508:4;5501:5;5497:16;5490:75;5444:132;5623:3;5657:49;5702:3;5693:6;5682:9;5678:22;5657:49;;;5650:4;5643:5;5639:16;5632:75;5586:132;4322:1406;;;;;5766:1544;;5873:5;5861:9;5856:3;5852:19;5848:31;5845:2;;;5892:1;5889;5882:12;5845:2;5910:21;5925:5;5910:21;;;5901:30;;6011:1;6000:9;5996:17;5983:31;6034:18;6026:6;6023:30;6020:2;;;6066:1;6063;6056:12;6020:2;6100:89;6185:3;6176:6;6165:9;6161:22;6100:89;;;6094:3;6087:5;6083:15;6076:114;5941:260;6266:2;6299:49;6344:3;6335:6;6324:9;6320:22;6299:49;;;6292:4;6285:5;6281:16;6274:75;6211:149;6430:2;6463:49;6508:3;6499:6;6488:9;6484:22;6463:49;;;6456:4;6449:5;6445:16;6438:75;6370:154;6582:2;6615:49;6660:3;6651:6;6640:9;6636:22;6615:49;;;6608:4;6601:5;6597:16;6590:75;6534:142;6740:3;6774:49;6819:3;6810:6;6799:9;6795:22;6774:49;;;6767:4;6760:5;6756:16;6749:75;6686:149;6898:3;6932:46;6974:3;6965:6;6954:9;6950:22;6932:46;;;6925:4;6918:5;6914:16;6907:72;6845:145;7051:3;7085:57;7138:3;7129:6;7118:9;7114:22;7085:57;;;7078:4;7071:5;7067:16;7060:83;7000:154;7208:3;7242:46;7284:3;7275:6;7264:9;7260:22;7242:46;;;7235:4;7228:5;7224:16;7217:72;7164:136;5839:1471;;;;;7349:1049;;7457:4;7445:9;7440:3;7436:19;7432:30;7429:2;;;7475:1;7472;7465:12;7429:2;7493:20;7508:4;7493:20;;;7484:29;;7570:1;7601:49;7646:3;7637:6;7626:9;7622:22;7601:49;;;7595:3;7588:5;7584:15;7577:74;7523:139;7724:2;7757:49;7802:3;7793:6;7782:9;7778:22;7757:49;;;7750:4;7743:5;7739:16;7732:75;7672:146;7870:2;7903:49;7948:3;7939:6;7928:9;7924:22;7903:49;;;7896:4;7889:5;7885:16;7878:75;7828:136;8024:2;8057:46;8099:3;8090:6;8079:9;8075:22;8057:46;;;8050:4;8043:5;8039:16;8032:72;7974:141;8195:3;8184:9;8180:19;8167:33;8220:18;8212:6;8209:30;8206:2;;;8252:1;8249;8242:12;8206:2;8287:89;8372:3;8363:6;8352:9;8348:22;8287:89;;;8280:4;8273:5;8269:16;8262:115;8125:263;7423:975;;;;;8405:118;;8472:46;8510:6;8497:20;8472:46;;;8463:55;;8457:66;;;;;8530:122;;8608:39;8639:6;8633:13;8608:39;;;8599:48;;8593:59;;;;;8659:114;;8724:44;8760:6;8747:20;8724:44;;;8715:53;;8709:64;;;;;8780:241;;8884:2;8872:9;8863:7;8859:23;8855:32;8852:2;;;8900:1;8897;8890:12;8852:2;8935:1;8952:53;8997:7;8988:6;8977:9;8973:22;8952:53;;;8942:63;;8914:97;8846:175;;;;;9028:257;;9140:2;9128:9;9119:7;9115:23;9111:32;9108:2;;;9156:1;9153;9146:12;9108:2;9191:1;9208:61;9261:7;9252:6;9241:9;9237:22;9208:61;;;9198:71;;9170:105;9102:183;;;;;9292:366;;;9413:2;9401:9;9392:7;9388:23;9384:32;9381:2;;;9429:1;9426;9419:12;9381:2;9464:1;9481:53;9526:7;9517:6;9506:9;9502:22;9481:53;;;9471:63;;9443:97;9571:2;9589:53;9634:7;9625:6;9614:9;9610:22;9589:53;;;9579:63;;9550:98;9375:283;;;;;;9665:391;;9801:2;9789:9;9780:7;9776:23;9772:32;9769:2;;;9817:1;9814;9807:12;9769:2;9880:1;9869:9;9865:17;9852:31;9903:18;9895:6;9892:30;9889:2;;;9935:1;9932;9925:12;9889:2;9955:85;10032:7;10023:6;10012:9;10008:22;9955:85;;;9945:95;;9831:215;9763:293;;;;;10063:241;;10167:2;10155:9;10146:7;10142:23;10138:32;10135:2;;;10183:1;10180;10173:12;10135:2;10218:1;10235:53;10280:7;10271:6;10260:9;10256:22;10235:53;;;10225:63;;10197:97;10129:175;;;;;10311:263;;10426:2;10414:9;10405:7;10401:23;10397:32;10394:2;;;10442:1;10439;10432:12;10394:2;10477:1;10494:64;10550:7;10541:6;10530:9;10526:22;10494:64;;;10484:74;;10456:108;10388:186;;;;;10581:399;;;10713:2;10701:9;10692:7;10688:23;10684:32;10681:2;;;10729:1;10726;10719:12;10681:2;10764:1;10781:64;10837:7;10828:6;10817:9;10813:22;10781:64;;;10771:74;;10743:108;10882:2;10900:64;10956:7;10947:6;10936:9;10932:22;10900:64;;;10890:74;;10861:109;10675:305;;;;;;10988:233;;11127:88;11211:3;11203:6;11127:88;;;11113:102;;11106:115;;;;;11230:229;;11367:86;11449:3;11441:6;11367:86;;;11353:100;;11346:113;;;;;11468:233;;11607:88;11691:3;11683:6;11607:88;;;11593:102;;11586:115;;;;;11709:134;11798:39;11831:5;11798:39;;;11793:3;11786:52;11780:63;;;11850:144;11949:39;11982:5;11949:39;;;11944:3;11937:52;11931:63;;;12001:110;12074:31;12099:5;12074:31;;;12069:3;12062:44;12056:55;;;12118:120;12201:31;12226:5;12201:31;;;12196:3;12189:44;12183:55;;;12312:895;;12481:69;12544:5;12481:69;;;12563:95;12651:6;12646:3;12563:95;;;12556:102;;12681:3;12723:4;12715:6;12711:17;12706:3;12702:27;12749:71;12814:5;12749:71;;;12841:1;12826:342;12851:6;12848:1;12845:13;12826:342;;;12913:9;12907:4;12903:20;12898:3;12891:33;12939:102;13036:4;13027:6;13021:13;12939:102;;;12931:110;;13058:75;13126:6;13058:75;;;13048:85;;13156:4;13151:3;13147:14;13140:21;;12873:1;12870;12866:9;12861:14;;12826:342;;;12830:14;13181:4;13174:11;;13198:3;13191:10;;12460:747;;;;;;;;;13280:907;;13457:68;13519:5;13457:68;;;13538:104;13635:6;13630:3;13538:104;;;13531:111;;13665:3;13707:4;13699:6;13695:17;13690:3;13686:27;13733:70;13797:5;13733:70;;;13824:1;13809:339;13834:6;13831:1;13828:13;13809:339;;;13896:9;13890:4;13886:20;13881:3;13874:33;13922:100;14017:4;14008:6;14002:13;13922:100;;;13914:108;;14039:74;14106:6;14039:74;;;14029:84;;14136:4;14131:3;14127:14;14120:21;;13856:1;13853;13849:9;13844:14;;13809:339;;;13813:14;14161:4;14154:11;;14178:3;14171:10;;13436:751;;;;;;;;;14262:895;;14431:69;14494:5;14431:69;;;14513:95;14601:6;14596:3;14513:95;;;14506:102;;14631:3;14673:4;14665:6;14661:17;14656:3;14652:27;14699:71;14764:5;14699:71;;;14791:1;14776:342;14801:6;14798:1;14795:13;14776:342;;;14863:9;14857:4;14853:20;14848:3;14841:33;14889:102;14986:4;14977:6;14971:13;14889:102;;;14881:110;;15008:75;15076:6;15008:75;;;14998:85;;15106:4;15101:3;15097:14;15090:21;;14823:1;14820;14816:9;14811:14;;14776:342;;;14780:14;15131:4;15124:11;;15148:3;15141:10;;14410:747;;;;;;;;;15165:101;15232:28;15254:5;15232:28;;;15227:3;15220:41;15214:52;;;15273:111;15350:28;15372:5;15350:28;;;15345:3;15338:41;15332:52;;;15391:120;15474:31;15499:5;15474:31;;;15469:3;15462:44;15456:55;;;15518:159;15619:52;15639:31;15664:5;15639:31;;;15619:52;;;15614:3;15607:65;15601:76;;;15684:356;;15812:38;15844:5;15812:38;;;15862:88;15943:6;15938:3;15862:88;;;15855:95;;15955:52;16000:6;15995:3;15988:4;15981:5;15977:16;15955:52;;;16028:6;16023:3;16019:16;16012:23;;15792:248;;;;;;16047:315;;16143:34;16171:5;16143:34;;;16189:60;16242:6;16237:3;16189:60;;;16182:67;;16254:52;16299:6;16294:3;16287:4;16280:5;16276:16;16254:52;;;16327:29;16349:6;16327:29;;;16322:3;16318:39;16311:46;;16123:239;;;;;;16369:335;;16475:34;16503:5;16475:34;;;16521:70;16584:6;16579:3;16521:70;;;16514:77;;16596:52;16641:6;16636:3;16629:4;16622:5;16618:16;16596:52;;;16669:29;16691:6;16669:29;;;16664:3;16660:39;16653:46;;16455:249;;;;;;16711:154;16808:51;16853:5;16808:51;;;16803:3;16796:64;16790:75;;;16872:180;16982:64;17040:5;16982:64;;;16977:3;16970:77;16964:88;;;17060:364;;17220:67;17284:2;17279:3;17220:67;;;17213:74;;17320:66;17316:1;17311:3;17307:11;17300:87;17415:2;17410:3;17406:12;17399:19;;17206:218;;;;17433:400;;17611:85;17693:2;17688:3;17611:85;;;17604:92;;17729:66;17725:1;17720:3;17716:11;17709:87;17824:2;17819:3;17815:12;17808:19;;17597:236;;;;17842:364;;18002:67;18066:2;18061:3;18002:67;;;17995:74;;18102:66;18098:1;18093:3;18089:11;18082:87;18197:2;18192:3;18188:12;18181:19;;17988:218;;;;18215:400;;18393:85;18475:2;18470:3;18393:85;;;18386:92;;18511:66;18507:1;18502:3;18498:11;18491:87;18606:2;18601:3;18597:12;18590:19;;18379:236;;;;18624:465;;18784:67;18848:2;18843:3;18784:67;;;18777:74;;18884:66;18880:1;18875:3;18871:11;18864:87;18985:66;18980:2;18975:3;18971:12;18964:88;19080:2;19075:3;19071:12;19064:19;;18770:319;;;;19098:364;;19258:67;19322:2;19317:3;19258:67;;;19251:74;;19358:66;19354:1;19349:3;19345:11;19338:87;19453:2;19448:3;19444:12;19437:19;;19244:218;;;;19471:364;;19631:67;19695:2;19690:3;19631:67;;;19624:74;;19731:66;19727:1;19722:3;19718:11;19711:87;19826:2;19821:3;19817:12;19810:19;;19617:218;;;;19844:364;;20004:67;20068:2;20063:3;20004:67;;;19997:74;;20104:66;20100:1;20095:3;20091:11;20084:87;20199:2;20194:3;20190:12;20183:19;;19990:218;;;;20217:364;;20377:67;20441:2;20436:3;20377:67;;;20370:74;;20477:66;20473:1;20468:3;20464:11;20457:87;20572:2;20567:3;20563:12;20556:19;;20363:218;;;;20590:465;;20750:67;20814:2;20809:3;20750:67;;;20743:74;;20850:66;20846:1;20841:3;20837:11;20830:87;20951:66;20946:2;20941:3;20937:12;20930:88;21046:2;21041:3;21037:12;21030:19;;20736:319;;;;21064:364;;21224:67;21288:2;21283:3;21224:67;;;21217:74;;21324:66;21320:1;21315:3;21311:11;21304:87;21419:2;21414:3;21410:12;21403:19;;21210:218;;;;21437:364;;21597:67;21661:2;21656:3;21597:67;;;21590:74;;21697:66;21693:1;21688:3;21684:11;21677:87;21792:2;21787:3;21783:12;21776:19;;21583:218;;;;21810:363;;21970:66;22034:1;22029:3;21970:66;;;21963:73;;22069:66;22065:1;22060:3;22056:11;22049:87;22164:2;22159:3;22155:12;22148:19;;21956:217;;;;22242:904;;22375:4;22370:3;22366:14;22468:3;22461:5;22457:15;22451:22;22479:77;22551:3;22546;22542:13;22529:11;22479:77;;;22395:167;22644:4;22637:5;22633:16;22627:23;22696:3;22690:4;22686:14;22679:4;22674:3;22670:14;22663:38;22716:66;22777:4;22764:11;22716:66;;;22708:74;;22572:222;22877:4;22870:5;22866:16;22860:23;22889:62;22945:4;22940:3;22936:14;22923:11;22889:62;;;22804:153;23040:4;23033:5;23029:16;23023:23;23052:62;23108:4;23103:3;23099:14;23086:11;23052:62;;;22967:153;23137:4;23130:11;;22348:798;;;;;;23212:1613;;23343:5;23338:3;23334:15;23428:3;23421:5;23417:15;23411:22;23478:3;23472:4;23468:14;23462:3;23457;23453:13;23446:37;23498:136;23629:4;23616:11;23498:136;;;23490:144;;23364:282;23733:4;23726:5;23722:16;23716:23;23745:62;23801:4;23796:3;23792:14;23779:11;23745:62;;;23656:157;23905:4;23898:5;23894:16;23888:23;23917:62;23973:4;23968:3;23964:14;23951:11;23917:62;;;23823:162;24065:4;24058:5;24054:16;24048:23;24077:62;24133:4;24128:3;24124:14;24111:11;24077:62;;;23995:150;24231:4;24224:5;24220:16;24214:23;24243:62;24299:4;24294:3;24290:14;24277:11;24243:62;;;24155:156;24396:4;24389:5;24385:16;24379:23;24408:56;24458:4;24453:3;24449:14;24436:11;24408:56;;;24321:149;24553:4;24546:5;24542:16;24536:23;24565:78;24637:4;24632:3;24628:14;24615:11;24565:78;;;24480:169;24725:4;24718:5;24714:16;24708:23;24737:56;24787:4;24782:3;24778:14;24765:11;24737:56;;;24659:140;24816:4;24809:11;;23316:1509;;;;;;24893:1094;;25026:4;25021:3;25017:14;25115:3;25108:5;25104:15;25098:22;25126:61;25182:3;25177;25173:13;25160:11;25126:61;;;25046:147;25277:4;25270:5;25266:16;25260:23;25289:62;25345:4;25340:3;25336:14;25323:11;25289:62;;;25203:154;25431:4;25424:5;25420:16;25414:23;25443:62;25499:4;25494:3;25490:14;25477:11;25443:62;;;25367:144;25593:4;25586:5;25582:16;25576:23;25605:56;25655:4;25650:3;25646:14;25633:11;25605:56;;;25521:146;25741:4;25734:5;25730:16;25724:23;25793:3;25787:4;25783:14;25776:4;25771:3;25767:14;25760:38;25813:136;25944:4;25931:11;25813:136;;;25805:144;;25677:284;25978:4;25971:11;;24999:988;;;;;;25994:110;26067:31;26092:5;26067:31;;;26062:3;26055:44;26049:55;;;26111:120;26194:31;26219:5;26194:31;;;26189:3;26182:44;26176:55;;;26238:114;26317:29;26340:5;26317:29;;;26312:3;26305:42;26299:53;;;26359:262;;26503:93;26592:3;26583:6;26503:93;;;26496:100;;26613:3;26606:10;;26484:137;;;;;26628:511;;26855:148;26999:3;26855:148;;;26848:155;;27014:75;27085:3;27076:6;27014:75;;;27111:2;27106:3;27102:12;27095:19;;27131:3;27124:10;;26836:303;;;;;27146:372;;27345:148;27489:3;27345:148;;;27338:155;;27510:3;27503:10;;27326:192;;;;27525:245;;27659:2;27648:9;27644:18;27636:26;;27673:87;27757:1;27746:9;27742:17;27733:6;27673:87;;;27630:140;;;;;27777:611;;28011:3;28000:9;27996:19;27988:27;;28026:71;28094:1;28083:9;28079:17;28070:6;28026:71;;;28108:88;28192:2;28181:9;28177:18;28168:6;28108:88;;;28207;28291:2;28280:9;28276:18;28267:6;28207:88;;;28306:72;28374:2;28363:9;28359:18;28350:6;28306:72;;;27982:406;;;;;;;;28395:771;;28653:3;28642:9;28638:19;28630:27;;28668:71;28736:1;28725:9;28721:17;28712:6;28668:71;;;28750:72;28818:2;28807:9;28803:18;28794:6;28750:72;;;28833;28901:2;28890:9;28886:18;28877:6;28833:72;;;28916;28984:2;28973:9;28969:18;28960:6;28916:72;;;28999:73;29067:3;29056:9;29052:19;29043:6;28999:73;;;29083;29151:3;29140:9;29136:19;29127:6;29083:73;;;28624:542;;;;;;;;;;29173:324;;29319:2;29308:9;29304:18;29296:26;;29333:71;29401:1;29390:9;29386:17;29377:6;29333:71;;;29415:72;29483:2;29472:9;29468:18;29459:6;29415:72;;;29290:207;;;;;;29504:1047;;29876:3;29865:9;29861:19;29853:27;;29927:9;29921:4;29917:20;29913:1;29902:9;29898:17;29891:47;29952:140;30087:4;30078:6;29952:140;;;29944:148;;30103:88;30187:2;30176:9;30172:18;30163:6;30103:88;;;30202:72;30270:2;30259:9;30255:18;30246:6;30202:72;;;30285;30353:2;30342:9;30338:18;30329:6;30285:72;;;30368:73;30436:3;30425:9;30421:19;30412:6;30368:73;;;30452:89;30536:3;30525:9;30521:19;30512:6;30452:89;;;29847:704;;;;;;;;;;30558:201;;30670:2;30659:9;30655:18;30647:26;;30684:65;30746:1;30735:9;30731:17;30722:6;30684:65;;;30641:118;;;;;30766:539;;30964:3;30953:9;30949:19;30941:27;;30979:71;31047:1;31036:9;31032:17;31023:6;30979:71;;;31061:68;31125:2;31114:9;31110:18;31101:6;31061:68;;;31140:72;31208:2;31197:9;31193:18;31184:6;31140:72;;;31223;31291:2;31280:9;31276:18;31267:6;31223:72;;;30935:370;;;;;;;;31312:611;;31522:3;31511:9;31507:19;31499:27;;31573:9;31567:4;31563:20;31559:1;31548:9;31544:17;31537:47;31598:72;31665:4;31656:6;31598:72;;;31590:80;;31681:72;31749:2;31738:9;31734:18;31725:6;31681:72;;;31764;31832:2;31821:9;31817:18;31808:6;31764:72;;;31847:66;31909:2;31898:9;31894:18;31885:6;31847:66;;;31493:430;;;;;;;;31930:241;;32062:2;32051:9;32047:18;32039:26;;32076:85;32158:1;32147:9;32143:17;32134:6;32076:85;;;32033:138;;;;;32178:267;;32323:2;32312:9;32308:18;32300:26;;32337:98;32432:1;32421:9;32417:17;32408:6;32337:98;;;32294:151;;;;;32452:407;;32643:2;32632:9;32628:18;32620:26;;32693:9;32687:4;32683:20;32679:1;32668:9;32664:17;32657:47;32718:131;32844:4;32718:131;;;32710:139;;32614:245;;;;32866:407;;33057:2;33046:9;33042:18;33034:26;;33107:9;33101:4;33097:20;33093:1;33082:9;33078:17;33071:47;33132:131;33258:4;33132:131;;;33124:139;;33028:245;;;;33280:407;;33471:2;33460:9;33456:18;33448:26;;33521:9;33515:4;33511:20;33507:1;33496:9;33492:17;33485:47;33546:131;33672:4;33546:131;;;33538:139;;33442:245;;;;33694:407;;33885:2;33874:9;33870:18;33862:26;;33935:9;33929:4;33925:20;33921:1;33910:9;33906:17;33899:47;33960:131;34086:4;33960:131;;;33952:139;;33856:245;;;;34108:407;;34299:2;34288:9;34284:18;34276:26;;34349:9;34343:4;34339:20;34335:1;34324:9;34320:17;34313:47;34374:131;34500:4;34374:131;;;34366:139;;34270:245;;;;34522:407;;34713:2;34702:9;34698:18;34690:26;;34763:9;34757:4;34753:20;34749:1;34738:9;34734:17;34727:47;34788:131;34914:4;34788:131;;;34780:139;;34684:245;;;;34936:407;;35127:2;35116:9;35112:18;35104:26;;35177:9;35171:4;35167:20;35163:1;35152:9;35148:17;35141:47;35202:131;35328:4;35202:131;;;35194:139;;35098:245;;;;35350:407;;35541:2;35530:9;35526:18;35518:26;;35591:9;35585:4;35581:20;35577:1;35566:9;35562:17;35555:47;35616:131;35742:4;35616:131;;;35608:139;;35512:245;;;;35764:407;;35955:2;35944:9;35940:18;35932:26;;36005:9;35999:4;35995:20;35991:1;35980:9;35976:17;35969:47;36030:131;36156:4;36030:131;;;36022:139;;35926:245;;;;36178:407;;36369:2;36358:9;36354:18;36346:26;;36419:9;36413:4;36409:20;36405:1;36394:9;36390:17;36383:47;36444:131;36570:4;36444:131;;;36436:139;;36340:245;;;;36592:407;;36783:2;36772:9;36768:18;36760:26;;36833:9;36827:4;36823:20;36819:1;36808:9;36804:17;36797:47;36858:131;36984:4;36858:131;;;36850:139;;36754:245;;;;37006:213;;37124:2;37113:9;37109:18;37101:26;;37138:71;37206:1;37195:9;37191:17;37182:6;37138:71;;;37095:124;;;;;37226:256;;37288:2;37282:9;37272:19;;37326:4;37318:6;37314:17;37425:6;37413:10;37410:22;37389:18;37377:10;37374:34;37371:62;37368:2;;;37446:1;37443;37436:12;37368:2;37466:10;37462:2;37455:22;37266:216;;;;;37489:273;;37663:18;37655:6;37652:30;37649:2;;;37695:1;37692;37685:12;37649:2;37724:4;37716:6;37712:17;37704:25;;37752:4;37746;37742:15;37734:23;;37586:176;;;;37769:272;;37942:18;37934:6;37931:30;37928:2;;;37974:1;37971;37964:12;37928:2;38003:4;37995:6;37991:17;37983:25;;38031:4;38025;38021:15;38013:23;;37865:176;;;;38048:273;;38222:18;38214:6;38211:30;38208:2;;;38254:1;38251;38244:12;38208:2;38283:4;38275:6;38271:17;38263:25;;38311:4;38305;38301:15;38293:23;;38145:176;;;;38328:254;;38467:18;38459:6;38456:30;38453:2;;;38499:1;38496;38489:12;38453:2;38543:4;38539:9;38532:4;38524:6;38520:17;38516:33;38508:41;;38572:4;38566;38562:15;38554:23;;38390:192;;;;38591:136;;38715:4;38707:6;38703:17;38692:28;;38684:43;;;;38738:135;;38861:4;38853:6;38849:17;38838:28;;38830:43;;;;38884:136;;39008:4;39000:6;38996:17;38985:28;;38977:43;;;;39029:122;;39140:5;39134:12;39124:22;;39118:33;;;;39158:121;;39268:5;39262:12;39252:22;;39246:33;;;;39286:122;;39397:5;39391:12;39381:22;;39375:33;;;;39415:87;;39491:5;39485:12;39475:22;;39469:33;;;;39509:91;;39589:5;39583:12;39573:22;;39567:33;;;;39608:137;;39734:4;39726:6;39722:17;39711:28;;39704:41;;;;39754:136;;39879:4;39871:6;39867:17;39856:28;;39849:41;;;;39899:137;;40025:4;40017:6;40013:17;40002:28;;39995:41;;;;40045:187;;40184:6;40179:3;40172:19;40221:4;40216:3;40212:14;40197:29;;40165:67;;;;;40241:196;;40389:6;40384:3;40377:19;40426:4;40421:3;40417:14;40402:29;;40370:67;;;;;40446:187;;40585:6;40580:3;40573:19;40622:4;40617:3;40613:14;40598:29;;40566:67;;;;;40642:152;;40746:6;40741:3;40734:19;40783:4;40778:3;40774:14;40759:29;;40727:67;;;;;40803:162;;40917:6;40912:3;40905:19;40954:4;40949:3;40945:14;40930:29;;40898:67;;;;;40974:144;;41109:3;41094:18;;41087:31;;;;;41127:163;;41242:6;41237:3;41230:19;41279:4;41274:3;41270:14;41255:29;;41223:67;;;;;41299:145;;41435:3;41420:18;;41413:31;;;;;41452:105;;41521:31;41546:5;41521:31;;;41510:42;;41504:53;;;;41564:113;;41641:31;41666:5;41641:31;;;41630:42;;41624:53;;;;41684:92;;41764:5;41757:13;41750:21;41739:32;;41733:43;;;;41783:79;;41852:5;41841:16;;41835:27;;;;41869:128;;41949:42;41942:5;41938:54;41927:65;;41921:76;;;;42004:79;;42073:5;42062:16;;42056:27;;;;42090:88;;42168:4;42161:5;42157:16;42146:27;;42140:38;;;;42185:105;;42254:31;42279:5;42254:31;;;42243:42;;42237:53;;;;42297:113;;42374:31;42399:5;42374:31;;;42363:42;;42357:53;;;;42417:92;;42497:5;42490:13;42483:21;42472:32;;42466:43;;;;42516:79;;42585:5;42574:16;;42568:27;;;;42602:128;;42682:42;42675:5;42671:54;42660:65;;42654:76;;;;42737:79;;42806:5;42795:16;;42789:27;;;;42823:88;;42901:4;42894:5;42890:16;42879:27;;42873:38;;;;42918:149;;43011:51;43056:5;43011:51;;;42998:64;;42992:75;;;;43074:129;;43167:31;43192:5;43167:31;;;43154:44;;43148:55;;;;43210:175;;43316:64;43374:5;43316:64;;;43303:77;;43297:88;;;;43392:142;;43498:31;43523:5;43498:31;;;43485:44;;43479:55;;;;43542:145;43623:6;43618:3;43613;43600:30;43679:1;43670:6;43665:3;43661:16;43654:27;43593:94;;;;43696:268;43761:1;43768:101;43782:6;43779:1;43776:13;43768:101;;;43858:1;43853:3;43849:11;43843:18;43839:1;43834:3;43830:11;43823:39;43804:2;43801:1;43797:10;43792:15;;43768:101;;;43884:6;43881:1;43878:13;43875:2;;;43949:1;43940:6;43935:3;43931:16;43924:27;43875:2;43745:219;;;;;43972:74;;44036:5;44025:16;;44019:27;;;;44053:97;;44141:2;44137:7;44132:2;44125:5;44121:14;44117:28;44107:38;;44101:49;;;"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "2971600",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"": "1526",
"GAS_TOKEN()": "466",
"MIN_REFUND_GAS_PRICE()": "618",
"addSigner(address)": "21074",
"owner()": "681",
"pause()": "21837",
"paused()": "652",
"performSwapCollection((((address,address,uint256,bool,(address,bytes,uint256,uint256)[])[],uint256,uint256,uint256,uint256,bool,address,bool)[],address,uint256,bytes32,uint256,uint8,bytes32,bytes32))": "infinite",
"removeSigner(address)": "21054",
"renounceOwnership()": "22123",
"signers(address)": "960",
"tokenTransferProxy()": "703",
"transferOwnership(address)": "22876",
"unpause()": "21901",
"updateMinRefundGasPrice(uint256)": "20660",
"withdrawETH(uint256)": "infinite",
"withdrawToken(address,uint256)": "infinite"
},
"internal": {
"calculateFee(uint256,uint256)": "283",
"getTargetSpend(uint256,uint256,uint256,uint256)": "128",
"getTotalExcess(struct TotlePrimary.Trade memory)": "infinite",
"minimumRateFailed(address,address,uint256,uint256,uint256)": "infinite",
"performOrder(struct TotlePrimary.Order memory,uint256,bool,address,struct TokenBalanceLibrary.TokenBalance memory[20] memory)": "infinite",
"performSwap(bytes32,struct TotlePrimary.Swap memory,struct TokenBalanceLibrary.TokenBalance memory[20] memory,address payable)": "infinite",
"performTrade(struct TotlePrimary.Trade memory,struct TokenBalanceLibrary.TokenBalance memory[20] memory,uint256)": "infinite",
"refundGas(uint256)": "infinite",
"takeFee(struct TokenBalanceLibrary.TokenBalance memory[20] memory,address,address payable,uint256)": "infinite",
"transferAllTokensToUser(struct TokenBalanceLibrary.TokenBalance memory[20] memory)": "infinite",
"transferFromSenderDifference(struct TokenBalanceLibrary.TokenBalance memory[20] memory,address,uint256)": "infinite",
"transferTokens(struct TokenBalanceLibrary.TokenBalance memory[20] memory,uint256,address payable,uint256)": "infinite"
}
},
"methodIdentifiers": {
"GAS_TOKEN()": "8af8d4c3",
"MIN_REFUND_GAS_PRICE()": "7822b9ae",
"addSigner(address)": "eb12d61e",
"owner()": "8da5cb5b",
"pause()": "8456cb59",
"paused()": "5c975abb",
"performSwapCollection((((address,address,uint256,bool,(address,bytes,uint256,uint256)[])[],uint256,uint256,uint256,uint256,bool,address,bool)[],address,uint256,bytes32,uint256,uint8,bytes32,bytes32))": "11a861a7",
"removeSigner(address)": "0e316ab7",
"renounceOwnership()": "715018a6",
"signers(address)": "736c0d5b",
"tokenTransferProxy()": "0eefdbad",
"transferOwnership(address)": "f2fde38b",
"unpause()": "3f4ba83a",
"updateMinRefundGasPrice(uint256)": "c571c67e",
"withdrawETH(uint256)": "f14210a6",
"withdrawToken(address,uint256)": "9e281a98"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "signer",
"type": "address"
}
],
"name": "removeSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "tokenTransferProxy",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"components": [
{
"components": [
{
"name": "sourceToken",
"type": "address"
},
{
"name": "destinationToken",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
},
{
"name": "isSourceAmount",
"type": "bool"
},
{
"components": [
{
"name": "exchangeHandler",
"type": "address"
},
{
"name": "encodedPayload",
"type": "bytes"
},
{
"name": "minSourceAmount",
"type": "uint256"
},
{
"name": "maxSourceAmount",
"type": "uint256"
}
],
"name": "orders",
"type": "tuple[]"
}
],
"name": "trades",
"type": "tuple[]"
},
{
"name": "minimumExchangeRate",
"type": "uint256"
},
{
"name": "minimumDestinationAmount",
"type": "uint256"
},
{
"name": "sourceAmount",
"type": "uint256"
},
{
"name": "tradeToTakeFeeFrom",
"type": "uint256"
},
{
"name": "takeFeeFromSource",
"type": "bool"
},
{
"name": "redirectAddress",
"type": "address"
},
{
"name": "required",
"type": "bool"
}
],
"name": "swaps",
"type": "tuple[]"
},
{
"name": "partnerContract",
"type": "address"
},
{
"name": "expirationBlock",
"type": "uint256"
},
{
"name": "id",
"type": "bytes32"
},
{
"name": "maxGasPrice",
"type": "uint256"
},
{
"name": "v",
"type": "uint8"
},
{
"name": "r",
"type": "bytes32"
},
{
"name": "s",
"type": "bytes32"
}
],
"name": "swaps",
"type": "tuple"
}
],
"name": "performSwapCollection",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "unpause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "paused",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "signers",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MIN_REFUND_GAS_PRICE",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "pause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "GAS_TOKEN",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newMinRefundGasPrice",
"type": "uint256"
}
],
"name": "updateMinRefundGasPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newSigner",
"type": "address"
}
],
"name": "addSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_tokenTransferProxy",
"type": "address"
},
{
"name": "_signer",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"name": "partnerContract",
"type": "address"
},
{
"indexed": true,
"name": "user",
"type": "address"
}
],
"name": "LogSwapCollection",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"name": "sourceAsset",
"type": "address"
},
{
"indexed": false,
"name": "destinationAsset",
"type": "address"
},
{
"indexed": false,
"name": "sourceAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "destinationAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "feeAsset",
"type": "address"
},
{
"indexed": false,
"name": "feeAmount",
"type": "uint256"
}
],
"name": "LogSwap",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "signer",
"type": "address"
}
],
"name": "removeSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "tokenTransferProxy",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"components": [
{
"components": [
{
"name": "sourceToken",
"type": "address"
},
{
"name": "destinationToken",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
},
{
"name": "isSourceAmount",
"type": "bool"
},
{
"components": [
{
"name": "exchangeHandler",
"type": "address"
},
{
"name": "encodedPayload",
"type": "bytes"
},
{
"name": "minSourceAmount",
"type": "uint256"
},
{
"name": "maxSourceAmount",
"type": "uint256"
}
],
"name": "orders",
"type": "tuple[]"
}
],
"name": "trades",
"type": "tuple[]"
},
{
"name": "minimumExchangeRate",
"type": "uint256"
},
{
"name": "minimumDestinationAmount",
"type": "uint256"
},
{
"name": "sourceAmount",
"type": "uint256"
},
{
"name": "tradeToTakeFeeFrom",
"type": "uint256"
},
{
"name": "takeFeeFromSource",
"type": "bool"
},
{
"name": "redirectAddress",
"type": "address"
},
{
"name": "required",
"type": "bool"
}
],
"name": "swaps",
"type": "tuple[]"
},
{
"name": "partnerContract",
"type": "address"
},
{
"name": "expirationBlock",
"type": "uint256"
},
{
"name": "id",
"type": "bytes32"
},
{
"name": "maxGasPrice",
"type": "uint256"
},
{
"name": "v",
"type": "uint8"
},
{
"name": "r",
"type": "bytes32"
},
{
"name": "s",
"type": "bytes32"
}
],
"name": "swaps",
"type": "tuple"
}
],
"name": "performSwapCollection",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "unpause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "paused",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "signers",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MIN_REFUND_GAS_PRICE",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "pause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "GAS_TOKEN",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newMinRefundGasPrice",
"type": "uint256"
}
],
"name": "updateMinRefundGasPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newSigner",
"type": "address"
}
],
"name": "addSigner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_tokenTransferProxy",
"type": "address"
},
{
"name": "_signer",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"name": "partnerContract",
"type": "address"
},
{
"indexed": true,
"name": "user",
"type": "address"
}
],
"name": "LogSwapCollection",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"name": "sourceAsset",
"type": "address"
},
{
"indexed": false,
"name": "destinationAsset",
"type": "address"
},
{
"indexed": false,
"name": "sourceAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "destinationAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "feeAsset",
"type": "address"
},
{
"indexed": false,
"name": "feeAmount",
"type": "uint256"
}
],
"name": "LogSwap",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"constructor": {
"params": {
"_signer": "the suggester's address that signs the payloads. More can be added with add/removeSigner functions"
}
},
"pause()": {
"details": "called by the owner to pause, triggers stopped state\r"
},
"paused()": {
"return": "true if the contract is paused, false otherwise.\r"
},
"performSwapCollection((((address,address,uint256,bool,(address,bytes,uint256,uint256)[])[],uint256,uint256,uint256,uint256,bool,address,bool)[],address,uint256,bytes32,uint256,uint8,bytes32,bytes32))": {
"params": {
"swaps": "The struct that defines the collection of swaps to perform"
}
},
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"unpause()": {
"details": "called by the owner to unpause, returns to normal state\r"
},
"withdrawETH(uint256)": {
"params": {
"_amount": "The amount of ether that the caller wants to withdraw"
}
},
"withdrawToken(address,uint256)": {
"return": "bool value indicating whether the transfer was successful"
}
},
"title": "The primary contract for Totle"
},
"userdoc": {
"methods": {
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/primary.sol": "TotlePrimary"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Partner.sol": {
"keccak256": "0xf2b7173c4b6bd2c3c6b3b0f0fa56bdce9db13e0996074f1d3abadee8b419bace",
"urls": [
"bzzr://4b5d11c9ff92107ecea8b5ecb530940df23a8b7fc2fab141299cc9a717030a55"
]
},
"contracts/aggregator/lib/PartnerRegistry.sol": {
"keccak256": "0x4dc6bbee07663a2ad09e4f805ad49a0c891de7cf68f78f3e6cf8331c3a34e1ba",
"urls": [
"bzzr://17f106cfa0e9cb6823cf8063450877da6bbf45e847775da814eb60e3ecf45d6b"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TokenBalanceLibrary.sol": {
"keccak256": "0x3001426047497ae457587c51fb74def6ae024ae7fcf0412909b604e4bab2c697",
"urls": [
"bzzr://e48c885ba1bb387d481b1932ccd1161fa4ccc4960bee7bd42ed9bd124ab3361c"
]
},
"contracts/aggregator/lib/TokenTransferProxy.sol": {
"keccak256": "0x6cc92eb9b75096ed98bd151e206a5702831d45d70b99a06688d690c71a219190",
"urls": [
"bzzr://5d6db058a18b2b74505fae135e056daa102a1c76d15db3c97004cc946ec0a8a3"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
},
"contracts/aggregator/primary.sol": {
"keccak256": "0x5587d5cfd78ff6e65cb8e41c46851f644afc363847d880f555fd7dcf6434b394",
"urls": [
"bzzr://09e5a31152156ea26a1bf454d4a155113d49760780444aef028b4e5301551918"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"owner()": "8da5cb5b",
"performOrder(bytes,uint256,uint256,bool)": "0345c2a6",
"renounceOwnership()": "715018a6",
"transferOwnership(address)": "f2fde38b",
"withdrawETH(uint256)": "f14210a6",
"withdrawToken(address,uint256)": "9e281a98"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"withdrawETH(uint256)": {
"params": {
"_amount": "The amount of ether that the caller wants to withdraw"
}
},
"withdrawToken(address,uint256)": {
"return": "bool value indicating whether the transfer was successful"
}
},
"title": "Interface for all exchange handler contracts"
},
"userdoc": {
"methods": {
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": "ExchangeHandler"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"getPair(address,address)": "e6a43905"
}
},
"abi": [
{
"constant": true,
"inputs": [
{
"name": "tokenA",
"type": "address"
},
{
"name": "tokenB",
"type": "address"
}
],
"name": "getPair",
"outputs": [
{
"name": "pair",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "tokenA",
"type": "address"
},
{
"name": "tokenB",
"type": "address"
}
],
"name": "getPair",
"outputs": [
{
"name": "pair",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": "IUniswapV2Factory"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": {
"keccak256": "0xf8947207299ccbda201e8965dd5ce48afac86c7e8a249c1deac5c354fa9b7022",
"urls": [
"bzzr://eb070eeb68edb9121a54f3eab9b37384b7d2f4aa71dfbec2f22cfd4604964c6a"
]
},
"contracts/aggregator/lib/AllowanceSetter.sol": {
"keccak256": "0xb4c53ccf0db549461b56162536b9741c64a3ecb7c54811d0ef978ff182fce56c",
"urls": [
"bzzr://470888ccbecc0ce3685638622887ff415c78ebaea800e5188c83a82171e2bfa5"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TotleControl.sol": {
"keccak256": "0x75aad1cf716ae0a7f602b4641f009d3cf650ce1342ff3b9d1536f72202da7783",
"urls": [
"bzzr://b3254c062aa3d6a0d13de1c4dcb8d5c0abe1aa69cf3992b28c58b0771a047a63"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/WONE.sol": {
"keccak256": "0xb41175bfe1fbcab6c412d3c0b5b08afb29db745bb056ce6e6c93d84addad2b37",
"urls": [
"bzzr://b1206547a998cf80261b2de1962b3dbd3499381ac3c580b241824dcc7a11cfd4"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"getReserves()": "0902f1ac",
"swap(uint256,uint256,address,bytes)": "022c0d9f"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "amount0Out",
"type": "uint256"
},
{
"name": "amount1Out",
"type": "uint256"
},
{
"name": "to",
"type": "address"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "swap",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getReserves",
"outputs": [
{
"name": "reserve0",
"type": "uint112"
},
{
"name": "reserve1",
"type": "uint112"
},
{
"name": "blockTimestampLast",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "amount0Out",
"type": "uint256"
},
{
"name": "amount1Out",
"type": "uint256"
},
{
"name": "to",
"type": "address"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "swap",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getReserves",
"outputs": [
{
"name": "reserve0",
"type": "uint112"
},
{
"name": "reserve1",
"type": "uint112"
},
{
"name": "blockTimestampLast",
"type": "uint32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"userdoc": {
"methods": {}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": "IUniswapV2Pair"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": {
"keccak256": "0xf8947207299ccbda201e8965dd5ce48afac86c7e8a249c1deac5c354fa9b7022",
"urls": [
"bzzr://eb070eeb68edb9121a54f3eab9b37384b7d2f4aa71dfbec2f22cfd4604964c6a"
]
},
"contracts/aggregator/lib/AllowanceSetter.sol": {
"keccak256": "0xb4c53ccf0db549461b56162536b9741c64a3ecb7c54811d0ef978ff182fce56c",
"urls": [
"bzzr://470888ccbecc0ce3685638622887ff415c78ebaea800e5188c83a82171e2bfa5"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TotleControl.sol": {
"keccak256": "0x75aad1cf716ae0a7f602b4641f009d3cf650ce1342ff3b9d1536f72202da7783",
"urls": [
"bzzr://b3254c062aa3d6a0d13de1c4dcb8d5c0abe1aa69cf3992b28c58b0771a047a63"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/WONE.sol": {
"keccak256": "0xb41175bfe1fbcab6c412d3c0b5b08afb29db745bb056ce6e6c93d84addad2b37",
"urls": [
"bzzr://b1206547a998cf80261b2de1962b3dbd3499381ac3c580b241824dcc7a11cfd4"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"owner()": "8da5cb5b",
"performOrder(bytes,uint256,uint256)": "0e88639f",
"performOrder(bytes,uint256,uint256,bool)": "0345c2a6",
"renounceOwnership()": "715018a6",
"transferOwnership(address)": "f2fde38b",
"withdrawETH(uint256)": "f14210a6",
"withdrawToken(address,uint256)": "9e281a98"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"withdrawETH(uint256)": {
"params": {
"_amount": "The amount of ether that the caller wants to withdraw"
}
},
"withdrawToken(address,uint256)": {
"return": "bool value indicating whether the transfer was successful"
}
}
},
"userdoc": {
"methods": {
"constructor": "Constructor",
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
},
"notice": "Handles the all ZeroExExchange trades for the primary contract"
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": "LootSwapHandler"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": {
"keccak256": "0xf8947207299ccbda201e8965dd5ce48afac86c7e8a249c1deac5c354fa9b7022",
"urls": [
"bzzr://eb070eeb68edb9121a54f3eab9b37384b7d2f4aa71dfbec2f22cfd4604964c6a"
]
},
"contracts/aggregator/lib/AllowanceSetter.sol": {
"keccak256": "0xb4c53ccf0db549461b56162536b9741c64a3ecb7c54811d0ef978ff182fce56c",
"urls": [
"bzzr://470888ccbecc0ce3685638622887ff415c78ebaea800e5188c83a82171e2bfa5"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TotleControl.sol": {
"keccak256": "0x75aad1cf716ae0a7f602b4641f009d3cf650ce1342ff3b9d1536f72202da7783",
"urls": [
"bzzr://b3254c062aa3d6a0d13de1c4dcb8d5c0abe1aa69cf3992b28c58b0771a047a63"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/WONE.sol": {
"keccak256": "0xb41175bfe1fbcab6c412d3c0b5b08afb29db745bb056ce6e6c93d84addad2b37",
"urls": [
"bzzr://b1206547a998cf80261b2de1962b3dbd3499381ac3c580b241824dcc7a11cfd4"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "",
"opcodes": "",
"sourceMap": ""
},
"gasEstimates": null,
"methodIdentifiers": {
"owner()": "8da5cb5b",
"performOrder(bytes,uint256,uint256)": "0e88639f",
"performOrder(bytes,uint256,uint256,bool)": "0345c2a6",
"renounceOwnership()": "715018a6",
"transferOwnership(address)": "f2fde38b",
"withdrawETH(uint256)": "f14210a6",
"withdrawToken(address,uint256)": "9e281a98"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
},
{
"name": "targetAmountIsSource",
"type": "bool"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "genericPayload",
"type": "bytes"
},
{
"name": "availableToSpend",
"type": "uint256"
},
{
"name": "targetAmount",
"type": "uint256"
}
],
"name": "performOrder",
"outputs": [
{
"name": "amountSpentOnOrder",
"type": "uint256"
},
{
"name": "amountReceivedFromOrder",
"type": "uint256"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_token",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawToken",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"withdrawETH(uint256)": {
"params": {
"_amount": "The amount of ether that the caller wants to withdraw"
}
},
"withdrawToken(address,uint256)": {
"return": "bool value indicating whether the transfer was successful"
}
}
},
"userdoc": {
"methods": {
"constructor": "Constructor",
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
},
"notice": "Handles the all ZeroExExchange trades for the primary contract"
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": "UniswapV2Handler"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/exchange_handlers/ExchangeHandler.sol": {
"keccak256": "0xee0dd1f8cbeb4012f8e26097836fcfb1c07ea0fe57be390cb56c0276eb66af2a",
"urls": [
"bzzr://ef3d8ada611a82375dca761a7dd4a8bd4f362255824381f912bd79403d7d9c41"
]
},
"contracts/aggregator/exchange_handlers/LootSwapHandler.sol": {
"keccak256": "0x65c1c8bdf2864bd14397c1334ff4c6c128e03637b27dbe6264f5730fb64bad38",
"urls": [
"bzzr://3b289e235e602525801de95c6bbcdcadcc03d06db12a2c03ecd19735d2380c10"
]
},
"contracts/aggregator/lib/AllowanceSetter.sol": {
"keccak256": "0xb4c53ccf0db549461b56162536b9741c64a3ecb7c54811d0ef978ff182fce56c",
"urls": [
"bzzr://470888ccbecc0ce3685638622887ff415c78ebaea800e5188c83a82171e2bfa5"
]
},
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/TotleControl.sol": {
"keccak256": "0x75aad1cf716ae0a7f602b4641f009d3cf650ce1342ff3b9d1536f72202da7783",
"urls": [
"bzzr://b3254c062aa3d6a0d13de1c4dcb8d5c0abe1aa69cf3992b28c58b0771a047a63"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
},
"contracts/aggregator/lib/WONE.sol": {
"keccak256": "0xb41175bfe1fbcab6c412d3c0b5b08afb29db745bb056ce6e6c93d84addad2b37",
"urls": [
"bzzr://b1206547a998cf80261b2de1962b3dbd3499381ac3c580b241824dcc7a11cfd4"
]
},
"contracts/aggregator/lib/Withdrawable.sol": {
"keccak256": "0xb1b919ff7ae618eda415c71805a99f6cccf2cacc1a4c428cb94c31645eedd207",
"urls": [
"bzzr://e781c8e69a932c779646ded45d59c264b3fb1f8e3e60d09c198504ba18883375"
]
}
},
"version": 1
}
pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;
import "../lib/Withdrawable.sol";
import "../lib/Pausable.sol";
/* import "../lib/Logger.sol"; */
/// @title Interface for all exchange handler contracts
contract ExchangeHandler is Withdrawable {
/*
* State Variables
*/
/* Logger public logger; */
/*
* Modifiers
*/
function performOrder(
bytes memory genericPayload,
uint256 availableToSpend,
uint256 targetAmount,
bool targetAmountIsSource
)
public
payable
returns (uint256 amountSpentOnOrder, uint256 amountReceivedFromOrder);
}
pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;
import "../lib/SafeMath.sol";
import "../lib/Math.sol";
import "../lib/Utils.sol";
import "../lib/AllowanceSetter.sol";
import "./ExchangeHandler.sol";
import "../lib/TotleControl.sol";
import "../lib/WONE.sol";
interface IUniswapV2Factory {
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
}
interface IUniswapV2Pair {
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}
/// @title UniswapV2Handler
/// @notice Handles the all ZeroExExchange trades for the primary contract
contract LootSwapHandler is ExchangeHandler, AllowanceSetter {
/*
* State Variables
*/
WONE constant wone = WONE(0xcF664087a5bB0237a0BAd6742852ec6c8d69A27a);
IUniswapV2Factory constant factory = IUniswapV2Factory(
0x021AeF70c404aa9d70b71C615F17aB3a4038851A
);
/*
* Types
*/
/// @notice Constructor
constructor() public {}
struct OrderData {
address sourceAsset;
address destinationAsset;
uint256 maxOrderSpend;
}
/*
* Public functions
*/
/*
* Internal functions
*/
function getMaxToSpend(uint256 targetAmount, uint256 availableToSpend, uint256 maxOrderSpend) internal pure returns (uint256 max) {
max = Math.min(Math.min(availableToSpend, targetAmount), maxOrderSpend);
return max;
}
function performOrder(bytes memory genericPayload, uint256 availableToSpend, uint256 targetAmount) public payable returns (uint256 amountSpentOnOrder, uint256 amountReceivedFromOrder){
OrderData memory data = abi.decode(genericPayload, (OrderData));
amountSpentOnOrder = getMaxToSpend(
targetAmount,
availableToSpend,
data.maxOrderSpend
);
if (data.sourceAsset == address(wone)) {
wone.deposit.value(amountSpentOnOrder)();
}
if (amountSpentOnOrder > 0) {
amountReceivedFromOrder = swap(
amountSpentOnOrder,
data.sourceAsset,
data.destinationAsset
);
}
if (amountSpentOnOrder < availableToSpend) {
if (data.sourceAsset == address(wone)) {
msg.sender.transfer(availableToSpend - amountSpentOnOrder);
} else {
ERC20SafeTransfer.safeTransfer(
data.sourceAsset,
msg.sender,
availableToSpend - amountSpentOnOrder
);
}
}
if (data.destinationAsset == address(wone)) {
wone.withdraw(amountReceivedFromOrder);
msg.sender.transfer(amountReceivedFromOrder);
} else {
ERC20SafeTransfer.safeTransfer(
data.destinationAsset,
msg.sender,
amountReceivedFromOrder
);
}
}
function swap(uint256 amount, address sourceToken, address destinationToken) private returns (uint256 output){
// Sort the tokens. This is used for getting reserves
(address token0, address token1) = sourceToken < destinationToken
? (sourceToken, destinationToken)
: (destinationToken, sourceToken);
// Get the pair contract
IUniswapV2Pair pair = IUniswapV2Pair(
address(
uint256(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" // init code hash
)
)
)
)
);
// Get the reserves
(uint256 sourceReserve, uint256 destinationReserve,) = pair
.getReserves();
// Reorder the reserves if need be
(sourceReserve, destinationReserve) = sourceToken == token0
? (sourceReserve, destinationReserve)
: (destinationReserve, sourceReserve);
// Get the output amount using the source amount, source reserve, and destination reserve
output = getAmountOut(amount, sourceReserve, destinationReserve);
// Transfer the source tokens to the pair contract
ERC20SafeTransfer.safeTransfer(sourceToken, address(pair), amount);
// Call swap
pair.swap(
destinationToken == token0 ? output : 0,
destinationToken == token0 ? 0 : output,
address(this),
new bytes(0)
);
}
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1){}
function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) internal pure returns (uint256 amountOut) {
uint256 amountInWithFee = SafeMath.mul(amountIn, 997);
uint256 numerator = SafeMath.mul(amountInWithFee, reserveOut);
uint256 denominator = SafeMath.add(
SafeMath.mul(reserveIn, 1000),
amountInWithFee
);
amountOut = numerator / denominator;
}
/*
* Payable fallback function
*/
function() external payable {}
}
pragma solidity 0.5.7;
import "./ERC20.sol";
import "./ERC20SafeTransfer.sol";
/// @title A contract which is used to check and set allowances of tokens
/// @dev In order to use this contract is must be inherited in the contract which is using
/// its functionality
contract AllowanceSetter {
uint256 constant MAX_UINT = 2**256 - 1;
/// @notice A function which allows the caller to approve the max amount of any given token
/// @dev In order to function correctly, token allowances should not be set anywhere else in
/// the inheriting contract
/// @param addressToApprove the address which we want to approve to transfer the token
/// @param token the token address which we want to call approve on
function approveAddress(address addressToApprove, address token) internal {
if(ERC20(token).allowance(address(this), addressToApprove) == 0) {
require(ERC20SafeTransfer.safeApprove(token, addressToApprove, MAX_UINT));
}
}
}
// this line is added to create a gist. Empty file is not allowed.
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "previousRegistry",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newCompanyBeneficiary",
"type": "address"
},
{
"name": "newBasePercentage",
"type": "uint256"
}
],
"name": "updateCompanyInfo",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "unpause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "paused",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "partnerBeneficiary",
"type": "address"
},
{
"name": "partnerPercentage",
"type": "uint256"
}
],
"name": "registerPartner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "pause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "basePercentage",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_companyBeneficiary",
"type": "address"
},
{
"name": "_companyPercentage",
"type": "uint256"
},
{
"name": "partnerBeneficiary",
"type": "address"
},
{
"name": "partnerPercentage",
"type": "uint256"
}
],
"name": "overrideRegisterPartner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "partnerContract",
"type": "address"
}
],
"name": "isValidPartner",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_partnerAddress",
"type": "address"
}
],
"name": "deletePartner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "companyBeneficiary",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_previousRegistry",
"type": "address"
},
{
"name": "_target",
"type": "address"
},
{
"name": "_companyBeneficiary",
"type": "address"
},
{
"name": "_basePercentage",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "creator",
"type": "address"
},
{
"indexed": true,
"name": "beneficiary",
"type": "address"
},
{
"indexed": false,
"name": "partnerContract",
"type": "address"
}
],
"name": "PartnerRegistered",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"pause()": {
"details": "called by the owner to pause, triggers stopped state\r"
},
"paused()": {
"return": "true if the contract is paused, false otherwise.\r"
},
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
},
"unpause()": {
"details": "called by the owner to unpause, returns to normal state\r"
}
}
},
"userdoc": {
"methods": {
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/lib/PartnerRegistry.sol": "PartnerRegistry"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Math.sol": {
"keccak256": "0xe1d6337151acc74b761917d6480a01541bd3e3b9f78ea050d82c7dafc89c68ec",
"urls": [
"bzzr://f45cc7e2307e1bb93d9788ad935a7eafb7493b93a26f78ed4621678e47746c76"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/Partner.sol": {
"keccak256": "0xf2b7173c4b6bd2c3c6b3b0f0fa56bdce9db13e0996074f1d3abadee8b419bace",
"urls": [
"bzzr://4b5d11c9ff92107ecea8b5ecb530940df23a8b7fc2fab141299cc9a717030a55"
]
},
"contracts/aggregator/lib/PartnerRegistry.sol": {
"keccak256": "0x4dc6bbee07663a2ad09e4f805ad49a0c891de7cf68f78f3e6cf8331c3a34e1ba",
"urls": [
"bzzr://17f106cfa0e9cb6823cf8063450877da6bbf45e847775da814eb60e3ecf45d6b"
]
},
"contracts/aggregator/lib/Pausable.sol": {
"keccak256": "0xc0df0ff882f855db83f664fcaeee3b13e02e41d1ca0c0ebddb3f45cfb17864d2",
"urls": [
"bzzr://af63eb2e29285406d7b64cdb1c262522bbccea90ad5645c9d2a1d11e66abe218"
]
},
"contracts/aggregator/lib/SafeMath.sol": {
"keccak256": "0xd5177b6437b22223f25d9a4e59f8cefd5111df87a6e3ab7dc7e62fecd585c95d",
"urls": [
"bzzr://bbe6f22976368def13dd5bcce568dfef918c04bd92d1a10706410f1c6a7b7946"
]
},
"contracts/aggregator/lib/Utils.sol": {
"keccak256": "0xd4d0f2bb5c0569a302037f927a6ffc377aea1f98657af4cc18002f87e478369b",
"urls": [
"bzzr://fa63c935f729f6be1bfe9d4e8c3a5fef921da2713266548ce3a2dda7575c0ec7"
]
}
},
"version": 1
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"linkReferences": {},
"object": "6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610eb6806100536000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063715018a611610066578063715018a6146102345780638da5cb5b1461023e578063b918161114610288578063d39de6e9146102e4578063f2fde38b1461034357610093565b806315dacbea1461009857806342f1181e1461013e578063494503d41461018257806370712939146101f0575b600080fd5b610124600480360360808110156100ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610387565b604051808215151515815260200191505060405180910390f35b6101806004803603602081101561015457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610400565b005b6101ae6004803603602081101561019857600080fd5b81019080803590602001909291905050506105cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102326004803603602081101561020657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610608565b005b61023c6108a4565b005b6102466109a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ca6004803603602081101561029e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b604051808215151515815260200191505060405180910390f35b6102ec6109e9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561032f578082015181840152602081019050610314565b505050509050019250505060405180910390f35b6103856004803603602081101561035957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a77565b005b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166103df57600080fd5b6103eb85858585610adc565b6103f457600080fd5b60019050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045957600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156104b157600080fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060028290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f94bb87f4c15c4587ff559a7584006fa01ddf9299359be6b512b94527aa961aca60405160405180910390a35050565b600281815481106105d957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461066157600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106b857600080fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905560008090505b600280549050811015610845578273ffffffffffffffffffffffffffffffffffffffff166002828154811061073e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108385760026001600280549050038154811061079a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600282815481106107d257fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016002818180549050039150816108329190610e39565b50610845565b808060010191505061070d565b503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167ff5b347a1e40749dd050f5f07fbdbeb7e3efa9756903044dd29401fd1d4bb4a1c60405160405180910390a35050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108fd57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610a6d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a23575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad057600080fd5b610ad981610d10565b50565b60008473ffffffffffffffffffffffffffffffffffffffff16848484604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200193505050506040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310610c1e5780518252602082019150602081019050602083039250610bfb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610c80576040519150601f19603f3d011682016040523d82523d6000602084013e610c85565b606091505b50508091505080610cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5472616e736665722046726f6d206661696c656400000000000000000000000081525060200191505060405180910390fd5b610d06610e08565b9050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003d60008114610e205760208114610e2957600080fd5b60019150610e35565b60206000803e60005191505b5090565b815481835581811115610e6057818360005260206000209182019101610e5f9190610e65565b5b505050565b610e8791905b80821115610e83576000816000905550600101610e6b565b5090565b9056fea165627a7a723058202daa2f83db6f69340410f4dc2766352d5f0c69f947b668fd2ff48afdf30cb0720029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xEB6 DUP1 PUSH2 0x53 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x93 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x288 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x343 JUMPI PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH4 0x15DACBEA EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x124 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0xAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x387 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x180 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x400 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5CC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x232 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x206 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x608 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x23C PUSH2 0x8A4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x246 PUSH2 0x9A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9C9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2EC PUSH2 0x9E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x32F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x314 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x385 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA77 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB DUP6 DUP6 DUP6 DUP6 PUSH2 0xADC JUMP JUMPDEST PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x459 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x2 DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x94BB87F4C15C4587FF559A7584006FA01DDF9299359BE6B512B94527AA961ACA PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x5D9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x661 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x6B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST PUSH1 0x2 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x845 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x73E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x838 JUMPI PUSH1 0x2 PUSH1 0x1 PUSH1 0x2 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT PUSH2 0x79A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x7D2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x832 SWAP2 SWAP1 PUSH2 0xE39 JUMP JUMPDEST POP PUSH2 0x845 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x70D JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF5B347A1E40749DD050F5F07FBDBEB7E3EFA9756903044DD29401FD1D4BB4A1C PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xA6D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0xA23 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAD9 DUP2 PUSH2 0xD10 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC1E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0xBFB JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xC80 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 PUSH2 0xCFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x5472616E736665722046726F6D206661696C6564000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xD06 PUSH2 0xE08 JUMP JUMPDEST SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 RETURNDATASIZE PUSH1 0x0 DUP2 EQ PUSH2 0xE20 JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0xE29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP2 POP PUSH2 0xE35 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD SWAP2 POP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xE60 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE5F SWAP2 SWAP1 PUSH2 0xE65 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xE87 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE83 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xE6B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2d 0xaa 0x2f DUP4 0xdb PUSH16 0x69340410F4DC2766352D5F0C69F947B6 PUSH9 0xFD2FF48AFDF30CB072 STOP 0x29 ",
"sourceMap": "922:2613:3:-;;;602:10:2;594:5;;:18;;;;;;;;;;;;;;;;;;922:2613:3;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "608060405234801561001057600080fd5b50600436106100935760003560e01c8063715018a611610066578063715018a6146102345780638da5cb5b1461023e578063b918161114610288578063d39de6e9146102e4578063f2fde38b1461034357610093565b806315dacbea1461009857806342f1181e1461013e578063494503d41461018257806370712939146101f0575b600080fd5b610124600480360360808110156100ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610387565b604051808215151515815260200191505060405180910390f35b6101806004803603602081101561015457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610400565b005b6101ae6004803603602081101561019857600080fd5b81019080803590602001909291905050506105cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102326004803603602081101561020657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610608565b005b61023c6108a4565b005b6102466109a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ca6004803603602081101561029e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b604051808215151515815260200191505060405180910390f35b6102ec6109e9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561032f578082015181840152602081019050610314565b505050509050019250505060405180910390f35b6103856004803603602081101561035957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a77565b005b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166103df57600080fd5b6103eb85858585610adc565b6103f457600080fd5b60019050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461045957600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156104b157600080fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060028290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f94bb87f4c15c4587ff559a7584006fa01ddf9299359be6b512b94527aa961aca60405160405180910390a35050565b600281815481106105d957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461066157600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106b857600080fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905560008090505b600280549050811015610845578273ffffffffffffffffffffffffffffffffffffffff166002828154811061073e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108385760026001600280549050038154811061079a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600282815481106107d257fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016002818180549050039150816108329190610e39565b50610845565b808060010191505061070d565b503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167ff5b347a1e40749dd050f5f07fbdbeb7e3efa9756903044dd29401fd1d4bb4a1c60405160405180910390a35050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108fd57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610a6d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a23575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad057600080fd5b610ad981610d10565b50565b60008473ffffffffffffffffffffffffffffffffffffffff16848484604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200193505050506040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310610c1e5780518252602082019150602081019050602083039250610bfb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610c80576040519150601f19603f3d011682016040523d82523d6000602084013e610c85565b606091505b50508091505080610cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5472616e736665722046726f6d206661696c656400000000000000000000000081525060200191505060405180910390fd5b610d06610e08565b9050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003d60008114610e205760208114610e2957600080fd5b60019150610e35565b60206000803e60005191505b5090565b815481835581811115610e6057818360005260206000209182019101610e5f9190610e65565b5b505050565b610e8791905b80821115610e83576000816000905550600101610e6b565b5090565b9056fea165627a7a723058202daa2f83db6f69340410f4dc2766352d5f0c69f947b668fd2ff48afdf30cb0720029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x93 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x288 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x343 JUMPI PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH4 0x15DACBEA EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x1F0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x124 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0xAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x387 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x180 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x400 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5CC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x232 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x206 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x608 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x23C PUSH2 0x8A4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x246 PUSH2 0x9A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x29E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9C9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2EC PUSH2 0x9E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x32F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x314 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x385 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x359 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA77 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB DUP6 DUP6 DUP6 DUP6 PUSH2 0xADC JUMP JUMPDEST PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x459 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x2 DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x94BB87F4C15C4587FF559A7584006FA01DDF9299359BE6B512B94527AA961ACA PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x5D9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x661 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x6B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST PUSH1 0x2 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x845 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x73E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x838 JUMPI PUSH1 0x2 PUSH1 0x1 PUSH1 0x2 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT PUSH2 0x79A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x7D2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x832 SWAP2 SWAP1 PUSH2 0xE39 JUMP JUMPDEST POP PUSH2 0x845 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x70D JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF5B347A1E40749DD050F5F07FBDBEB7E3EFA9756903044DD29401FD1D4BB4A1C PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xA6D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0xA23 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAD0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAD9 DUP2 PUSH2 0xD10 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC1E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0xBFB JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xC80 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC85 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP DUP1 SWAP2 POP POP DUP1 PUSH2 0xCFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x5472616E736665722046726F6D206661696C6564000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xD06 PUSH2 0xE08 JUMP JUMPDEST SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 RETURNDATASIZE PUSH1 0x0 DUP2 EQ PUSH2 0xE20 JUMPI PUSH1 0x20 DUP2 EQ PUSH2 0xE29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SWAP2 POP PUSH2 0xE35 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 MLOAD SWAP2 POP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xE60 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE5F SWAP2 SWAP1 PUSH2 0xE65 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xE87 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE83 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xE6B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2d 0xaa 0x2f DUP4 0xdb PUSH16 0x69340410F4DC2766352D5F0C69F947B6 PUSH9 0xFD2FF48AFDF30CB072 STOP 0x29 ",
"sourceMap": "922:2613:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;922:2613:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2951:289;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2951:289:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1754:263;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1754:263:3;;;;;;;;;;;;;;;;;;;:::i;:::-;;1415:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1415:28:3;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2135:495;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2135:495:3;;;;;;;;;;;;;;;;;;;:::i;:::-;;1045:114:2;;;:::i;:::-;;242:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1365:43:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1365:43:3;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3390:142;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3390:142:3;;;;;;;;;;;;;;;;;1327:113:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1327:113:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;2951:289:3;3121:4;1094:10;:22;1105:10;1094:22;;;;;;;;;;;;;;;;;;;;;;;;;1086:31;;;;;;3151:58;3186:5;3193:4;3199:2;3203:5;3151:34;:58::i;:::-;3143:67;;;;;;3228:4;3221:11;;2951:289;;;;;;:::o;1754:263::-;753:5:2;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1864:6:3;1318:10;:18;1329:6;1318:18;;;;;;;;;;;;;;;;;;;;;;;;;1317:19;1309:28;;;;;;1909:4;1888:10;:18;1899:6;1888:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;1924:11;1941:6;1924:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1924:24:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1998:10;1964:45;;1990:6;1964:45;;;;;;;;;;;;766:1:2;1754:263:3;:::o;1415:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2135:495::-;753:5:2;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;2245:6:3;1206:10;:18;1217:6;1206:18;;;;;;;;;;;;;;;;;;;;;;;;;1198:27;;;;;;2276:10;:18;2287:6;2276:18;;;;;;;;;;;;;;;;2269:25;;;;;;;;;;;2310:6;2319:1;2310:10;;2305:255;2326:11;:18;;;;2322:1;:22;2305:255;;;2388:6;2370:24;;:11;2382:1;2370:14;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;2366:183;;;2432:11;2465:1;2444:11;:18;;;;:22;2432:35;;;;;;;;;;;;;;;;;;;;;;;;;2415:11;2427:1;2415:14;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;2508:1;2486:11;:23;;;;;;;;;;;;;;:::i;:::-;;2528:5;;2366:183;2346:3;;;;;;;2305:255;;;;2611:10;2575:47;;2603:6;2575:47;;;;;;;;;;;;766:1:2;2135:495:3;:::o;1045:114:2:-;753:5;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1122:5;;;;;;;;;;;1103:25;;;;;;;;;;;;1151:1;1135:5;;:18;;;;;;;;;;;;;;;;;;1045:114::o;242:28::-;;;;;;;;;;;;;:::o;1365:43:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;3390:142::-;3472:16;3513:11;3506:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3390:142;:::o;1327:113:2:-;753:5;;;;;;;;;;;739:19;;:10;:19;;;731:28;;;;;;1405:29;1424:9;1405:18;:29::i;:::-;1327:113;:::o;373:349:1:-;484:12;522:13;:18;;606:5;613:3;618:6;541:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;541:84:1;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;541:84:1;522:104;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;522:104:1;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;509:117:1;;;;;645:7;637:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;697:17;:15;:17::i;:::-;690:24;;373:349;;;;;;:::o;1581:183:2:-;1681:1;1660:23;;:9;:23;;;;1652:32;;;;;;1724:9;1696:38;;1717:5;;;;;;;;;;;1696:38;;;;;;;;;;;;1749:9;1741:5;;:17;;;;;;;;;;;;;;;;;;1581:183;:::o;1052:391:1:-;1102:12;1157:16;1192:1;1187:53;;;;1259:2;1254:103;;;;1408:1;1405;1398:12;1187:53;1224:1;1213:12;;1187:53;;1254:103;1302:2;1299:1;1296;1281:24;1340:1;1334:8;1323:19;;1150:275;;1135:301;:::o;922:2613:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "753200",
"executionCost": "21028",
"totalCost": "774228"
},
"external": {
"addAuthorizedAddress(address)": "63366",
"authorities(uint256)": "862",
"authorized(address)": "650",
"getAuthorizedAddresses()": "infinite",
"owner()": "475",
"removeAuthorizedAddress(address)": "infinite",
"renounceOwnership()": "22078",
"transferFrom(address,address,address,uint256)": "infinite",
"transferOwnership(address)": "22707"
}
},
"methodIdentifiers": {
"addAuthorizedAddress(address)": "42f1181e",
"authorities(uint256)": "494503d4",
"authorized(address)": "b9181611",
"getAuthorizedAddresses()": "d39de6e9",
"owner()": "8da5cb5b",
"removeAuthorizedAddress(address)": "70712939",
"renounceOwnership()": "715018a6",
"transferFrom(address,address,address,uint256)": "15dacbea",
"transferOwnership(address)": "f2fde38b"
}
},
"abi": [
{
"constant": false,
"inputs": [
{
"name": "token",
"type": "address"
},
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "addAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "authorities",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "removeAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "authorized",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getAuthorizedAddresses",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "LogAuthorizedAddressAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "LogAuthorizedAddressRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
]
}
{
"compiler": {
"version": "0.5.7+commit.6da8b019"
},
"language": "Solidity",
"output": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "token",
"type": "address"
},
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "addAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "authorities",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "removeAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "authorized",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getAuthorizedAddresses",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "LogAuthorizedAddressAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "LogAuthorizedAddressRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"author": "Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>",
"methods": {
"addAuthorizedAddress(address)": {
"params": {
"target": "Address to authorize."
}
},
"getAuthorizedAddresses()": {
"return": "Array of authorized addresses."
},
"removeAuthorizedAddress(address)": {
"params": {
"target": "Address to remove authorization from."
}
},
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract.\r"
},
"transferFrom(address,address,address,uint256)": {
"return": "Success of transfer."
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.\r",
"params": {
"_newOwner": "The address to transfer ownership to.\r"
}
}
}
},
"userdoc": {
"methods": {
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner.\r It will not be possible to call the functions with the `onlyOwner`\r modifier anymore.\r"
}
}
}
},
"settings": {
"compilationTarget": {
"contracts/aggregator/lib/TokenTransferProxy.sol": "TokenTransferProxy"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
},
"sources": {
"contracts/aggregator/lib/ERC20.sol": {
"keccak256": "0x189d4db4c8f0f3a82f3411888fbf1b224f101facaca45e0211e9d8494c7c9e1f",
"urls": [
"bzzr://a758f9350907dad351f7bc4253c9247f16596d6a4d32deb2bb022a58d6da24b8"
]
},
"contracts/aggregator/lib/ERC20SafeTransfer.sol": {
"keccak256": "0xa9098cd9b3269311e39dbbae63389f061f72133ae8fb11ec820db9f7d0c7b314",
"urls": [
"bzzr://2f11c0ba3c36b9e2ad51e200f3a90f68eb95d16ca998cb1c0c7fca5d6781275e"
]
},
"contracts/aggregator/lib/Ownable.sol": {
"keccak256": "0x8e731f00c3ec87db506c4204097df8e8df1d60fac59d7655bb50c858ae043f6e",
"urls": [
"bzzr://a6a3349c46d3ed05b822e9e88a1ec69d96969b3ff170f73a9015d8248928dfb6"
]
},
"contracts/aggregator/lib/TokenTransferProxy.sol": {
"keccak256": "0x6cc92eb9b75096ed98bd151e206a5702831d45d70b99a06688d690c71a219190",
"urls": [
"bzzr://5d6db058a18b2b74505fae135e056daa102a1c76d15db3c97004cc946ec0a8a3"
]
}
},
"version": 1
}
pragma solidity 0.5.7;
contract Comptroller {
struct Market {
/**
* @notice Whether or not this market is listed
*/
bool isListed;
/**
* @notice Multiplier representing the most one can borrow against their collateral in this market.
* For instance, 0.9 to allow borrowing 90% of collateral value.
* Must be between 0 and 1, and stored as a mantissa.
*/
uint collateralFactorMantissa;
/**
* @notice Per-market mapping of "accounts in this asset"
*/
mapping(address => bool) accountMembership;
}
function getAccountLiquidity(address account) external view returns (uint, uint, uint);
function oracle() external view returns (address);
function transferAllowed(address cToken, address src, address dst, uint transferTokens) external returns (uint);
function markets(address) external view returns (bool, uint256);
}
pragma solidity 0.5.7;
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 {
function totalSupply() public view returns (uint256);
function balanceOf(address _who) public view returns (uint256);
function allowance(address _owner, address _spender)
public view returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool);
function approve(address _spender, uint256 _value)
public returns (bool);
function transferFrom(address _from, address _to, uint256 _value)
public returns (bool);
function decimals() public view returns (uint256);
event Transfer(
address indexed from,
address indexed to,
uint256 value
);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
pragma solidity 0.5.7;
library ERC20SafeTransfer {
function safeTransfer(address _tokenAddress, address _to, uint256 _value) internal returns (bool success) {
(success,) = _tokenAddress.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _value));
require(success, "Transfer failed");
return fetchReturnData();
}
function safeTransferFrom(address _tokenAddress, address _from, address _to, uint256 _value) internal returns (bool success) {
(success,) = _tokenAddress.call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _value));
require(success, "Transfer From failed");
return fetchReturnData();
}
function safeApprove(address _tokenAddress, address _spender, uint256 _value) internal returns (bool success) {
(success,) = _tokenAddress.call(abi.encodeWithSignature("approve(address,uint256)", _spender, _value));
require(success, "Approve failed");
return fetchReturnData();
}
function fetchReturnData() internal pure returns (bool success){
assembly {
switch returndatasize()
case 0 {
success := 1
}
case 32 {
returndatacopy(0, 0, 32)
success := mload(0)
}
default {
revert(0, 0)
}
}
}
}
pragma solidity 0.5.7;
contract Logger {
function log(
string memory message
) public pure {}
function log(
string memory message,
uint256 arg2
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4,
uint256 arg5
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4,
uint256 arg5,
address arg6
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4,
uint256 arg5,
address arg6,
address arg7
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4,
uint256 arg5,
address arg6,
address arg7,
address arg8
) public pure {}
function log(
string memory message,
uint256 arg2,
uint256 arg3,
uint256 arg4,
uint256 arg5,
address arg6,
address arg7,
address arg8,
address arg9
) public pure {}
}
pragma solidity 0.5.7;
/**
* @title Math
* @dev Assorted math operations
*/
library Math {
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
pragma solidity 0.5.7;
/*
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address payable public owner;
event OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address payable _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function _transferOwnership(address payable _newOwner) internal {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
pragma solidity 0.5.7;
import './SafeMath.sol';
import './ERC20.sol';
import './ERC20SafeTransfer.sol';
import './Utils.sol';
import './PartnerRegistry.sol';
import './Math.sol';
contract Partner {
address payable public partnerBeneficiary;
uint256 public partnerPercentage; //This is out of 1 ETH, e.g. 0.5 ETH is 50% of the fee
uint256 public overrideCompanyPercentage;
address payable public overrideCompanyBeneficiary;
PartnerRegistry public registry;
event LogPayout(
address[] tokens,
uint256[] amount
);
function init(
PartnerRegistry _registry,
address payable _overrideCompanyBeneficiary,
uint256 _overrideCompanyPercentage,
address payable _partnerBeneficiary,
uint256 _partnerPercentage
) public {
require(registry == PartnerRegistry(0x0000000000000000000000000000000000000000) &&
overrideCompanyBeneficiary == address(0x0) && partnerBeneficiary == address(0x0)
);
overrideCompanyBeneficiary = _overrideCompanyBeneficiary;
overrideCompanyPercentage = _overrideCompanyPercentage;
partnerBeneficiary = _partnerBeneficiary;
partnerPercentage = _partnerPercentage;
overrideCompanyPercentage = _overrideCompanyPercentage;
registry = _registry;
}
function payout(
address[] memory tokens,
uint256[] memory amounts
) public {
uint totalFeePercentage = getTotalFeePercentage();
address payable companyBeneficiary = companyBeneficiary();
// Payout both the partner and the company at the same time
for(uint256 index = 0; index<tokens.length; index++){
uint256 partnerAmount = SafeMath.div(SafeMath.mul(amounts[index], partnerPercentage), getTotalFeePercentage());
uint256 companyAmount = amounts[index] - partnerAmount;
if(tokens[index] == Utils.eth_address()){
partnerBeneficiary.transfer(partnerAmount);
companyBeneficiary.transfer(companyAmount);
} else {
ERC20SafeTransfer.safeTransfer(tokens[index], partnerBeneficiary, partnerAmount);
ERC20SafeTransfer.safeTransfer(tokens[index], companyBeneficiary, companyAmount);
}
}
emit LogPayout(tokens,amounts);
}
function getTotalFeePercentage() public view returns (uint256){
return partnerPercentage + companyPercentage();
}
function companyPercentage() public view returns (uint256){
if(registry != PartnerRegistry(0x0000000000000000000000000000000000000000)){
return Math.max(registry.basePercentage(), partnerPercentage);
} else {
return overrideCompanyPercentage;
}
}
function companyBeneficiary() public view returns (address payable) {
if(registry != PartnerRegistry(0x0000000000000000000000000000000000000000)){
return registry.companyBeneficiary();
} else {
return overrideCompanyBeneficiary;
}
}
function() external payable {
}
}
pragma solidity 0.5.7;
import './ERC20.sol';
contract PartnerV1 {
function payout(address[] calldata tokens, uint256[] calldata amounts) external;
}
contract PartnerV2 {
function payout(address[] calldata tokens) external;
}
contract PartnerPayoutUtility {
bytes32 constant V1_CODE_HASH = 0x70ed410f7794fe6186298c7d9ecaebe39b45c76ec8e972fae082b8708e281f89;
bytes32 constant V2_CODE_HASH = 0x5211593748d25180134da9c22079bc1279aa69bc7fbebbc044502e461c5706d4;
function payout(address partnerAddress, address[] memory tokens) public {
bytes32 codeHash;
assembly {
codeHash := extcodehash(partnerAddress)
}
if(codeHash == V2_CODE_HASH){
PartnerV2 partner = PartnerV2(partnerAddress);
partner.payout(tokens);
} else if (codeHash == V1_CODE_HASH){
PartnerV1 partner = PartnerV1(partnerAddress);
uint256[] memory amounts = new uint256[](tokens.length);
for(uint256 index = 0; index<amounts.length; index++){
if(tokens[index]== address(0x0000000000000000000000000000000000000000)){
amounts[index] = partnerAddress.balance;
} else {
ERC20 token = ERC20(tokens[index]);
amounts[index] = token.balanceOf(partnerAddress);
}
}
partner.payout(tokens, amounts);
} else {
require(false,'Error:Not a valid V1 or V2 partner contract');
}
}
}
pragma solidity 0.5.7;
import "./Ownable.sol";
import "./Partner.sol";
import "./Pausable.sol";
contract PartnerRegistry is Ownable, Pausable {
address target;
mapping(address => bool) partnerContracts;
address payable public companyBeneficiary;
uint256 public basePercentage;
PartnerRegistry public previousRegistry;
event PartnerRegistered(address indexed creator, address indexed beneficiary, address partnerContract);
constructor(PartnerRegistry _previousRegistry, address _target, address payable _companyBeneficiary, uint256 _basePercentage) public {
previousRegistry = _previousRegistry;
target = _target;
companyBeneficiary = _companyBeneficiary;
basePercentage = _basePercentage;
}
function registerPartner(address payable partnerBeneficiary, uint256 partnerPercentage) whenNotPaused external {
Partner newPartner = Partner(createClone());
newPartner.init(this,address(0x0000000000000000000000000000000000000000), 0, partnerBeneficiary, partnerPercentage);
partnerContracts[address(newPartner)] = true;
emit PartnerRegistered(address(msg.sender), partnerBeneficiary, address(newPartner));
}
function overrideRegisterPartner(
address payable _companyBeneficiary,
uint256 _companyPercentage,
address payable partnerBeneficiary,
uint256 partnerPercentage
) external onlyOwner {
Partner newPartner = Partner(createClone());
newPartner.init(PartnerRegistry(0x0000000000000000000000000000000000000000), _companyBeneficiary, _companyPercentage, partnerBeneficiary, partnerPercentage);
partnerContracts[address(newPartner)] = true;
emit PartnerRegistered(address(msg.sender), partnerBeneficiary, address(newPartner));
}
function deletePartner(address _partnerAddress) external onlyOwner {
partnerContracts[_partnerAddress] = false;
}
function createClone() internal returns (address payable result) {
bytes20 targetBytes = bytes20(target);
assembly {
let clone := mload(0x40)
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(clone, 0x14), targetBytes)
mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
result := create(0, clone, 0x37)
}
}
function isValidPartner(address partnerContract) external view returns(bool) {
return partnerContracts[partnerContract] || previousRegistry.isValidPartner(partnerContract);
}
function updateCompanyInfo(address payable newCompanyBeneficiary, uint256 newBasePercentage) external onlyOwner {
companyBeneficiary = newCompanyBeneficiary;
basePercentage = newBasePercentage;
}
}
pragma solidity 0.5.7;
import "./Ownable.sol";
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
*/
contract Pausable is Ownable {
event Paused();
event Unpaused();
bool private _paused = false;
/**
* @return true if the contract is paused, false otherwise.
*/
function paused() public view returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!_paused, "Contract is paused.");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(_paused, "Contract not paused.");
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() public onlyOwner whenNotPaused {
_paused = true;
emit Paused();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() public onlyOwner whenPaused {
_paused = false;
emit Unpaused();
}
}
pragma solidity 0.5.7;
/**
* @title SafeMath
* @dev Math operations with safety checks that revert on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, reverts on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (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-solidity/pull/522
if (_a == 0) {
return 0;
}
uint256 c = _a * _b;
require(c / _a == _b);
return c;
}
/**
* @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
*/
function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
require(_b > 0); // Solidity only automatically asserts when dividing by 0
uint256 c = _a / _b;
// assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
require(_b <= _a);
uint256 c = _a - _b;
return c;
}
/**
* @dev Adds two numbers, reverts on overflow.
*/
function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
uint256 c = _a + _b;
require(c >= _a);
return c;
}
/**
* @dev Divides two numbers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
pragma solidity 0.5.7;
import "./SafeMath.sol";
contract ERC20 {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/
contract BasicToken is ERC20 {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
*/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
// SafeMath.sub will throw if there is not enough balance.
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
}
/**
* @title Standard ERC20 Stantoken
*
* @dev Implementation of the basic standard token.
* @dev https://github.com/ethereum/EIPs/issues/20
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is BasicToken {
uint256 public decimals = 10;
constructor(address user1, address user2) public {
balances[user1] = uint256(-1)/2;
balances[user2] = uint256(-1)/2;
}
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool){
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
*/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
*/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;
library TokenBalanceLibrary {
struct TokenBalance {
address tokenAddress;
uint256 balance;
}
function findToken(TokenBalance[20] memory balances, address token)
internal
pure
returns (uint256)
{
for (uint256 index = 0; index < balances.length; index++) {
if (balances[index].tokenAddress == token) {
return index;
} else if (
index != 0 && balances[index].tokenAddress == address(0x0)
) {
balances[index] = TokenBalance(token, 0);
return index;
}
}
}
function addBalance(
TokenBalance[20] memory balances,
address tokenAddress,
uint256 amountToAdd
) internal pure {
uint256 tokenIndex = findToken(balances, tokenAddress);
addBalance(balances, tokenIndex, amountToAdd);
}
function addBalance(
TokenBalance[20] memory balances,
uint256 balanceIndex,
uint256 amountToAdd
) internal pure {
balances[balanceIndex].balance += amountToAdd;
}
function removeBalance(
TokenBalance[20] memory balances,
address tokenAddress,
uint256 amountToRemove
) internal pure {
uint256 tokenIndex = findToken(balances, tokenAddress);
removeBalance(balances, tokenIndex, amountToRemove);
}
function removeBalance(
TokenBalance[20] memory balances,
uint256 balanceIndex,
uint256 amountToRemove
) internal pure {
balances[balanceIndex].balance -= amountToRemove;
}
}
/*
Copyright 2018 ZeroEx Intl.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
pragma solidity 0.5.7;
import "./ERC20.sol";
import "./ERC20SafeTransfer.sol";
import "./Ownable.sol";
/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
contract TokenTransferProxy is Ownable {
/// @dev Only authorized addresses can invoke functions with this modifier.
modifier onlyAuthorized {
require(authorized[msg.sender]);
_;
}
modifier targetAuthorized(address target) {
require(authorized[target]);
_;
}
modifier targetNotAuthorized(address target) {
require(!authorized[target]);
_;
}
mapping (address => bool) public authorized;
address[] public authorities;
event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
/*
* Public functions
*/
/// @dev Authorizes an address.
/// @param target Address to authorize.
function addAuthorizedAddress(address target)
public
onlyOwner
targetNotAuthorized(target)
{
authorized[target] = true;
authorities.push(target);
emit LogAuthorizedAddressAdded(target, msg.sender);
}
/// @dev Removes authorizion of an address.
/// @param target Address to remove authorization from.
function removeAuthorizedAddress(address target)
public
onlyOwner
targetAuthorized(target)
{
delete authorized[target];
for (uint i = 0; i < authorities.length; i++) {
if (authorities[i] == target) {
authorities[i] = authorities[authorities.length - 1];
authorities.length -= 1;
break;
}
}
emit LogAuthorizedAddressRemoved(target, msg.sender);
}
/// @dev Calls into ERC20 Token contract, invoking transferFrom.
/// @param token Address of token to transfer.
/// @param from Address to transfer token from.
/// @param to Address to transfer token to.
/// @param value Amount of token to transfer.
/// @return Success of transfer.
function transferFrom(
address token,
address from,
address to,
uint value)
public
onlyAuthorized
returns (bool)
{
require(ERC20SafeTransfer.safeTransferFrom(token, from, to, value));
return true;
}
/*
* Public view functions
*/
/// @dev Gets all authorized addresses.
/// @return Array of authorized addresses.
function getAuthorizedAddresses()
public
view
returns (address[] memory)
{
return authorities;
}
}
pragma solidity 0.5.7;
import "./Ownable.sol";
/// @title A contract which can be used to ensure only the TotlePrimary contract can call
/// some functions
/// @dev Defines a modifier which should be used when only the totle contract should
/// able able to call a function
contract TotleControl is Ownable {
mapping(address => bool) public authorizedPrimaries;
/// @dev A modifier which only allows code execution if msg.sender equals totlePrimary address
modifier onlyTotle() {
require(authorizedPrimaries[msg.sender]);
_;
}
/// @notice Contract constructor
/// @dev As this contract inherits ownable, msg.sender will become the contract owner
/// @param _totlePrimary the address of the contract to be set as totlePrimary
constructor(address _totlePrimary) public {
authorizedPrimaries[_totlePrimary] = true;
}
/// @notice A function which allows only the owner to change the address of totlePrimary
/// @dev onlyOwner modifier only allows the contract owner to run the code
/// @param _totlePrimary the address of the contract to be set as totlePrimary
function addTotle(
address _totlePrimary
) external onlyOwner {
authorizedPrimaries[_totlePrimary] = true;
}
function removeTotle(
address _totlePrimary
) external onlyOwner {
authorizedPrimaries[_totlePrimary] = false;
}
}
pragma solidity 0.5.7;
import "./ERC20.sol";
/*
Modified Util contract as used by Kyber Network
*/
library Utils {
uint256 constant internal PRECISION = (10**18);
uint256 constant internal MAX_QTY = (10**28); // 10B tokens
uint256 constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH
uint256 constant internal MAX_DECIMALS = 18;
uint256 constant internal ETH_DECIMALS = 18;
uint256 constant internal MAX_UINT = 2**256-1;
address constant internal ETH_ADDRESS = address(0x0);
// Currently constants can't be accessed from other contracts, so providing functions to do that here
function precision() internal pure returns (uint256) { return PRECISION; }
function max_qty() internal pure returns (uint256) { return MAX_QTY; }
function max_rate() internal pure returns (uint256) { return MAX_RATE; }
function max_decimals() internal pure returns (uint256) { return MAX_DECIMALS; }
function eth_decimals() internal pure returns (uint256) { return ETH_DECIMALS; }
function max_uint() internal pure returns (uint256) { return MAX_UINT; }
function eth_address() internal pure returns (address) { return ETH_ADDRESS; }
/// @notice Retrieve the number of decimals used for a given ERC20 token
/// @dev As decimals are an optional feature in ERC20, this contract uses `call` to
/// ensure that an exception doesn't cause transaction failure
/// @param token the token for which we should retrieve the decimals
/// @return decimals the number of decimals in the given token
function getDecimals(address token)
internal
returns (uint256 decimals)
{
bytes4 functionSig = bytes4(keccak256("decimals()"));
/// @dev Using assembly due to issues with current solidity `address.call()`
/// implementation: https://github.com/ethereum/solidity/issues/2884
assembly {
// Pointer to next free memory slot
let ptr := mload(0x40)
// Store functionSig variable at ptr
mstore(ptr,functionSig)
let functionSigLength := 0x04
let wordLength := 0x20
let success := call(
gas, // Amount of gas
token, // Address to call
0, // ether to send
ptr, // ptr to input data
functionSigLength, // size of data
ptr, // where to store output data (overwrite input)
wordLength // size of output data (32 bytes)
)
switch success
case 0 {
decimals := 0 // If the token doesn't implement `decimals()`, return 0 as default
}
case 1 {
decimals := mload(ptr) // Set decimals to return data from call
}
mstore(0x40,add(ptr,0x04)) // Reset the free memory pointer to the next known free location
}
}
/// @dev Checks that a given address has its token allowance and balance set above the given amount
/// @param tokenOwner the address which should have custody of the token
/// @param tokenAddress the address of the token to check
/// @param tokenAmount the amount of the token which should be set
/// @param addressToAllow the address which should be allowed to transfer the token
/// @return bool true if the allowance and balance is set, false if not
function tokenAllowanceAndBalanceSet(
address tokenOwner,
address tokenAddress,
uint256 tokenAmount,
address addressToAllow
)
internal
view
returns (bool)
{
return (
ERC20(tokenAddress).allowance(tokenOwner, addressToAllow) >= tokenAmount &&
ERC20(tokenAddress).balanceOf(tokenOwner) >= tokenAmount
);
}
function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns (uint) {
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
}
}
function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns (uint) {
//source quantity is rounded up. to avoid dest quantity being too low.
uint numerator;
uint denominator;
if (srcDecimals >= dstDecimals) {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
denominator = rate;
} else {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty);
denominator = (rate * (10**(dstDecimals - srcDecimals)));
}
return (numerator + denominator - 1) / denominator; //avoid rounding down errors
}
function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal returns (uint) {
return calcDstQty(srcAmount, getDecimals(address(src)), getDecimals(address(dest)), rate);
}
function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal returns (uint) {
return calcSrcQty(destAmount, getDecimals(address(src)), getDecimals(address(dest)), rate);
}
function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
internal pure returns (uint)
{
require(srcAmount <= MAX_QTY);
require(destAmount <= MAX_QTY);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
}
}
/// @notice Bringing this in from the Math library as we've run out of space in TotlePrimary (see EIP-170)
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}
pragma solidity 0.5.7;
import "./Ownable.sol";
import "./ERC20SafeTransfer.sol";
/// @title A contract which allows its owner to withdraw any ether which is contained inside
contract Withdrawable is Ownable {
/// @notice Withdraw ether contained in this contract and send it back to owner
/// @dev onlyOwner modifier only allows the contract owner to run the code
/// @param _token The address of the token that the user wants to withdraw
/// @param _amount The amount of tokens that the caller wants to withdraw
/// @return bool value indicating whether the transfer was successful
function withdrawToken(address _token, uint256 _amount) external onlyOwner returns (bool) {
return ERC20SafeTransfer.safeTransfer(_token, owner, _amount);
}
/// @notice Withdraw ether contained in this contract and send it back to owner
/// @dev onlyOwner modifier only allows the contract owner to run the code
/// @param _amount The amount of ether that the caller wants to withdraw
function withdrawETH(uint256 _amount) external onlyOwner {
owner.transfer(_amount);
}
}
pragma solidity 0.5.7;
interface WONE {
function deposit() external payable;
function withdraw(uint256 amount) external;
function balanceOf(address account) external returns (uint256);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment