Skip to content

Instantly share code, notes, and snippets.

@hack3r-0m
Last active September 17, 2021 06:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hack3r-0m/71102da691183574222fcb90241a07e8 to your computer and use it in GitHub Desktop.
Save hack3r-0m/71102da691183574222fcb90241a07e8 to your computer and use it in GitHub Desktop.
0x exchange v3 debugging
RPC=
MAKER_PRIVATE_KEY=
TAKER_PRIVATE_KEY=
MAKER_FROM_ADDRESS=
TAKER_FROM_ADDRESS=
{
"schemaVersion": "2.0.0",
"contractName": "Exchange",
"compilerOutput": {
"abi": [
{
"inputs": [
{
"internalType": "uint256",
"name": "chainId",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes4",
"name": "id",
"type": "bytes4"
},
{
"indexed": false,
"internalType": "address",
"name": "assetProxy",
"type": "address"
}
],
"name": "AssetProxyRegistered",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"indexed": false,
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "Cancel",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "orderSenderAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "orderEpoch",
"type": "uint256"
}
],
"name": "CancelUpTo",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"name": "Fill",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "oldProtocolFeeCollector",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "updatedProtocolFeeCollector",
"type": "address"
}
],
"name": "ProtocolFeeCollectorAddress",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldProtocolFeeMultiplier",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "updatedProtocolFeeMultiplier",
"type": "uint256"
}
],
"name": "ProtocolFeeMultiplier",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "signerAddress",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "validatorAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "isApproved",
"type": "bool"
}
],
"name": "SignatureValidatorApproval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "transactionHash",
"type": "bytes32"
}
],
"name": "TransactionExecution",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "EIP1271_MAGIC_VALUE",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "EIP712_EXCHANGE_DOMAIN_HASH",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "allowedValidators",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
}
],
"name": "batchCancelOrders",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "address",
"name": "signerAddress",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct LibZeroExTransaction.ZeroExTransaction[]",
"name": "transactions",
"type": "tuple[]"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "batchExecuteTransactions",
"outputs": [
{
"internalType": "bytes[]",
"name": "returnData",
"type": "bytes[]"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256[]",
"name": "takerAssetFillAmounts",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "batchFillOrKillOrders",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "fillResults",
"type": "tuple[]"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256[]",
"name": "takerAssetFillAmounts",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "batchFillOrders",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "fillResults",
"type": "tuple[]"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256[]",
"name": "takerAssetFillAmounts",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "batchFillOrdersNoThrow",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "fillResults",
"type": "tuple[]"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "leftOrders",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "rightOrders",
"type": "tuple[]"
},
{
"internalType": "bytes[]",
"name": "leftSignatures",
"type": "bytes[]"
},
{
"internalType": "bytes[]",
"name": "rightSignatures",
"type": "bytes[]"
}
],
"name": "batchMatchOrders",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "left",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "right",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "profitInLeftMakerAsset",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "profitInRightMakerAsset",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.BatchMatchedFillResults",
"name": "batchMatchedFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "leftOrders",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "rightOrders",
"type": "tuple[]"
},
{
"internalType": "bytes[]",
"name": "leftSignatures",
"type": "bytes[]"
},
{
"internalType": "bytes[]",
"name": "rightSignatures",
"type": "bytes[]"
}
],
"name": "batchMatchOrdersWithMaximalFill",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "left",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults[]",
"name": "right",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "profitInLeftMakerAsset",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "profitInRightMakerAsset",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.BatchMatchedFillResults",
"name": "batchMatchedFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "order",
"type": "tuple"
}
],
"name": "cancelOrder",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "targetOrderEpoch",
"type": "uint256"
}
],
"name": "cancelOrdersUpTo",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "cancelled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentContextAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "detachProtocolFeeCollector",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "address",
"name": "signerAddress",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct LibZeroExTransaction.ZeroExTransaction",
"name": "transaction",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "executeTransaction",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "order",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "takerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "fillOrKillOrder",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "order",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "takerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "fillOrder",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "filled",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes4",
"name": "assetProxyId",
"type": "bytes4"
}
],
"name": "getAssetProxy",
"outputs": [
{
"internalType": "address",
"name": "assetProxy",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "order",
"type": "tuple"
}
],
"name": "getOrderInfo",
"outputs": [
{
"components": [
{
"internalType": "enum LibOrder.OrderStatus",
"name": "orderStatus",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "orderTakerAssetFilledAmount",
"type": "uint256"
}
],
"internalType": "struct LibOrder.OrderInfo",
"name": "orderInfo",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "hash",
"type": "bytes32"
},
{
"internalType": "address",
"name": "signerAddress",
"type": "address"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "isValidHashSignature",
"outputs": [
{
"internalType": "bool",
"name": "isValid",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "order",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "isValidOrderSignature",
"outputs": [
{
"internalType": "bool",
"name": "isValid",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasPrice",
"type": "uint256"
},
{
"internalType": "address",
"name": "signerAddress",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"internalType": "struct LibZeroExTransaction.ZeroExTransaction",
"name": "transaction",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "isValidTransactionSignature",
"outputs": [
{
"internalType": "bool",
"name": "isValid",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "makerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "marketBuyOrdersFillOrKill",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "makerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "marketBuyOrdersNoThrow",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "takerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "marketSellOrdersFillOrKill",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{
"internalType": "uint256",
"name": "takerAssetFillAmount",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "signatures",
"type": "bytes[]"
}
],
"name": "marketSellOrdersNoThrow",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "fillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "leftOrder",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "rightOrder",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "leftSignature",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "rightSignature",
"type": "bytes"
}
],
"name": "matchOrders",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "left",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "right",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "profitInLeftMakerAsset",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "profitInRightMakerAsset",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.MatchedFillResults",
"name": "matchedFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "leftOrder",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "makerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "takerAddress",
"type": "address"
},
{
"internalType": "address",
"name": "feeRecipientAddress",
"type": "address"
},
{
"internalType": "address",
"name": "senderAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "makerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "makerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "makerFeeAssetData",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "takerFeeAssetData",
"type": "bytes"
}
],
"internalType": "struct LibOrder.Order",
"name": "rightOrder",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "leftSignature",
"type": "bytes"
},
{
"internalType": "bytes",
"name": "rightSignature",
"type": "bytes"
}
],
"name": "matchOrdersWithMaximalFill",
"outputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "left",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "makerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "takerFeePaid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeePaid",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.FillResults",
"name": "right",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "profitInLeftMakerAsset",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "profitInRightMakerAsset",
"type": "uint256"
}
],
"internalType": "struct LibFillResults.MatchedFillResults",
"name": "matchedFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "orderEpoch",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "bytes32",
"name": "hash",
"type": "bytes32"
}
],
"name": "preSign",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "preSigned",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "protocolFeeCollector",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "protocolFeeMultiplier",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "assetProxy",
"type": "address"
}
],
"name": "registerAssetProxy",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "updatedProtocolFeeCollector",
"type": "address"
}
],
"name": "setProtocolFeeCollectorAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "updatedProtocolFeeMultiplier",
"type": "uint256"
}
],
"name": "setProtocolFeeMultiplier",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "validatorAddress",
"type": "address"
},
{
"internalType": "bool",
"name": "approval",
"type": "bool"
}
],
"name": "setSignatureValidatorApproval",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "bytes[]",
"name": "assetData",
"type": "bytes[]"
},
{
"internalType": "address[]",
"name": "fromAddresses",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "toAddresses",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"name": "simulateDispatchTransferFromCalls",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "transactionsExecuted",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"details": "The 0x Exchange contract.",
"methods": {
"batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[])": {
"details": "Executes multiple calls of cancelOrder.",
"params": {
"orders": "Array of order specifications."
}
},
"batchExecuteTransactions((uint256,uint256,uint256,address,bytes)[],bytes[])": {
"details": "Executes a batch of Exchange method calls in the context of signer(s).",
"params": {
"signatures": "Array of proofs that transactions have been signed by signer(s).",
"transactions": "Array of 0x transaction structures."
},
"return": "returnData Array containing ABI encoded return data for each of the underlying Exchange function calls."
},
"batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
"details": "Executes multiple calls of fillOrKillOrder.",
"params": {
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been created by makers.",
"takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
},
"return": "fillResults Array of amounts filled and fees paid by makers and taker."
},
"batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
"details": "Executes multiple calls of fillOrder.",
"params": {
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been created by makers.",
"takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
},
"return": "fillResults Array of amounts filled and fees paid by makers and taker."
},
"batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
"details": "Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.",
"params": {
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been created by makers.",
"takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
},
"return": "fillResults Array of amounts filled and fees paid by makers and taker."
},
"batchMatchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])": {
"details": "Match complementary orders that have a profitable spread. Each order is filled at their respective price point, and the matcher receives a profit denominated in the left maker asset.",
"params": {
"leftOrders": "Set of orders with the same maker / taker asset.",
"leftSignatures": "Proof that left orders were created by the left makers.",
"rightOrders": "Set of orders to match against `leftOrders`",
"rightSignatures": "Proof that right orders were created by the right makers."
},
"return": "batchMatchedFillResults Amounts filled and profit generated."
},
"batchMatchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])": {
"details": "Match complementary orders that have a profitable spread. Each order is maximally filled at their respective price point, and the matcher receives a profit denominated in either the left maker asset, right maker asset, or a combination of both.",
"params": {
"leftOrders": "Set of orders with the same maker / taker asset.",
"leftSignatures": "Proof that left orders were created by the left makers.",
"rightOrders": "Set of orders to match against `leftOrders`",
"rightSignatures": "Proof that right orders were created by the right makers."
},
"return": "batchMatchedFillResults Amounts filled and profit generated."
},
"cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes))": {
"details": "After calling, the order can not be filled anymore.",
"params": {
"order": "Order struct containing order specifications."
}
},
"cancelOrdersUpTo(uint256)": {
"details": "Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).",
"params": {
"targetOrderEpoch": "Orders created with a salt less or equal to this value will be cancelled."
}
},
"constructor": {
"details": "Mixins are instantiated in the order they are inherited",
"params": {
"chainId": "Chain ID of the network this contract is deployed on."
}
},
"detachProtocolFeeCollector()": {
"details": "Sets the protocolFeeCollector contract address to 0. Only callable by owner."
},
"executeTransaction((uint256,uint256,uint256,address,bytes),bytes)": {
"details": "Executes an Exchange method call in the context of signer.",
"params": {
"signature": "Proof that transaction has been signed by signer.",
"transaction": "0x transaction structure."
},
"return": "ABI encoded return data of the underlying Exchange function call."
},
"fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes)": {
"details": "Fills the input order. Reverts if exact `takerAssetFillAmount` not filled.",
"params": {
"order": "Order struct containing order specifications.",
"signature": "Proof that order has been created by maker.",
"takerAssetFillAmount": "Desired amount of takerAsset to sell."
},
"return": "fillResults Amounts filled and fees paid."
},
"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes)": {
"details": "Fills the input order.",
"params": {
"order": "Order struct containing order specifications.",
"signature": "Proof that order has been created by maker.",
"takerAssetFillAmount": "Desired amount of takerAsset to sell."
},
"return": "fillResults Amounts filled and fees paid by maker and taker."
},
"getAssetProxy(bytes4)": {
"details": "Gets an asset proxy.",
"params": {
"assetProxyId": "Id of the asset proxy."
},
"return": "assetProxy The asset proxy address registered to assetProxyId. Returns 0x0 if no proxy is registered."
},
"getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes))": {
"details": "Gets information about an order: status, hash, and amount filled.",
"params": {
"order": "Order to gather information on."
},
"return": "orderInfo Information about the order and its state. See LibOrder.OrderInfo for a complete description."
},
"isValidHashSignature(bytes32,address,bytes)": {
"details": "Verifies that a hash has been signed by the given signer.",
"params": {
"hash": "Any 32-byte hash.",
"signature": "Proof that the hash has been signed by signer.",
"signerAddress": "Address that should have signed the given hash."
},
"return": "isValid `true` if the signature is valid for the given hash and signer."
},
"isValidOrderSignature((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": {
"details": "Verifies that a signature for an order is valid.",
"params": {
"order": "The order.",
"signature": "Proof that the order has been signed by signer."
},
"return": "isValid `true` if the signature is valid for the given order and signer."
},
"isValidTransactionSignature((uint256,uint256,uint256,address,bytes),bytes)": {
"details": "Verifies that a signature for a transaction is valid.",
"params": {
"signature": "Proof that the order has been signed by signer.",
"transaction": "The transaction."
},
"return": "isValid `true` if the signature is valid for the given transaction and signer."
},
"marketBuyOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
"details": "Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought. NOTE: This function does not enforce that the makerAsset is the same for each order.",
"params": {
"makerAssetFillAmount": "Minimum amount of makerAsset to buy.",
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been signed by makers."
},
"return": "fillResults Amounts filled and fees paid by makers and taker."
},
"marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
"details": "Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker. If any fill reverts, the error is caught and ignored. NOTE: This function does not enforce that the makerAsset is the same for each order.",
"params": {
"makerAssetFillAmount": "Desired amount of makerAsset to buy.",
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been signed by makers."
},
"return": "fillResults Amounts filled and fees paid by makers and taker."
},
"marketSellOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
"details": "Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold. NOTE: This function does not enforce that the takerAsset is the same for each order.",
"params": {
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been signed by makers.",
"takerAssetFillAmount": "Minimum amount of takerAsset to sell."
},
"return": "fillResults Amounts filled and fees paid by makers and taker."
},
"marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
"details": "Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker. If any fill reverts, the error is caught and ignored. NOTE: This function does not enforce that the takerAsset is the same for each order.",
"params": {
"orders": "Array of order specifications.",
"signatures": "Proofs that orders have been signed by makers.",
"takerAssetFillAmount": "Desired amount of takerAsset to sell."
},
"return": "fillResults Amounts filled and fees paid by makers and taker."
},
"matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes,bytes)": {
"details": "Match two complementary orders that have a profitable spread. Each order is filled at their respective price point. However, the calculations are carried out as though the orders are both being filled at the right order's price point. The profit made by the left order goes to the taker (who matched the two orders).",
"params": {
"leftOrder": "First order to match.",
"leftSignature": "Proof that order was created by the left maker.",
"rightOrder": "Second order to match.",
"rightSignature": "Proof that order was created by the right maker."
},
"return": "matchedFillResults Amounts filled and fees paid by maker and taker of matched orders."
},
"matchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes,bytes)": {
"details": "Match two complementary orders that have a profitable spread. Each order is maximally filled at their respective price point, and the matcher receives a profit denominated in either the left maker asset, right maker asset, or a combination of both.",
"params": {
"leftOrder": "First order to match.",
"leftSignature": "Proof that order was created by the left maker.",
"rightOrder": "Second order to match.",
"rightSignature": "Proof that order was created by the right maker."
},
"return": "matchedFillResults Amounts filled by maker and taker of matched orders."
},
"preSign(bytes32)": {
"details": "Approves a hash on-chain. After presigning a hash, the preSign signature type will become valid for that hash and signer.",
"params": {
"hash": "Any 32-byte hash."
}
},
"registerAssetProxy(address)": {
"details": "Registers an asset proxy to its asset proxy id. Once an asset proxy is registered, it cannot be unregistered.",
"params": {
"assetProxy": "Address of new asset proxy to register."
}
},
"setProtocolFeeCollectorAddress(address)": {
"details": "Allows the owner to update the protocolFeeCollector address.",
"params": {
"updatedProtocolFeeCollector": "The updated protocolFeeCollector contract address."
}
},
"setProtocolFeeMultiplier(uint256)": {
"details": "Allows the owner to update the protocol fee multiplier.",
"params": {
"updatedProtocolFeeMultiplier": "The updated protocol fee multiplier."
}
},
"setSignatureValidatorApproval(address,bool)": {
"details": "Approves/unnapproves a Validator contract to verify signatures on signer's behalf using the `Validator` signature type.",
"params": {
"approval": "Approval or disapproval of Validator contract.",
"validatorAddress": "Address of Validator contract."
}
},
"simulateDispatchTransferFromCalls(bytes[],address[],address[],uint256[])": {
"details": "This function may be used to simulate any amount of transfers As they would occur through the Exchange contract. Note that this function will always revert, even if all transfers are successful. However, it may be used with eth_call or with a try/catch pattern in order to simulate the results of the transfers.",
"params": {
"amounts": "Array containing the amounts that correspond to each transfer.",
"assetData": "Array of asset details, each encoded per the AssetProxy contract specification.",
"fromAddresses": "Array containing the `from` addresses that correspond with each transfer.",
"toAddresses": "Array containing the `to` addresses that correspond with each transfer."
},
"return": "This function does not return a value. However, it will always revert with `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful."
},
"transferOwnership(address)": {
"details": "Change the owner of this contract.",
"params": {
"newOwner": "New owner address."
}
}
}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162005db338038062005db3833981016040819052620000419162000117565b600080546001600160a01b03191633178155819080309050620000b26040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b8152508584620000c060201b62005bd91760201c565b600155506200013092505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b60006020828403121562000129578081fd5b5051919050565b615c7380620001406000396000f3fe6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c3565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594c565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159d1565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a13565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615915565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a63565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589e565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8e565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a41565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fe565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158ac565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1f565b615af8565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1f565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1f565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1f565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af8565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af8565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af8565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b89565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1f565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b89565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b89565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bab565b600060208284031215614f25578081fd5b815161096681615bab565b600060a08284031215614f41578081fd5b614f4b60a0615af8565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3f565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b7f565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b6b565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b75565b91905290565b6060810161585285615b75565b938152602081019290925260409091015290565b606081016003851061587457fe5b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b606081016003851061585257fe5b606081016008851061585257fe5b60006158c586615b7f565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590b84615b6b565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596860a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a38183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e58284516151e6565b60208301516159f760a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2381615b7f565b80835250602083015160208301526040830151604083015292915050565b600060408252615a546040830185615216565b90508260208301529392505050565b600060608252615a766060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae860e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1757600080fd5b604052919050565b600067ffffffffffffffff821115615b35578081fd5b5060209081020190565b60005b83811015615b5a578181015183820152602001615b42565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a7231582014d0c4c051bc6bd0373e742aeadd0f096942ba0bb0c32d7fa567c4419076dfd96c6578706572696d656e74616cf564736f6c63430005110040",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5DB3 CODESIZE SUB DUP1 PUSH3 0x5DB3 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x41 SWAP2 PUSH3 0x117 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR DUP2 SSTORE DUP2 SWAP1 DUP1 ADDRESS SWAP1 POP PUSH3 0xB2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH11 0xC1E08141C9BDD1BD8DBDB PUSH1 0xAA SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E302E3 PUSH1 0xDC SHL DUP2 MSTORE POP DUP6 DUP5 PUSH3 0xC0 PUSH1 0x20 SHL PUSH3 0x5BD9 OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x1 SSTORE POP PUSH3 0x130 SWAP3 POP POP POP JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x129 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x5C73 DUP1 PUSH3 0x140 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8D45CD23 GT PUSH2 0x184 JUMPI DUP1 PUSH4 0xBEEE2E14 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xDD885E2D GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xEEA086BA GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x735 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x74A JUMPI DUP1 PUSH4 0xFC74896D EQ PUSH2 0x76A JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xDD885E2D EQ PUSH2 0x6ED JUMPI DUP1 PUSH4 0xDEDFC1F1 EQ PUSH2 0x70F JUMPI DUP1 PUSH4 0xE14B58C4 EQ PUSH2 0x722 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xC26CFECD GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x698 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x6AD JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x6CD JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xBEEE2E14 EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0xC0FA16CC EQ PUSH2 0x678 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x9B44D556 GT PUSH2 0x138 JUMPI DUP1 PUSH4 0xA6C3BF33 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0xA6C3BF33 EQ PUSH2 0x61F JUMPI DUP1 PUSH4 0xB04FBDDD EQ PUSH2 0x632 JUMPI DUP1 PUSH4 0xB718E292 EQ PUSH2 0x652 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x9B44D556 EQ PUSH2 0x5BF JUMPI DUP1 PUSH4 0x9D3FA4B9 EQ PUSH2 0x5D2 JUMPI DUP1 PUSH4 0xA12DCC6F EQ PUSH2 0x5FF JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x8EA8DFE4 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x8EA8DFE4 EQ PUSH2 0x56C JUMPI DUP1 PUSH4 0x9331C742 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x9694A402 EQ PUSH2 0x5AC JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x8D45CD23 EQ PUSH2 0x537 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x557 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x60704108 GT PUSH2 0x23D JUMPI DUP1 PUSH4 0x7B8E3514 GT PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x850A1501 GT PUSH2 0x1CB JUMPI DUP1 PUSH4 0x850A1501 EQ PUSH2 0x4EF JUMPI DUP1 PUSH4 0x88EC79FB EQ PUSH2 0x504 JUMPI DUP1 PUSH4 0x8BC8EFB3 EQ PUSH2 0x524 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x48F JUMPI DUP1 PUSH4 0x8171C407 EQ PUSH2 0x4AF JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x4CF JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x6FCF3E9E GT PUSH2 0x222 JUMPI DUP1 PUSH4 0x6FCF3E9E EQ PUSH2 0x456 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x469 JUMPI DUP1 PUSH4 0x78D29AC1 EQ PUSH2 0x47C JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x60704108 EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0x6A1A80FD EQ PUSH2 0x436 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x2AC12622 GT PUSH2 0x294 JUMPI DUP1 PUSH4 0x369DA099 GT PUSH2 0x279 JUMPI DUP1 PUSH4 0x369DA099 EQ PUSH2 0x3C3 JUMPI DUP1 PUSH4 0x46C02D7A EQ PUSH2 0x3E3 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x3F6 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0x2DA62987 EQ PUSH2 0x3B0 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x1CE4C78B GT PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x1CE4C78B EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0x2280C910 EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x370 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x228E168 EQ PUSH2 0x2E1 JUMPI DUP1 PUSH4 0xEFCA185 EQ PUSH2 0x317 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x2FC CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x78A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x79F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54CE JUMP JUMPDEST PUSH2 0x363 PUSH2 0x35E CALLDATASIZE PUSH1 0x4 PUSH2 0x5107 JUMP JUMPDEST PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x569F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x38B CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x7FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x3AB CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x80D JUMP JUMPDEST PUSH2 0x32C PUSH2 0x3BE CALLDATASIZE PUSH1 0x4 PUSH2 0x4F81 JUMP JUMPDEST PUSH2 0x822 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x3D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0x846 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x59C3 JUMP JUMPDEST PUSH2 0x32C PUSH2 0x3F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x96D JUMP JUMPDEST PUSH2 0x32C PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x9E0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0x424 CALLDATASIZE PUSH1 0x4 PUSH2 0x4EF8 JUMP JUMPDEST PUSH2 0xAED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x535A JUMP JUMPDEST PUSH2 0x449 PUSH2 0x444 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C4B JUMP JUMPDEST PUSH2 0xB3B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x594C JUMP JUMPDEST PUSH2 0x449 PUSH2 0x464 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C4B JUMP JUMPDEST PUSH2 0xB73 JUMP JUMPDEST PUSH2 0x32C PUSH2 0x477 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B35 JUMP JUMPDEST PUSH2 0xB91 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x48A CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0xC54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4AA CALLDATASIZE PUSH1 0x4 PUSH2 0x4B01 JUMP JUMPDEST PUSH2 0xDA4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4CA CALLDATASIZE PUSH1 0x4 PUSH2 0x4EAB JUMP JUMPDEST PUSH2 0xDC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4EA CALLDATASIZE PUSH1 0x4 PUSH2 0x4E87 JUMP JUMPDEST PUSH2 0xE23 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0xE43 JUMP JUMPDEST PUSH2 0x517 PUSH2 0x512 CALLDATASIZE PUSH1 0x4 PUSH2 0x500B JUMP JUMPDEST PUSH2 0xE5F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x59D1 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x532 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0xE7D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x552 CALLDATASIZE PUSH1 0x4 PUSH2 0x5107 JUMP JUMPDEST PUSH2 0xEB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x563 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x57F PUSH2 0x57A CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0xEF2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x5A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x101D JUMP JUMPDEST PUSH2 0x57F PUSH2 0x5BA CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0x1065 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x5CD CALLDATASIZE PUSH1 0x4 PUSH2 0x50A7 JUMP JUMPDEST PUSH2 0x112C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5F2 PUSH2 0x5ED CALLDATASIZE PUSH1 0x4 PUSH2 0x4F81 JUMP JUMPDEST PUSH2 0x1151 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x5A13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x61A CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB4 JUMP JUMPDEST PUSH2 0x1246 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x62D CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0x126B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x64D CALLDATASIZE PUSH1 0x4 PUSH2 0x4B70 JUMP JUMPDEST PUSH2 0x129F JUMP JUMPDEST PUSH2 0x517 PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x500B JUMP JUMPDEST PUSH2 0x134B JUMP JUMPDEST PUSH2 0x57F PUSH2 0x673 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0x1369 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x684 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x693 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x141E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x142F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x6C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x1435 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x6E8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B01 JUMP JUMPDEST PUSH2 0x15C9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x702 PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x562A JUMP JUMPDEST PUSH2 0x32C PUSH2 0x71D CALLDATASIZE PUSH1 0x4 PUSH2 0x4C18 JUMP JUMPDEST PUSH2 0x160A JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x730 CALLDATASIZE PUSH1 0x4 PUSH2 0x50A7 JUMP JUMPDEST PUSH2 0x164C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x741 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0x1667 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x756 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x765 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x1683 JUMP JUMPDEST PUSH2 0x77D PUSH2 0x778 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DBE JUMP JUMPDEST PUSH2 0x1726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x5432 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x7A7 PUSH2 0x184F JUMP JUMPDEST PUSH2 0x7B1 PUSH1 0x0 PUSH2 0x1896 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x7C3 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x7D9 JUMPI PUSH2 0x7D2 DUP4 DUP4 PUSH2 0x1953 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x7E1 PUSH2 0x1A6D JUMP JUMPDEST PUSH2 0x7EB DUP4 DUP4 PUSH2 0x1953 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH2 0x1AAF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x82A PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x833 DUP2 PUSH2 0x1B4E JUMP JUMPDEST PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x843 PUSH2 0x1BA7 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x84E PUSH2 0x456A JUMP JUMPDEST PUSH2 0x856 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x8EC JUMPI DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI PUSH1 0x0 PUSH2 0x880 DUP5 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x88A PUSH2 0x456A JUMP JUMPDEST PUSH2 0x8BB DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x899 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1BF0 JUMP JUMPDEST SWAP1 POP PUSH2 0x8C7 DUP6 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP5 POP DUP7 DUP6 PUSH1 0x20 ADD MLOAD LT PUSH2 0x8DB JUMPI POP POP PUSH2 0x8E5 JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x860 JUMP JUMPDEST POP POP PUSH2 0x966 JUMP JUMPDEST PUSH2 0x8F4 PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI PUSH1 0x0 PUSH2 0x919 DUP5 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x923 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x932 DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x899 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x93E DUP6 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP5 POP DUP7 DUP6 PUSH1 0x20 ADD MLOAD LT PUSH2 0x952 JUMPI POP POP PUSH2 0x95C JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x8F9 JUMP JUMPDEST POP POP PUSH2 0x966 PUSH2 0x1AAF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x975 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97F PUSH2 0x1DCC JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x9E8 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9F2 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ PUSH2 0xA19 JUMPI CALLER PUSH2 0xA1C JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 DUP5 ADD SWAP1 DUP1 DUP3 GT PUSH2 0xA71 JUMPI PUSH2 0xA71 PUSH2 0xA6C DUP6 DUP6 DUP5 PUSH2 0x1DFE JUMP JUMPDEST PUSH2 0x1EA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xAD9 SWAP1 DUP7 SWAP1 PUSH2 0x54CE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xB43 PUSH2 0x4599 JUMP JUMPDEST PUSH2 0xB4B PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x1 PUSH2 0x1EAB JUMP JUMPDEST SWAP1 POP PUSH2 0xB63 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0xB6B PUSH2 0x1BA7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xB7B PUSH2 0x4599 JUMP JUMPDEST PUSH2 0xB83 PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x0 PUSH2 0x1EAB JUMP JUMPDEST PUSH2 0xB99 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBA3 PUSH2 0x1DCC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xC37 SWAP1 DUP7 SWAP1 PUSH2 0x54C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH2 0xC48 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0xC50 PUSH2 0x1BA7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xC5C PUSH2 0x456A JUMP JUMPDEST PUSH2 0xC64 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0xD22 JUMPI DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xC8B SWAP1 DUP8 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCC8 DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC9E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCB6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2218 JUMP JUMPDEST SWAP1 POP PUSH2 0xCD2 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xCF6 DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCE1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD02 DUP7 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP6 POP DUP8 DUP7 PUSH1 0x0 ADD MLOAD LT PUSH2 0xD17 JUMPI POP POP POP PUSH2 0x8E5 JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xC6E JUMP JUMPDEST PUSH2 0xD2A PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xD4C SWAP1 DUP8 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD5F DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC9E JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD69 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xD78 DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD84 DUP7 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP6 POP DUP8 DUP7 PUSH1 0x0 ADD MLOAD LT PUSH2 0xD99 JUMPI POP POP POP PUSH2 0x95C JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xD2F JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xDD2 DUP6 DUP6 DUP6 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDE2 JUMPI INVALID JUMPDEST EQ DUP1 PUSH2 0xDF9 JUMPI POP PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDF7 JUMPI INVALID JUMPDEST EQ JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH2 0xE0E PUSH2 0xA6C PUSH1 0x5 DUP8 DUP8 DUP8 PUSH2 0x22D9 JUMP JUMPDEST PUSH2 0xE1A DUP2 DUP7 DUP7 DUP7 PUSH2 0x2381 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0xE67 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0xE6F PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x0 PUSH2 0x25F1 JUMP JUMPDEST PUSH2 0xE85 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xE90 DUP5 DUP5 DUP5 PUSH2 0xC54 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x0 ADD MLOAD LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x0 DUP6 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xEC9 PUSH1 0x1 SLOAD DUP6 PUSH2 0x26FD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B DUP5 DUP3 DUP6 PUSH2 0x2711 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xEFC PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0xF9F JUMPI DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xF3C JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xF29 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xF21 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI PUSH2 0xF80 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF58 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF6C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF8C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xF42 JUMP JUMPDEST PUSH2 0xFA7 PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xFE2 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xFCF PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xFC7 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI PUSH2 0xFFE DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF58 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x100A JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xFE8 JUMP JUMPDEST PUSH2 0x1025 PUSH2 0x184F JUMP JUMPDEST PUSH32 0x3A3E76D7A75E198AEF1F53137E4F2A8A2EC74E2E9526DB8404D08CCC9F1E621D PUSH1 0x3 SLOAD DUP3 PUSH1 0x40 MLOAD PUSH2 0x1058 SWAP3 SWAP2 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x3 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH2 0x106F PUSH2 0x1ADF JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x10AA JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1097 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x108F JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x111A JUMPI PUSH2 0x10FB DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10C6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x10DA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x10EE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2797 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1107 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x10B0 JUMP JUMPDEST POP POP PUSH2 0x1124 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x966 PUSH2 0x1BA7 JUMP JUMPDEST PUSH2 0x1134 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x113C PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x1147 DUP5 DUP5 DUP5 PUSH2 0x2797 JUMP JUMPDEST SWAP1 POP PUSH2 0x1124 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x1159 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x1162 DUP3 PUSH2 0x2839 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH2 0x118E JUMPI DUP1 PUSH1 0x1 JUMPDEST SWAP1 DUP2 PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1186 JUMPI INVALID JUMPDEST SWAP1 MSTORE POP PUSH2 0xB36 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH2 0x119F JUMPI DUP1 PUSH1 0x2 PUSH2 0x1179 JUMP JUMPDEST DUP2 PUSH1 0xA0 ADD MLOAD DUP2 PUSH1 0x40 ADD MLOAD LT PUSH2 0x11B6 JUMPI DUP1 PUSH1 0x5 PUSH2 0x1179 JUMP JUMPDEST DUP2 PUSH2 0x100 ADD MLOAD TIMESTAMP LT PUSH2 0x11CA JUMPI DUP1 PUSH1 0x4 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x11EF JUMPI DUP1 PUSH1 0x6 PUSH2 0x1179 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x123D JUMPI DUP1 PUSH1 0x6 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x125E PUSH1 0x1 SLOAD DUP6 PUSH2 0x286A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B DUP5 DUP3 DUP6 PUSH2 0x2879 JUMP JUMPDEST PUSH2 0x1273 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x127E DUP5 DUP5 DUP5 PUSH2 0x846 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x1 DUP6 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x130F JUMPI PUSH2 0x1307 DUP2 PUSH1 0x0 SHL DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x12BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x12D2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x12E6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x12FA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x12A4 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1342 SWAP1 PUSH2 0x5915 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1353 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x135B PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x1 PUSH2 0x25F1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1373 PUSH2 0x1ADF JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x13AE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x139B PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1393 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x111A JUMPI PUSH2 0x13FF DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x13CA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x13DE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x13F2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2A92 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x140B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x13B4 JUMP JUMPDEST PUSH2 0x1426 PUSH2 0x184F JUMP JUMPDEST PUSH2 0x843 DUP2 PUSH2 0x1896 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x143D PUSH2 0x184F JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E 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 0x1485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1499 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 0x14BD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4F14 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x151B JUMPI PUSH2 0x151B PUSH2 0xA6C DUP4 DUP4 PUSH2 0x2AC5 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x15BC SWAP1 DUP5 SWAP1 DUP7 SWAP1 PUSH2 0x5657 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 DUP2 JUMP JUMPDEST PUSH2 0x1612 PUSH2 0x1ADF JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1642 JUMPI PUSH2 0x163A DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x162D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B4E JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1617 JUMP JUMPDEST POP POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x1654 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x165C PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x1147 DUP5 DUP5 DUP5 PUSH2 0x2A92 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x168B PUSH2 0x184F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16B6 JUMPI PUSH2 0x16B1 PUSH2 0xA6C PUSH2 0x2B67 JUMP JUMPDEST PUSH2 0x843 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1730 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x17CD JUMPI DUP3 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x176A JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1755 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x17C6 JUMPI PUSH2 0x17A7 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1786 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x179A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1953 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x17B3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1770 JUMP JUMPDEST POP POP PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x17D5 PUSH2 0x1A6D JUMP JUMPDEST DUP3 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x180A JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x17F5 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1845 JUMPI PUSH2 0x1826 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1786 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1832 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1810 JUMP JUMPDEST POP POP PUSH2 0x7F5 PUSH2 0x1AAF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7B1 JUMPI PUSH1 0x0 SLOAD PUSH2 0x7B1 SWAP1 PUSH2 0xA6C SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2B9E JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE1A5430EBEC577336427F40F15822F1F36C5E3509FF209D6DB9E6C9E6941CB0B SWAP2 PUSH2 0x18E2 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH2 0x537B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH22 0x1000000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x196C PUSH1 0x1 SLOAD DUP6 PUSH2 0x26FD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1979 DUP5 DUP5 DUP4 PUSH2 0x2BBB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x1988 DUP2 DUP1 PUSH2 0x2C8F JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 DUP8 ADD MLOAD SWAP1 MLOAD PUSH1 0x60 SWAP2 ADDRESS SWAP2 PUSH2 0x19D6 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A11 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 0x1A16 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x1A2D JUMPI PUSH2 0x1A2D PUSH2 0xA6C DUP6 DUP4 PUSH2 0x2CF2 JUMP JUMPDEST PUSH2 0x1A38 DUP4 PUSH1 0x0 PUSH2 0x2C8F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 SWAP1 PUSH32 0xA4A7329F1DD821363067E07D359E347B4AF9B1EFE4B6CCCF13240228AF3C800D SWAP1 PUSH1 0x0 SWAP1 LOG2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH22 0x1000000000000000000000000000000000000000000 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH2 0x7B1 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1B0D JUMPI PUSH2 0x1B0D PUSH2 0xA6C PUSH2 0x2D43 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1B56 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x1B5F DUP3 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH2 0x1B6B DUP3 DUP3 PUSH2 0x2D7A JUMP JUMPDEST PUSH1 0x3 DUP2 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1B7A JUMPI INVALID JUMPDEST EQ PUSH2 0x1B85 JUMPI POP PUSH2 0x843 JUMP JUMPDEST PUSH2 0xC50 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x2E29 JUMP JUMPDEST PUSH2 0x1B9B PUSH2 0x1931 JUMP JUMPDEST PUSH2 0x7B1 JUMPI PUSH2 0x7B1 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BEA JUMPI PUSH2 0x1BEA PUSH2 0xA6C PUSH1 0x2 DUP6 DUP6 PUSH2 0x2ED2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1BF8 PUSH2 0x456A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x9B44D55600000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x1C32 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A63 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x1CBA SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1CF5 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 0x1CFA JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x1D27 JUMPI DUP1 MLOAD PUSH1 0xA0 EQ PUSH2 0x1D10 JUMPI INVALID JUMPDEST DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1D24 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4F30 JUMP JUMPDEST SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1D39 PUSH2 0x456A JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD PUSH2 0x1D4C SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1D67 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1D85 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1DA3 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1DC1 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 DUP2 ISZERO PUSH2 0x1DF5 JUMPI DUP2 PUSH2 0x1DF7 JUMP JUMPDEST CALLER JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x4AD31275 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53A2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x1EB3 PUSH2 0x4599 JUMP JUMPDEST DUP6 MLOAD PUSH2 0x1EC6 JUMPI PUSH2 0x1EC6 PUSH2 0xA6C PUSH1 0x0 PUSH2 0x2F0D JUMP JUMPDEST DUP5 MLOAD PUSH2 0x1ED9 JUMPI PUSH2 0x1ED9 PUSH2 0xA6C PUSH1 0x1 PUSH2 0x2F0D JUMP JUMPDEST DUP4 MLOAD DUP7 MLOAD EQ PUSH2 0x1EEF JUMPI PUSH2 0x1EEF PUSH2 0xA6C PUSH1 0x2 PUSH2 0x2F0D JUMP JUMPDEST DUP3 MLOAD DUP6 MLOAD EQ PUSH2 0x1F05 JUMPI PUSH2 0x1F05 PUSH2 0xA6C PUSH1 0x3 PUSH2 0x2F0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F40 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1F2D PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1F25 JUMPI SWAP1 POP JUMPDEST POP DUP2 MSTORE DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE SWAP1 DUP1 ISZERO PUSH2 0x1F7E JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1F6B PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1F63 JUMPI SWAP1 POP JUMPDEST POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP1 PUSH2 0x1F8F PUSH2 0x4617 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1F9C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1FAE PUSH2 0x4617 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1FBB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1FD0 DUP4 PUSH2 0x2839 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x0 PUSH2 0x1FDE DUP4 PUSH2 0x2839 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1FE9 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x1FF1 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x202C DUP8 DUP8 DUP16 DUP13 DUP2 MLOAD DUP2 LT PUSH2 0x200A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP16 DUP13 DUP2 MLOAD DUP2 LT PUSH2 0x201E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP16 PUSH2 0x25F1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP2 POP PUSH2 0x2046 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST SWAP5 POP PUSH2 0x2063 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD DUP6 PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP PUSH2 0x2073 DUP4 DUP3 PUSH1 0x0 ADD MLOAD PUSH2 0x1D31 JUMP JUMPDEST SWAP3 POP PUSH2 0x2083 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1D31 JUMP JUMPDEST SWAP2 POP PUSH2 0x20A0 DUP2 PUSH1 0x40 ADD MLOAD DUP12 PUSH1 0x40 ADD MLOAD PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP12 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP12 ADD MLOAD PUSH2 0x20BE SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x60 DUP12 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD DUP6 LT PUSH2 0x2169 JUMPI DUP10 MLOAD DUP1 MLOAD PUSH1 0x1 DUP12 ADD SWAP11 DUP6 SWAP3 SWAP2 DUP2 LT PUSH2 0x20E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP3 POP DUP15 MLOAD DUP10 EQ ISZERO PUSH2 0x2146 JUMPI DUP2 DUP11 PUSH1 0x20 ADD MLOAD DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x2135 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0x2207 JUMP JUMPDEST DUP15 DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x2152 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP7 POP PUSH2 0x2165 DUP8 PUSH2 0x2839 JUMP JUMPDEST SWAP6 POP POP JUMPDEST DUP6 PUSH1 0xA0 ADD MLOAD DUP5 LT PUSH2 0x2201 JUMPI DUP2 DUP11 PUSH1 0x20 ADD MLOAD DUP10 DUP1 PUSH1 0x1 ADD SWAP11 POP DUP2 MLOAD DUP2 LT PUSH2 0x218B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP2 POP DUP14 MLOAD DUP9 EQ ISZERO PUSH2 0x21DE JUMPI DUP3 DUP11 PUSH1 0x0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH2 0x2135 JUMPI INVALID JUMPDEST DUP14 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x21EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP6 POP PUSH2 0x21FD DUP7 PUSH2 0x2839 JUMP JUMPDEST SWAP5 POP POP JUMPDEST POP PUSH2 0x1FF1 JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB6B DUP4 PUSH2 0x224E PUSH2 0x2232 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH2 0x2242 DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2FDD AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2267 DUP5 DUP5 DUP5 PUSH2 0x3007 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x2294 JUMPI PUSH2 0x2294 PUSH2 0xA6C PUSH1 0x6 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x8 DUP2 DUP2 DUP2 GT ISZERO PUSH2 0x22A1 JUMPI INVALID JUMPDEST PUSH1 0xFF AND LT PUSH2 0x22B9 JUMPI PUSH2 0x22B9 PUSH2 0xA6C PUSH1 0x3 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x22C7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x4 DUP7 DUP7 DUP7 JUMPDEST PUSH1 0x60 PUSH4 0x7E5A2318 PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58BA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2391 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x23B8 JUMPI DUP2 MLOAD PUSH1 0x1 EQ PUSH2 0x23B0 JUMPI PUSH2 0x23B0 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x2 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x23C6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x24BF JUMPI DUP2 MLOAD PUSH1 0x42 EQ PUSH2 0x23E5 JUMPI PUSH2 0x23E5 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x23F4 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2411 DUP5 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2426 DUP6 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP9 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x244D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x560C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x246F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND SWAP2 AND EQ SWAP6 POP PUSH2 0xB6B SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x24CD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x257A JUMPI DUP2 MLOAD PUSH1 0x42 EQ PUSH2 0x24EC JUMPI PUSH2 0x24EC PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x24FB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2518 DUP5 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x252D DUP6 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2544 SWAP2 SWAP1 PUSH2 0x5329 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 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x244D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x560C JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2588 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x25A0 JUMPI PUSH2 0x2599 DUP5 DUP5 DUP5 PUSH2 0x3070 JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x6 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x25AE JUMPI INVALID JUMPDEST EQ PUSH2 0x25B5 JUMPI INVALID JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x25F9 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP8 ADD MLOAD PUSH2 0x140 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP8 ADD MLOAD SWAP1 DUP7 ADD MSTORE PUSH2 0x2619 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x2622 DUP8 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH2 0x262C PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x2635 DUP8 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2641 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH2 0x264F DUP10 DUP5 DUP4 DUP11 PUSH2 0x3266 JUMP JUMPDEST PUSH2 0x265B DUP9 DUP4 DUP4 DUP10 PUSH2 0x3266 JUMP JUMPDEST PUSH2 0x266F DUP10 DUP10 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x337E JUMP JUMPDEST PUSH2 0x2688 DUP10 DUP10 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x3 SLOAD GASPRICE DUP12 PUSH2 0x33C3 JUMP JUMPDEST SWAP4 POP PUSH2 0x26A3 DUP10 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x26BC DUP9 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x26D2 DUP4 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD DUP12 DUP12 DUP6 DUP10 PUSH2 0x35F6 JUMP JUMPDEST POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x18E4B141 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x589E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x966 DUP3 PUSH2 0x270C DUP6 PUSH2 0x379D JUMP JUMPDEST PUSH2 0x3825 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x2725 DUP6 DUP4 DUP7 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2735 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2757 JUMPI PUSH2 0x2750 PUSH2 0x2748 DUP8 DUP8 PUSH2 0x385F JUMP JUMPDEST DUP7 DUP5 DUP8 PUSH2 0x3897 JUMP JUMPDEST SWAP3 POP PUSH2 0x278E JUMP JUMPDEST PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2765 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x277F JUMPI PUSH2 0x2750 PUSH2 0x2778 DUP8 DUP8 PUSH2 0x385F JUMP JUMPDEST DUP4 DUP7 PUSH2 0x394B JUMP JUMPDEST PUSH2 0x278B DUP2 DUP7 DUP5 DUP8 PUSH2 0x2381 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x279F PUSH2 0x456A JUMP JUMPDEST PUSH2 0x27A7 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x27B0 DUP6 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27BC PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH2 0x27CA DUP7 DUP4 DUP4 DUP8 PUSH2 0x3266 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27E7 DUP4 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0xA0 ADD MLOAD PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27F5 DUP8 DUP4 PUSH2 0x395A JUMP JUMPDEST SWAP1 POP PUSH2 0x2805 DUP9 DUP3 PUSH1 0x3 SLOAD GASPRICE PUSH2 0x3970 JUMP JUMPDEST SWAP5 POP PUSH1 0x0 DUP5 PUSH1 0x20 ADD MLOAD SWAP1 POP PUSH2 0x2821 DUP10 DUP6 DUP4 DUP9 PUSH1 0x40 ADD MLOAD DUP11 PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x282D DUP2 DUP11 DUP7 DUP10 PUSH2 0x39E7 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2851 PUSH1 0x1 SLOAD DUP5 PUSH2 0x286A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x966 DUP3 PUSH2 0x270C DUP6 PUSH2 0x3A7E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x288A DUP6 DUP4 DUP7 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x289A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x28AD JUMPI PUSH2 0x2750 PUSH2 0x2748 DUP8 DUP8 PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x28BB JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x277F JUMPI PUSH2 0x2750 PUSH2 0x2778 DUP8 DUP8 PUSH2 0x3B55 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2A8B JUMPI PUSH1 0x20 DUP5 MLOAD DUP2 PUSH2 0x28DF JUMPI INVALID JUMPDEST MOD PUSH1 0x4 EQ PUSH2 0x28F6 JUMPI PUSH2 0x28F6 PUSH2 0xA6C PUSH1 0x0 DUP8 DUP8 PUSH2 0x3B8D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2908 DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x2967 JUMPI PUSH2 0x2967 PUSH2 0xA6C PUSH1 0x1 DUP10 DUP10 PUSH2 0x3B8D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x29A3 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x24 ADD PUSH2 0x56B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x2A2B SWAP2 SWAP1 PUSH2 0x530D 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 0x2A68 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 0x2A6D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2A85 JUMPI PUSH2 0x2A85 PUSH2 0xA6C DUP12 DUP12 DUP5 PUSH2 0x3BF8 JUMP JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2A9A PUSH2 0x456A JUMP JUMPDEST PUSH2 0x2AA5 DUP5 DUP5 DUP5 PUSH2 0x2797 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x2 DUP6 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x11C7B720 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5657 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x537B JUMP JUMPDEST DUP3 PUSH1 0x20 ADD MLOAD TIMESTAMP LT PUSH2 0x2BD4 JUMPI PUSH2 0x2BD4 PUSH2 0xA6C PUSH1 0x1 DUP4 PUSH2 0x3C17 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD GASPRICE DUP2 EQ PUSH2 0x2BEE JUMPI PUSH2 0x2BEE PUSH2 0xA6C DUP4 GASPRICE DUP5 PUSH2 0x3C34 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x2C1A JUMPI PUSH2 0x2C1A PUSH2 0xA6C DUP5 DUP4 PUSH2 0x3C53 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2C3F JUMPI PUSH2 0x2C3F PUSH2 0xA6C PUSH1 0x0 DUP6 PUSH2 0x3C17 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x2C72 JUMPI POP PUSH2 0x2C70 DUP7 DUP6 DUP8 PUSH2 0x2711 JUMP JUMPDEST ISZERO JUMPDEST ISZERO PUSH2 0x2C87 JUMPI PUSH2 0x2C87 PUSH2 0xA6C PUSH1 0x1 DUP7 DUP5 DUP10 PUSH2 0x22D9 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ PUSH2 0xC50 JUMPI PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x20D11F61 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5550 JUMP JUMPDEST SELFBALANCE DUP1 ISZERO PUSH2 0x843 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC50 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xC3B823F00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2DCE JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2DCE JUMPI PUSH2 0x2DCE PUSH2 0xA6C PUSH1 0x2 DUP4 PUSH1 0x20 ADD MLOAD CALLER PUSH2 0x3C70 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DD8 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2E24 JUMPI PUSH2 0x2E24 PUSH2 0xA6C PUSH1 0x0 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH2 0x3C70 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0x2C310A9A43963FF31A754A4099CC435ED498049687539D72D7818D9B093415C SWAP3 PUSH2 0x2EC6 SWAP3 SWAP1 SWAP2 SWAP1 CALLER SWAP1 PUSH2 0x571A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x0 DUP7 DUP7 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xD4092F4F PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2F28 SWAP2 SWAP1 PUSH2 0x5832 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2FBB JUMPI POP PUSH1 0x0 PUSH2 0x7F5 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x2FC8 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x1 DUP7 DUP7 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x2FF3 JUMPI PUSH2 0x2FF3 PUSH2 0xA6C PUSH1 0x3 DUP6 DUP6 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x2FFE JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x3023 JUMPI PUSH2 0x3023 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x3033 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB6B JUMPI INVALID JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3067 JUMPI PUSH2 0x3067 PUSH2 0xA6C PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x30A7 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 ADD PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x30DF SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x5550 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x316E DUP5 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x3197 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x31D2 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 0x31D7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x31EA JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x324C JUMPI PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 PUSH2 0x3221 DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ SWAP5 POP POP POP POP POP PUSH2 0x966 JUMP JUMPDEST PUSH2 0x325B PUSH2 0xA6C DUP10 DUP10 DUP10 DUP6 PUSH2 0x3CB2 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP4 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x3275 JUMPI INVALID JUMPDEST EQ PUSH2 0x328F JUMPI PUSH2 0x328F PUSH2 0xA6C DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3CD3 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x32E3 JUMPI PUSH1 0x60 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x32E3 JUMPI PUSH2 0x32E3 PUSH2 0xA6C PUSH1 0x2 DUP6 PUSH1 0x20 ADD MLOAD CALLER PUSH2 0x3C70 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x334D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x334D JUMPI PUSH2 0x334D PUSH2 0xA6C PUSH1 0x1 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH2 0x3C70 JUMP JUMPDEST PUSH2 0x335C DUP5 DUP5 PUSH1 0x20 ADD MLOAD DUP4 PUSH2 0x2879 JUMP JUMPDEST PUSH2 0x3378 JUMPI PUSH2 0x3378 PUSH2 0xA6C PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP6 PUSH2 0x22D9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 DUP1 DUP5 ADD MLOAD SWAP1 DUP6 ADD MLOAD PUSH2 0x3397 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x80 DUP1 DUP6 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH2 0x33B0 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST LT ISZERO PUSH2 0x3378 JUMPI PUSH2 0x3378 PUSH2 0xA6C DUP4 DUP4 PUSH2 0x3CF0 JUMP JUMPDEST PUSH2 0x33CB PUSH2 0x45C1 JUMP JUMPDEST PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x33E3 SWAP1 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x33FA DUP11 PUSH1 0x80 ADD MLOAD DUP12 PUSH1 0xA0 ADD MLOAD DUP5 PUSH2 0x3D0D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3415 DUP9 DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x342C DUP12 PUSH1 0x80 ADD MLOAD DUP13 PUSH1 0xA0 ADD MLOAD DUP5 PUSH2 0x3D0D JUMP JUMPDEST SWAP1 POP DUP6 ISZERO PUSH2 0x3449 JUMPI PUSH2 0x3442 DUP13 DUP13 DUP6 DUP8 DUP6 DUP8 PUSH2 0x3D41 JUMP JUMPDEST SWAP5 POP PUSH2 0x345A JUMP JUMPDEST PUSH2 0x3457 DUP13 DUP13 DUP6 DUP8 DUP6 DUP8 PUSH2 0x3E13 JUMP JUMPDEST SWAP5 POP JUMPDEST DUP5 MLOAD MLOAD PUSH1 0x80 DUP14 ADD MLOAD PUSH1 0xC0 DUP15 ADD MLOAD PUSH2 0x3472 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 ADD MSTORE DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0xA0 DUP14 ADD MLOAD PUSH1 0xE0 DUP15 ADD MLOAD PUSH2 0x3493 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x60 ADD MSTORE PUSH1 0x20 DUP6 ADD MLOAD MLOAD PUSH1 0x80 DUP13 ADD MLOAD PUSH1 0xC0 DUP14 ADD MLOAD PUSH2 0x34B4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x34DC DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD DUP13 PUSH1 0xA0 ADD MLOAD DUP14 PUSH1 0xE0 ADD MLOAD PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x60 ADD MSTORE PUSH1 0x0 PUSH2 0x34F7 DUP9 DUP11 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST DUP7 MLOAD PUSH1 0x80 SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x20 DUP9 ADD MLOAD ADD MSTORE POP POP POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x352E SWAP1 DUP4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x9 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x6869791F0A34781B29882982CC39E882768CF2C96995C2A110C577C53BC932D5 DUP9 PUSH2 0x140 ADD MLOAD DUP10 PUSH2 0x160 ADD MLOAD DUP11 PUSH2 0x180 ADD MLOAD DUP12 PUSH2 0x1A0 ADD MLOAD DUP12 CALLER DUP11 PUSH1 0x0 ADD MLOAD DUP12 PUSH1 0x20 ADD MLOAD DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x60 ADD MLOAD DUP15 PUSH1 0x80 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x35E7 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5766 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST DUP4 MLOAD DUP4 MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH2 0x140 DUP8 ADD MLOAD DUP6 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x361F SWAP2 DUP12 SWAP2 DUP7 SWAP1 DUP9 SWAP1 PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3639 DUP11 DUP10 PUSH2 0x140 ADD MLOAD DUP7 DUP7 DUP10 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3653 DUP10 DUP9 PUSH2 0x180 ADD MLOAD DUP6 DUP5 DUP10 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x366D DUP11 DUP10 PUSH2 0x180 ADD MLOAD DUP7 DUP6 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3683 DUP11 DUP10 PUSH2 0x140 ADD MLOAD DUP7 DUP10 DUP10 PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3699 DUP10 DUP9 PUSH2 0x140 ADD MLOAD DUP6 DUP10 DUP10 PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36B1 DUP12 DUP12 DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x80 ADD MLOAD DUP9 DUP9 DUP13 PUSH2 0x3EAC JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x36CE JUMPI DUP6 MLOAD PUSH1 0x0 PUSH1 0x80 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x20 DUP9 ADD MLOAD SWAP1 SWAP2 ADD MSTORE JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 ISZERO PUSH2 0x371E JUMPI POP PUSH2 0x1A0 DUP1 DUP10 ADD MLOAD SWAP1 DUP11 ADD MLOAD PUSH2 0x371E SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x3F08 AND JUMP JUMPDEST ISZERO PUSH2 0x375C JUMPI PUSH2 0x3757 DUP12 DUP11 PUSH2 0x1A0 ADD MLOAD DUP10 DUP7 PUSH2 0x3752 DUP12 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP13 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x3776 DUP11 DUP10 PUSH2 0x1A0 ADD MLOAD DUP10 DUP6 DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3790 DUP12 DUP11 PUSH2 0x1A0 ADD MLOAD DUP10 DUP7 DUP11 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xDE047DB400000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x2AE2 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A8E JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x15 DUP2 LT ISZERO PUSH2 0x38B5 JUMPI PUSH2 0x38B5 PUSH2 0xA6C PUSH1 0x2 DUP8 DUP8 DUP8 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38E9 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB DUP5 ADD PUSH4 0xFFFFFFFF PUSH2 0x3F2D AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x3933 JUMPI PUSH2 0x3933 PUSH2 0xA6C DUP7 DUP4 PUSH2 0x3F6D JUMP JUMPDEST PUSH2 0x3940 DUP2 DUP9 DUP7 PUSH1 0x15 PUSH2 0x3F8A JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB6B DUP4 DUP6 DUP5 PUSH1 0x1 PUSH2 0x3F8A JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x3969 JUMPI DUP2 PUSH2 0x966 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3978 PUSH2 0x456A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH2 0x3994 SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xC0 DUP7 ADD MLOAD PUSH2 0x39AB SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xE0 DUP7 ADD MLOAD PUSH2 0x39C5 SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x39DA DUP3 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x3A01 DUP5 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A1B DUP5 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A35 DUP5 DUP5 PUSH2 0x1A0 ADD MLOAD DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A53 DUP5 DUP5 PUSH2 0x180 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A69 DUP6 DUP4 PUSH1 0x80 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH2 0x4161 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2A8B JUMPI PUSH1 0x0 PUSH1 0x80 DUP4 ADD MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH2 0x140 DUP2 ADD MLOAD PUSH2 0x160 DUP3 ADD MLOAD PUSH2 0x180 DUP4 ADD MLOAD PUSH2 0x1A0 DUP5 ADD MLOAD PUSH1 0x0 SWAP4 PUSH32 0xF80322EB8376AAFB64EADF8F0D7623F22130FD9491A221E902B713CB984A7534 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x20 DUP8 LT ISZERO PUSH2 0x3ACA JUMPI INVALID JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP8 ADD DUP1 MLOAD PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x160 DUP12 ADD DUP1 MLOAD PUSH2 0x180 DUP14 ADD DUP1 MLOAD PUSH2 0x1A0 DUP16 ADD DUP1 MLOAD SWAP14 DUP10 MSTORE DUP13 MLOAD PUSH1 0x20 SWAP14 DUP15 ADD KECCAK256 DUP8 MSTORE DUP12 MLOAD SWAP12 DUP14 ADD SWAP12 SWAP1 SWAP12 KECCAK256 DUP5 MSTORE DUP10 MLOAD SWAP10 DUP13 ADD SWAP10 SWAP1 SWAP10 KECCAK256 DUP2 MSTORE DUP8 MLOAD SWAP8 SWAP1 SWAP11 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP9 MSTORE PUSH2 0x1E0 DUP6 KECCAK256 SWAP4 SWAP1 SWAP5 MSTORE SWAP1 MSTORE SWAP2 SWAP1 MSTORE SWAP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x3EFE50C800000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x2AE2 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A41 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x488219A6 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x580A JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3BCD JUMPI PUSH2 0x3BCD PUSH2 0xA6C PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x4678472B PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5569 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xF5985184 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x58FE JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA26DAC09 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55F6 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDEC4AEDF PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x54D7 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE53C76C8 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5866 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58AC JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1B8388F7 PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54FB JUMP JUMPDEST PUSH1 0x60 PUSH4 0xFDB6CA8D PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5594 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB6555D6F PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D1A DUP5 DUP5 DUP5 PUSH2 0x41A6 JUMP JUMPDEST ISZERO PUSH2 0x3D2D JUMPI PUSH2 0x3D2D PUSH2 0xA6C DUP6 DUP6 DUP6 PUSH2 0x420C JUMP JUMPDEST PUSH2 0xB6B DUP4 PUSH2 0x224E DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH2 0x3D49 PUSH2 0x45C1 JUMP JUMPDEST DUP2 DUP6 GT DUP5 DUP5 GT DUP5 DUP7 GT ISZERO PUSH2 0x3D69 JUMPI PUSH2 0x3D62 DUP10 DUP7 DUP7 PUSH2 0x422B JUMP JUMPDEST SWAP3 POP PUSH2 0x3DB8 JUMP JUMPDEST DUP7 DUP5 GT ISZERO PUSH2 0x3DA9 JUMPI DUP3 MLOAD DUP8 SWAP1 MSTORE DUP3 MLOAD PUSH1 0x20 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP9 ADD MLOAD PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x3D93 SWAP2 SWAP1 DUP10 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD DUP1 MLOAD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 MLOAD ADD DUP8 SWAP1 MSTORE PUSH2 0x3DB8 JUMP JUMPDEST PUSH2 0x3DB5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x4268 JUMP JUMPDEST SWAP3 POP JUMPDEST DUP2 ISZERO PUSH2 0x3DDE JUMPI PUSH1 0x20 DUP1 DUP5 ADD MLOAD ADD MLOAD DUP4 MLOAD MLOAD PUSH2 0x3DD8 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MSTORE JUMPDEST DUP1 ISZERO PUSH2 0x3E06 JUMPI DUP3 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP1 DUP5 ADD MLOAD MLOAD PUSH2 0x3E00 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE JUMPDEST POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3E1B PUSH2 0x45C1 JUMP JUMPDEST DUP3 DUP5 GT ISZERO PUSH2 0x3E35 JUMPI PUSH2 0x3E2E DUP8 DUP5 DUP5 PUSH2 0x422B JUMP JUMPDEST SWAP1 POP PUSH2 0x3E83 JUMP JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x3E74 JUMPI DUP1 MLOAD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD DUP6 SWAP1 MSTORE DUP2 ADD MLOAD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x3E67 SWAP2 SWAP1 DUP7 PUSH2 0x4293 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD MLOAD ADD MSTORE PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x3E80 DUP6 DUP6 DUP6 DUP6 PUSH2 0x4268 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD ADD MLOAD DUP2 MLOAD MLOAD PUSH2 0x3E9D SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x3EFE JUMPI SELFBALANCE PUSH1 0x0 PUSH2 0x3EDF DUP11 DUP5 DUP5 DUP12 DUP12 DUP11 PUSH2 0x42CB JUMP JUMPDEST SWAP1 POP PUSH2 0x3EF1 DUP10 DUP5 DUP4 DUP6 SUB DUP12 DUP11 DUP11 PUSH2 0x42CB JUMP JUMPDEST POP PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x966 JUMPI POP POP DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3F4E JUMPI PUSH2 0x3F4E PUSH2 0xA6C PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA15C0D06 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x537B JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x3FA1 DUP5 DUP5 DUP4 SUB PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x3FD9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x56F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x4068 DUP6 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x4091 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40CC 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 0x40D1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x40E4 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x4146 JUMPI PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 PUSH2 0x411B DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ SWAP5 POP POP POP POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH2 0x4155 PUSH2 0xA6C DUP11 DUP11 DUP11 DUP6 PUSH2 0x4403 JUMP JUMPDEST POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x419C JUMPI PUSH2 0x4191 DUP7 DUP3 SELFBALANCE DUP9 DUP9 DUP9 PUSH2 0x42CB JUMP JUMPDEST POP PUSH1 0x1 SWAP2 POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x41B8 JUMPI PUSH2 0x41B8 PUSH2 0xA6C PUSH2 0x4424 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x41C3 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x41D0 JUMPI POP PUSH1 0x0 PUSH2 0x966 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x41DA JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x41EF DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH2 0x4201 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55F6 JUMP JUMPDEST PUSH2 0x4233 PUSH2 0x45C1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD DUP6 SWAP1 MSTORE MLOAD DUP2 ADD DUP4 SWAP1 MSTORE DUP2 MLOAD ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 DUP6 ADD MLOAD PUSH2 0x425E SWAP2 SWAP1 DUP6 PUSH2 0x3D0D JUMP JUMPDEST DUP2 MLOAD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4270 PUSH2 0x45C1 JUMP JUMPDEST DUP1 MLOAD SWAP5 SWAP1 SWAP5 MSTORE DUP4 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 DUP5 ADD DUP1 MLOAD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 MLOAD SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x42A0 DUP5 DUP5 DUP5 PUSH2 0x445B JUMP JUMPDEST ISZERO PUSH2 0x42B3 JUMPI PUSH2 0x42B3 PUSH2 0xA6C DUP6 DUP6 DUP6 PUSH2 0x420C JUMP JUMPDEST PUSH2 0xB6B DUP4 PUSH2 0x224E PUSH2 0x2232 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP6 LT PUSH2 0x42D7 JUMPI POP DUP3 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA3B4A32700000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x4311 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x24 ADD PUSH2 0x53A2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x439A SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x43D7 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 0x43DC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x43F6 JUMPI PUSH2 0x43F6 PUSH2 0xA6C DUP12 DUP10 DUP10 DUP10 DUP7 PUSH2 0x44BF JUMP JUMPDEST POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5BD0428D PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xA791837C00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x446D JUMPI PUSH2 0x446D PUSH2 0xA6C PUSH2 0x4424 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x4478 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x4485 JUMPI POP PUSH1 0x0 PUSH2 0x966 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x448F JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP DUP4 PUSH2 0x44A5 DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST DUP2 PUSH2 0x44AC JUMPI INVALID JUMPDEST MOD SWAP1 POP PUSH2 0x41EF DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x60 PUSH4 0x87CB1E75 PUSH1 0xE0 SHL DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x44E2 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55B1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x45D4 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x45E1 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x7F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4712 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4725 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST PUSH2 0x5AF8 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4746 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x476D JUMPI PUSH2 0x475B DUP9 DUP4 PUSH2 0x46DE JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4749 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4788 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4796 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47D3 JUMPI PUSH2 0x47BE DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x47A6 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x47ED JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x47FB PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47D3 JUMPI PUSH2 0x4823 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x491D JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x480B JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4848 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4856 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4877 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x476D JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x487A JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x48A6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x48BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48ED PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x5AF8 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x4904 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4930 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4939 DUP2 PUSH2 0x5AF8 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4946 DUP4 DUP4 PUSH2 0x46DE JUMP JUMPDEST DUP2 MSTORE PUSH2 0x4955 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x4967 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x4979 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x49DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x49E7 DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A0F DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A37 DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4A60 DUP6 DUP3 DUP7 ADD PUSH2 0x4896 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4A7D JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4A87 PUSH1 0xA0 PUSH2 0x5AF8 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH2 0x4AAF DUP2 PUSH2 0x5B89 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4ACE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4ADA DUP5 DUP3 DUP6 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4AF7 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x966 DUP4 DUP4 PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B13 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4B1D DUP5 DUP5 PUSH2 0x46DE JUMP JUMPDEST SWAP2 POP PUSH2 0x4B2C DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x46DE JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B47 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4B51 DUP5 DUP5 PUSH2 0x46DE JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x4B65 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4B85 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4B9C JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BA8 DUP9 DUP4 DUP10 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BBD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BC9 DUP9 DUP4 DUP10 ADD PUSH2 0x4702 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BDE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BEA DUP9 DUP4 DUP10 ADD PUSH2 0x4702 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BFF JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4838 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4C29 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4C3F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB6B DUP5 DUP3 DUP6 ADD PUSH2 0x47DD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4C60 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4C77 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4C83 DUP9 DUP4 DUP10 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4C98 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4CA4 DUP9 DUP4 DUP10 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4CB9 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4CC5 DUP9 DUP4 DUP10 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4CDA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4778 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4CFB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D12 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4D1E DUP8 DUP4 DUP9 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D33 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4D3F DUP8 DUP4 DUP9 ADD PUSH2 0x4838 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D54 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4D7F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D96 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4DA2 DUP8 DUP4 DUP9 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D54 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4DD0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4DE7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x4DF8 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x4E08 PUSH2 0x4720 DUP5 PUSH2 0x5B1F JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x4E40 JUMPI PUSH2 0x4E2E DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x4A6C JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4E17 JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x4E58 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E65 DUP6 DUP3 DUP7 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4E80 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E99 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4B65 DUP2 PUSH2 0x5B89 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4EBF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4ED1 DUP2 PUSH2 0x5B89 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4EEC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F09 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x966 DUP2 PUSH2 0x5BAB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F25 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x966 DUP2 PUSH2 0x5BAB JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4F4B PUSH1 0xA0 PUSH2 0x5AF8 JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F92 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FA8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB6B DUP5 DUP3 DUP6 ADD PUSH2 0x491D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4FC6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4FDD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4FE9 DUP7 DUP4 DUP8 ADD PUSH2 0x491D JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4FFE JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E65 DUP6 DUP3 DUP7 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5020 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5037 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5043 DUP9 DUP4 DUP10 ADD PUSH2 0x491D JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x5058 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5064 DUP9 DUP4 DUP10 ADD PUSH2 0x491D JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x5079 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5085 DUP9 DUP4 DUP10 ADD PUSH2 0x4896 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x509A JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50BB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x50D2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x50DE DUP8 DUP4 DUP9 ADD PUSH2 0x491D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x50FA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5119 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5130 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4FE9 DUP7 DUP4 DUP8 ADD PUSH2 0x4A6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5192 JUMPI PUSH2 0x517C DUP7 DUP4 MLOAD PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0xA0 SWAP6 SWAP1 SWAP6 ADD SWAP5 PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5169 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x51B4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5B3F JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 PUSH2 0x5226 DUP5 DUP5 MLOAD PUSH2 0x513C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x5238 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x524B PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x525E PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0x52B7 DUP4 DUP8 ADD DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x52D4 DUP3 DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x52F0 DUP4 DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x3E09 DUP3 DUP3 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x531F DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5B3F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP3 MSTORE PUSH1 0x80 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5402 PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x5414 DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x5426 DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x54A3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x5491 DUP6 DUP4 MLOAD PUSH2 0x519C JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5457 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x966 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5156 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x5530 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3940 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xB6B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5582 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x3E09 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 DUP2 ADD PUSH2 0x55A4 DUP4 PUSH2 0x5B7F JUMP JUMPDEST DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE POP PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x3940 PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x966 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x56C5 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x519C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x5708 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xE1A DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x572D PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x573F DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP1 DUP4 MSTORE PUSH2 0x577A DUP2 DUP5 ADD DUP16 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x578C DUP2 DUP16 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x57A1 DUP2 DUP14 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x57B3 DUP2 DUP14 PUSH2 0x519C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP12 DUP13 AND PUSH1 0x80 DUP7 ADD MSTORE SWAP10 SWAP1 SWAP11 AND PUSH1 0xA0 DUP5 ADD MSTORE POP POP PUSH1 0xC0 DUP2 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xE0 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH2 0x100 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x120 DUP4 ADD MSTORE PUSH2 0x140 SWAP1 SWAP2 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5815 DUP6 PUSH2 0x5B6B JUMP JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xE1A PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x583F DUP4 PUSH2 0x5B75 JUMP JUMPDEST SWAP2 SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5852 DUP6 PUSH2 0x5B75 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x3 DUP6 LT PUSH2 0x5874 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x3 DUP6 LT PUSH2 0x5852 JUMPI INVALID JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x5852 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH2 0x58C5 DUP7 PUSH2 0x5B7F JUMP JUMPDEST DUP6 DUP3 MSTORE DUP5 PUSH1 0x20 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x3E09 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x590B DUP5 PUSH2 0x5B6B JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x5452414E53464552535F5355434345535346554C000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x5968 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x5156 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x59A3 DUP2 DUP4 PUSH2 0x5156 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x80 DUP7 ADD MSTORE DUP1 SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x7F5 DUP3 DUP5 PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 ADD SWAP1 POP PUSH2 0x59E5 DUP3 DUP5 MLOAD PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x59F7 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x51E6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x140 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD MLOAD PUSH2 0x160 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x60 DUP3 ADD SWAP1 PUSH2 0x5A23 DUP2 PUSH2 0x5B7F JUMP JUMPDEST DUP1 DUP4 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x5A54 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x5216 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x5A76 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x5216 JUMP JUMPDEST DUP5 PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x3E09 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE DUP4 MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 DUP6 ADD MLOAD AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x5AE8 PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5B17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5B35 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5B5A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5B42 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x3378 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH1 0x7 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x843 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x843 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 EQ 0xD0 0xC4 0xC0 MLOAD 0xBC PUSH12 0xD0373E742AEADD0F096942BA SIGNEXTEND 0xB0 0xC3 0x2D PUSH32 0xA567C4419076DFD96C6578706572696D656E74616CF564736F6C634300051100 BLOCKHASH ",
"sourceMap": "1057:384:0:-;;;767:5:57;744:28;;-1:-1:-1;;;;744:28:57;;;1335:104:0;5:2:-1;;;;30:1;27;20:12;5:2;1335:104:0;;;;;;;;;;;;;;;;;;;;;1429:1;898:18:56;;-1:-1:-1;;;;;;898:18:56;906:10;898:18;;;1412:7:0;;1429:1;1569:4:37;1477:132;;1649:182;1689:28;;;;;;;;;;;;;-1:-1:-1;;;1689:28:37;;;1731:31;;;;;;;;;;;;;-1:-1:-1;;;1731:31:37;;;1776:7;1797:24;1649:26;;;;;:182;;:::i;:::-;1619:27;:212;-1:-1:-1;1057:384:0;;-1:-1:-1;;;1057:384:0;1285:1263:50;1997:11;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o;146:263:-1:-;;261:2;249:9;240:7;236:23;232:32;229:2;;;-1:-1;;267:12;229:2;-1:-1;83:13;;223:186;-1:-1;223:186;;1057:384:0;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106102dc5760003560e01c80638d45cd2311610184578063beee2e14116100d6578063dd885e2d1161008a578063eea086ba11610064578063eea086ba14610735578063f2fde38b1461074a578063fc74896d1461076a576102dc565b8063dd885e2d146106ed578063dedfc1f11461070f578063e14b58c414610722576102dc565b8063c26cfecd116100bb578063c26cfecd14610698578063c585bb93146106ad578063d9bfa73e146106cd576102dc565b8063beee2e1414610665578063c0fa16cc14610678576102dc565b80639b44d55611610138578063a6c3bf3311610112578063a6c3bf331461061f578063b04fbddd14610632578063b718e29214610652576102dc565b80639b44d556146105bf5780639d3fa4b9146105d2578063a12dcc6f146105ff576102dc565b80638ea8dfe4116101695780638ea8dfe41461056c5780639331c7421461058c5780639694a402146105ac576102dc565b80638d45cd23146105375780638da5cb5b14610557576102dc565b8063607041081161023d5780637b8e3514116101f1578063850a1501116101cb578063850a1501146104ef57806388ec79fb146105045780638bc8efb314610524576102dc565b80637b8e35141461048f5780638171c407146104af57806382c174d0146104cf576102dc565b80636fcf3e9e116102225780636fcf3e9e1461045657806377fcce681461046957806378d29ac11461047c576102dc565b806360704108146104095780636a1a80fd14610436576102dc565b80632ac1262211610294578063369da09911610279578063369da099146103c357806346c02d7a146103e35780634f9559b1146103f6576102dc565b80632ac12622146103905780632da62987146103b0576102dc565b80631ce4c78b116102c55780631ce4c78b1461032e5780632280c91014610350578063288cdc9114610370576102dc565b80630228e168146102e15780630efca18514610317575b600080fd5b3480156102ed57600080fd5b506103016102fc366004614e6f565b61078a565b60405161030e91906154c3565b60405180910390f35b34801561032357600080fd5b5061032c61079f565b005b34801561033a57600080fd5b506103436107b3565b60405161030e91906154ce565b61036361035e366004615107565b6107b9565b60405161030e919061569f565b34801561037c57600080fd5b5061034361038b366004614e6f565b6107fb565b34801561039c57600080fd5b506103016103ab366004614e6f565b61080d565b61032c6103be366004614f81565b610822565b6103d66103d1366004614d6b565b610846565b60405161030e91906159c3565b61032c6103f1366004614e6f565b61096d565b61032c610404366004614e6f565b6109e0565b34801561041557600080fd5b50610429610424366004614ef8565b610aed565b60405161030e919061535a565b610449610444366004614c4b565b610b3b565b60405161030e919061594c565b610449610464366004614c4b565b610b73565b61032c610477366004614b35565b610b91565b6103d661048a366004614d6b565b610c54565b34801561049b57600080fd5b506103016104aa366004614b01565b610da4565b3480156104bb57600080fd5b506103016104ca366004614eab565b610dc4565b3480156104db57600080fd5b506103016104ea366004614e87565b610e23565b3480156104fb57600080fd5b50610429610e43565b61051761051236600461500b565b610e5f565b60405161030e91906159d1565b6103d6610532366004614d6b565b610e7d565b34801561054357600080fd5b50610301610552366004615107565b610eb1565b34801561056357600080fd5b50610429610ed6565b61057f61057a366004614ce7565b610ef2565b60405161030e91906154b0565b34801561059857600080fd5b5061032c6105a7366004614e6f565b61101d565b61057f6105ba366004614ce7565b611065565b6103d66105cd3660046150a7565b61112c565b3480156105de57600080fd5b506105f26105ed366004614f81565b611151565b60405161030e9190615a13565b34801561060b57600080fd5b5061030161061a366004614fb4565b611246565b6103d661062d366004614d6b565b61126b565b34801561063e57600080fd5b5061032c61064d366004614b70565b61129f565b61051761066036600461500b565b61134b565b61057f610673366004614ce7565b611369565b34801561068457600080fd5b5061032c610693366004614ae6565b61141e565b3480156106a457600080fd5b5061034361142f565b3480156106b957600080fd5b5061032c6106c8366004614ae6565b611435565b3480156106d957600080fd5b506103436106e8366004614b01565b6115c9565b3480156106f957600080fd5b506107026115e6565b60405161030e919061562a565b61032c61071d366004614c18565b61160a565b6103d66107303660046150a7565b61164c565b34801561074157600080fd5b50610429611667565b34801561075657600080fd5b5061032c610765366004614ae6565b611683565b61077d610778366004614dbe565b611726565b60405161030e9190615432565b60056020526000908152604090205460ff1681565b6107a761184f565b6107b16000611896565b565b60035481565b60606107c3611931565b156107d9576107d28383611953565b90506107f5565b6107e1611a6d565b6107eb8383611953565b90506107f5611aaf565b92915050565b60096020526000908152604090205481565b600a6020526000908152604090205460ff1681565b61082a611adf565b61083381611b4e565b61083b611b93565b610843611ba7565b50565b61084e61456a565b610856611931565b156108ec57835160005b8181146108e5576000610880846020015187611bd190919063ffffffff16565b905061088a61456a565b6108bb88848151811061089957fe5b6020026020010151838886815181106108ae57fe5b6020026020010151611bf0565b90506108c78582611d31565b9450868560200151106108db5750506108e5565b5050600101610860565b5050610966565b6108f4611a6d565b835160005b81811461095c576000610919846020015187611bd190919063ffffffff16565b905061092361456a565b61093288848151811061089957fe5b905061093e8582611d31565b94508685602001511061095257505061095c565b50506001016108f9565b5050610966611aaf565b9392505050565b610975611adf565b600061097f611dcc565b600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555061083b611b93565b6109e8611adf565b60006109f2611dcc565b9050600073ffffffffffffffffffffffffffffffffffffffff82163314610a195733610a1c565b60005b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600b60209081526040808320938516835292905220549091506001840190808211610a7157610a71610a6c858584611dfe565b611ea3565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610ad99086906154ce565b60405180910390a35050505061083b611b93565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b610b43614599565b610b4b611adf565b610b59858585856001611eab565b9050610b63611b93565b610b6b611ba7565b949350505050565b610b7b614599565b610b83611adf565b610b59858585856000611eab565b610b99611adf565b6000610ba3611dcc565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600860209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610c379086906154c3565b60405180910390a350610c48611b93565b610c50611ba7565b5050565b610c5c61456a565b610c64611931565b15610d2257835160005b8181146108e5578251600090610c8b90879063ffffffff611bd116565b90506000610cc8888481518110610c9e57fe5b602002602001015160a00151898581518110610cb657fe5b60200260200101516080015184612218565b9050610cd261456a565b610cf6898581518110610ce157fe5b6020026020010151838987815181106108ae57fe5b9050610d028682611d31565b955087866000015110610d17575050506108e5565b505050600101610c6e565b610d2a611a6d565b835160005b81811461095c578251600090610d4c90879063ffffffff611bd116565b90506000610d5f888481518110610c9e57fe5b9050610d6961456a565b610d78898581518110610ce157fe5b9050610d848682611d31565b955087866000015110610d995750505061095c565b505050600101610d2f565b600860209081526000928352604080842090915290825290205460ff1681565b600080610dd285858561225a565b90506005816008811115610de257fe5b1480610df957506007816008811115610df757fe5b145b15610e0e57610e0e610a6c60058787876122d9565b610e1a81868686612381565b95945050505050565b600760209081526000928352604080842090915290825290205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b610e676145c1565b610e6f611adf565b610b598585858560006125f1565b610e8561456a565b610e90848484610c54565b9050828160000151101561096657610966610a6c60008584600001516126de565b600080610ec9600154856126fd90919063ffffffff16565b9050610b6b848285612711565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610efc611931565b15610f9f578351604080518281526020808402820101909152818015610f3c57816020015b610f2961456a565b815260200190600190039081610f215790505b50915060005b8181146108e557610f80868281518110610f5857fe5b6020026020010151868381518110610f6c57fe5b60200260200101518684815181106108ae57fe5b838281518110610f8c57fe5b6020908102919091010152600101610f42565b610fa7611a6d565b8351604080518281526020808402820101909152818015610fe257816020015b610fcf61456a565b815260200190600190039081610fc75790505b50915060005b81811461095c57610ffe868281518110610f5857fe5b83828151811061100a57fe5b6020908102919091010152600101610fe8565b61102561184f565b7f3a3e76d7a75e198aef1f53137e4f2a8a2ec74e2e9526db8404d08ccc9f1e621d60035482604051611058929190615542565b60405180910390a1600355565b606061106f611adf565b83516040805182815260208084028201019091528180156110aa57816020015b61109761456a565b81526020019060019003908161108f5790505b50915060005b81811461111a576110fb8682815181106110c657fe5b60200260200101518683815181106110da57fe5b60200260200101518684815181106110ee57fe5b6020026020010151612797565b83828151811061110757fe5b60209081029190910101526001016110b0565b5050611124611b93565b610966611ba7565b61113461456a565b61113c611adf565b611147848484612797565b9050611124611b93565b6111596145f5565b61116282612839565b60408301526020820152608082015161118e578060015b9081600681111561118657fe5b905250610b36565b60a082015161119f57806002611179565b8160a001518160400151106111b657806005611179565b81610100015142106111ca57806004611179565b6020808201516000908152600a909152604090205460ff16156111ef57806006611179565b610120820151825173ffffffffffffffffffffffffffffffffffffffff9081166000908152600b60209081526040808320606088015190941683529290522054111561123d57806006611179565b60038152919050565b60008061125e6001548561286a90919063ffffffff16565b9050610b6b848285612879565b61127361456a565b61127e848484610846565b9050828160200151101561096657610966610a6c60018584602001516126de565b835160005b81811461130f576113078160001b8783815181106112be57fe5b60200260200101518784815181106112d257fe5b60200260200101518785815181106112e657fe5b60200260200101518786815181106112fa57fe5b60200260200101516128ce565b6001016112a4565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290615915565b60405180910390fd5b6113536145c1565b61135b611adf565b610b598585858560016125f1565b6060611373611adf565b83516040805182815260208084028201019091528180156113ae57816020015b61139b61456a565b8152602001906001900390816113935790505b50915060005b81811461111a576113ff8682815181106113ca57fe5b60200260200101518683815181106113de57fe5b60200260200101518684815181106113f257fe5b6020026020010151612a92565b83828151811061140b57fe5b60209081029190910101526001016113b4565b61142661184f565b61084381611896565b60015481565b61143d61184f565b60008173ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148557600080fd5b505afa158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114bd9190810190614f14565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16801561151b5761151b610a6c8383612ac5565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c03194906115bc9084908690615657565b60405180910390a1505050565b600b60209081526000928352604080842090915290825290205481565b7f20c13b0b0000000000000000000000000000000000000000000000000000000081565b611612611adf565b805160005b8181146116425761163a83828151811061162d57fe5b6020026020010151611b4e565b600101611617565b505061083b611b93565b61165461456a565b61165c611adf565b611147848484612a92565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61168b61184f565b73ffffffffffffffffffffffffffffffffffffffff81166116b6576116b1610a6c612b67565b610843565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6060611730611931565b156117cd57825160408051828152602080840282010190915281801561176a57816020015b60608152602001906001900390816117555790505b50915060005b8181146117c6576117a785828151811061178657fe5b602002602001015185838151811061179a57fe5b6020026020010151611953565b8382815181106117b357fe5b6020908102919091010152600101611770565b50506107f5565b6117d5611a6d565b825160408051828152602080840282010190915281801561180a57816020015b60608152602001906001900390816117f55790505b50915060005b8181146118455761182685828151811061178657fe5b83828151811061183257fe5b6020908102919091010152600101611810565b50506107f5611aaf565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107b1576000546107b190610a6c90339073ffffffffffffffffffffffffffffffffffffffff16612b9e565b6004546040517fe1a5430ebec577336427f40f15822f1f36c5e3509ff209d6db9e6c9e6941cb0b916118e29173ffffffffffffffffffffffffffffffffffffffff90911690849061537b565b60405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000547501000000000000000000000000000000000000000000900460ff1690565b6060600061196c600154856126fd90919063ffffffff16565b9050611979848483612bbb565b60608401516119888180612c8f565b60008281526005602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556080870151905160609130916119d6919061530d565b600060405180830381855af49150503d8060008114611a11576040519150601f19603f3d011682016040523d82523d6000602084013e611a16565b606091505b509150915081611a2d57611a2d610a6c8583612cf2565b611a38836000612c8f565b60405184907fa4a7329f1dd821363067e07d359e347b4af9b1efe4b6cccf13240228af3c800d90600090a29695505050505050565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556107b1612d0f565b60005474010000000000000000000000000000000000000000900460ff1615611b0d57611b0d610a6c612d43565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b611b566145f5565b611b5f82611151565b9050611b6b8282612d7a565b600381516006811115611b7a57fe5b14611b855750610843565b610c50828260200151612e29565b611b9b611931565b6107b1576107b1612d0f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b600082821115611bea57611bea610a6c60028585612ed2565b50900390565b611bf861456a565b6040516060907f9b44d5560000000000000000000000000000000000000000000000000000000090611c3290879087908790602401615a63565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060603073ffffffffffffffffffffffffffffffffffffffff1683604051611cba919061530d565b600060405180830381855af49150503d8060008114611cf5576040519150601f19603f3d011682016040523d82523d6000602084013e611cfa565b606091505b50915091508115611d2757805160a014611d1057fe5b80806020019051611d249190810190614f30565b93505b5050509392505050565b611d3961456a565b81518351611d4c9163ffffffff612ef116565b815260208083015190840151611d679163ffffffff612ef116565b602082015260408083015190840151611d859163ffffffff612ef116565b604082015260608083015190840151611da39163ffffffff612ef116565b606082015260808083015190840151611dc19163ffffffff612ef116565b608082015292915050565b60065460009073ffffffffffffffffffffffffffffffffffffffff16818115611df55781611df7565b335b9250505090565b6060634ad3127560e01b848484604051602401611e1d939291906153a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b611eb3614599565b8551611ec657611ec6610a6c6000612f0d565b8451611ed957611ed9610a6c6001612f0d565b8351865114611eef57611eef610a6c6002612f0d565b8251855114611f0557611f05610a6c6003612f0d565b8551604051908082528060200260200182016040528015611f4057816020015b611f2d61456a565b815260200190600190039081611f255790505b5081528451604080518281526020808402820101909152908015611f7e57816020015b611f6b61456a565b815260200190600190039081611f635790505b506020820152600080611f8f614617565b88600081518110611f9c57fe5b60200260200101519050611fae614617565b88600081518110611fbb57fe5b602002602001015190506000611fd083612839565b9150506000611fde83612839565b915050611fe961456a565b611ff161456a565b611ff96145c1565b61202c87878f8c8151811061200a57fe5b60200260200101518f8c8151811061201e57fe5b60200260200101518f6125f1565b80516020015190915061204690869063ffffffff612ef116565b945061206381602001516020015185612ef190919063ffffffff16565b9350612073838260000151611d31565b9250612083828260200151611d31565b91506120a081604001518b60400151612ef190919063ffffffff16565b60408b0152606080820151908b01516120be9163ffffffff612ef116565b60608b015260a08701518510612169578951805160018b019a85929181106120e257fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525092508e5189141561214657818a60200151898151811061213557fe5b602002602001018190525050612207565b8e898151811061215257fe5b6020026020010151965061216587612839565b9550505b8560a00151841061220157818a6020015189806001019a508151811061218b57fe5b60200260200101819052506040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525091508d518814156121de57828a600001518a8151811061213557fe5b8d88815181106121ea57fe5b602002602001015195506121fd86612839565b9450505b50611ff1565b505050505050505095945050505050565b6000610b6b8361224e61223282600163ffffffff611bd116565b612242888763ffffffff612fac16565b9063ffffffff612ef116565b9063ffffffff612fdd16565b6000612267848484613007565b905073ffffffffffffffffffffffffffffffffffffffff831661229457612294610a6c60068686866122d9565b600881818111156122a157fe5b60ff16106122b9576122b9610a6c60038686866122d9565b60008160088111156122c757fe5b141561096657610966610a6c60048686865b6060637e5a231860e01b858585856040516024016122fa94939291906158ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b6000600185600881111561239157fe5b14156123b85781516001146123b0576123b0610a6c60028686866122d9565b506000610b6b565b60028560088111156123c657fe5b14156124bf5781516042146123e5576123e5610a6c60028686866122d9565b6000826000815181106123f457fe5b016020015160f81c9050600061241184600163ffffffff61304616565b9050600061242685602163ffffffff61304616565b905060006001888585856040516000815260200160405260405161244d949392919061560c565b6020604051602081039080840390855afa15801561246f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8981169116149550610b6b945050505050565b60038560088111156124cd57fe5b141561257a5781516042146124ec576124ec610a6c60028686866122d9565b6000826000815181106124fb57fe5b016020015160f81c9050600061251884600163ffffffff61304616565b9050600061252d85602163ffffffff61304616565b905060006001886040516020016125449190615329565b604051602081830303815290604052805190602001208585856040516000815260200160405260405161244d949392919061560c565b600485600881111561258857fe5b14156125a057612599848484613070565b9050610b6b565b60068560088111156125ae57fe5b146125b557fe5b50600083815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff16949350505050565b6125f96145c1565b6101608087015161014080880191909152870151908601526126196145f5565b61262287611151565b905061262c6145f5565b61263587611151565b90506000612641611dcc565b905061264f8984838a613266565b61265b88838389613266565b61266f89898560200151856020015161337e565b6126888989856040015185604001516003543a8b6133c3565b93506126a38982856020015186604001518860000151613518565b6126bc8882846020015185604001518860200151613518565b6126d2836020015183602001518b8b85896135f6565b50505095945050505050565b60606318e4b14160e01b848484604051602401611e1d9392919061589e565b60006109668261270c8561379d565b613825565b60608301516000908161272585838661225a565b9050600581600881111561273557fe5b141561275757612750612748878761385f565b868487613897565b925061278e565b600781600881111561276557fe5b141561277f57612750612778878761385f565b838661394b565b61278b81868487612381565b92505b50509392505050565b61279f61456a565b6127a76145f5565b6127b085611151565b905060006127bc611dcc565b90506127ca86838387613266565b60006127e783604001518860a00151611bd190919063ffffffff16565b905060006127f5878361395a565b905061280588826003543a613970565b945060008460200151905061282189858388604001518a613518565b61282d818a86896139e7565b50505050509392505050565b6000806128516001548461286a90919063ffffffff16565b6000818152600960205260409020549092509050915091565b60006109668261270c85613a7e565b82516000908161288a85838661225a565b9050600581600881111561289a57fe5b14156128ad576127506127488787613b55565b60078160088111156128bb57fe5b141561277f576127506127788787613b55565b8015612a8b5760208451816128df57fe5b066004146128f6576128f6610a6c60008787613b8d565b6000612908858263ffffffff613bac16565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526002602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061296757612967610a6c60018989613b8d565b6040516060907fa85e59e400000000000000000000000000000000000000000000000000000000906129a39089908990899089906024016156b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612a2b919061530d565b6000604051808303816000865af19150503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b509150915081612a8557612a85610a6c8b8b84613bf8565b50505050505b5050505050565b612a9a61456a565b612aa5848484612797565b90508281602001511461096657610966610a6c60028584602001516126de565b60606311c7b72060e01b8383604051602401612ae2929190615657565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401612ae292919061537b565b82602001514210612bd457612bd4610a6c600183613c17565b60408301513a8114612bee57612bee610a6c833a84613c34565b60065473ffffffffffffffffffffffffffffffffffffffff168015612c1a57612c1a610a6c8483613c53565b60008381526005602052604090205460ff1615612c3f57612c3f610a6c600085613c17565b606085015173ffffffffffffffffffffffffffffffffffffffff81163314801590612c725750612c70868587612711565b155b15612c8757612c87610a6c60018684896122d9565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314610c50576006805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606320d11f6160e01b8383604051602401612ae2929190615550565b47801561084357604051339082156108fc029083906000818181858888f19350505050158015610c50573d6000803e3d6000fd5b60408051808201909152600481527f0c3b823f00000000000000000000000000000000000000000000000000000000602082015290565b606082015173ffffffffffffffffffffffffffffffffffffffff1615612dce57606082015173ffffffffffffffffffffffffffffffffffffffff163314612dce57612dce610a6c6002836020015133613c70565b6000612dd8611dcc565b90508073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614612e2457612e24610a6c6000846020015184613c70565b505050565b6000818152600a60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927f02c310a9a43963ff31a754a4099cc435ed498049687539d72d7818d9b093415c92612ec692909190339061571a565b60405180910390a45050565b606063e946c1bb60e01b848484604051602401611e1d93929190615845565b60008282018381101561096657610966610a6c60008686612ed2565b606063d4092f4f60e01b82604051602401612f289190615832565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b600082612fbb575060006107f5565b82820282848281612fc857fe5b041461096657610966610a6c60018686612ed2565b600081612ff357612ff3610a6c60038585612ed2565b6000828481612ffe57fe5b04949350505050565b600081516000141561302357613023610a6c60028686866122d9565b8160018351038151811061303357fe5b016020015160f81c6008811115610b6b57fe5b6000816020018351101561306757613067610a6c6005855185602001613c8f565b50016020015190565b80516000906130a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff613cae16565b6040516060907f1626ba7e00000000000000000000000000000000000000000000000000000000906130df9088908790602401615550565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061316e848363ffffffff613cae16565b600060608673ffffffffffffffffffffffffffffffffffffffff1683604051613197919061530d565b600060405180830381855afa9150503d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b50915091508180156131ea575080516020145b1561324c577fb06713810000000000000000000000000000000000000000000000000000000061322182600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610966565b61325b610a6c89898985613cb2565b505050509392505050565b60038351600681111561327557fe5b1461328f5761328f610a6c84602001518560000151613cd3565b606084015173ffffffffffffffffffffffffffffffffffffffff16156132e357606084015173ffffffffffffffffffffffffffffffffffffffff1633146132e3576132e3610a6c6002856020015133613c70565b602084015173ffffffffffffffffffffffffffffffffffffffff161561334d578173ffffffffffffffffffffffffffffffffffffffff16846020015173ffffffffffffffffffffffffffffffffffffffff161461334d5761334d610a6c6001856020015185613c70565b61335c84846020015183612879565b61337857613378610a6c600085602001518760000151856122d9565b50505050565b60a080840151908501516133979163ffffffff612fac16565b608080850151908601516133b09163ffffffff612fac16565b101561337857613378610a6c8383613cf0565b6133cb6145c1565b60a08801516000906133e3908863ffffffff611bd116565b905060006133fa8a608001518b60a0015184613d0d565b90506000613415888b60a00151611bd190919063ffffffff16565b9050600061342c8b608001518c60a0015184613d0d565b90508515613449576134428c8c85878587613d41565b945061345a565b6134578c8c85878587613e13565b94505b84515160808d015160c08e0151613472929190613d0d565b85516040015284516020015160a08d015160e08e0151613493929190613d0d565b85516060015260208501515160808c015160c08d01516134b4929190613d0d565b856020015160400181815250506134dc8560200151602001518c60a001518d60e00151613d0d565b60208601516060015260006134f7888a63ffffffff612fac16565b86516080908101829052602088015101525050505050979650505050505050565b602081015161352e90839063ffffffff612ef116565b600960008581526020019081526020016000208190555082856040015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f6869791f0a34781b29882982cc39e882768cf2c96995c2a110c577c53bc932d58861014001518961016001518a61018001518b6101a001518b338a600001518b602001518c604001518d606001518e608001516040516135e79b9a99989796959493929190615766565b60405180910390a45050505050565b835183516040808701519086015161014087015185516020015161361f918b91869088906128ce565b6136398a89610140015186868960200151602001516128ce565b6136538988610180015185848960200151604001516128ce565b61366d8a89610180015186858960000151604001516128ce565b6136838a896101400151868989604001516128ce565b61369989886101400151858989606001516128ce565b60006136b18b8b88600001516080015188888c613eac565b9050806136ce578551600060809182018190526020880151909101525b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561371e57506101a080890151908a015161371e9163ffffffff613f0816565b1561375c576137578b8a6101a0015189866137528b60200151606001518c6000015160600151612ef190919063ffffffff16565b6128ce565b613790565b6137768a896101a0015189858a60200151606001516128ce565b6137908b8a6101a0015189868a60000151606001516128ce565b5050505050505050505050565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508815294850195909552908301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff9091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6040516060907fde047db40000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a8e565b805160009060158110156138b5576138b5610a6c60028787876122d9565b60006138e9847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb840163ffffffff613f2d16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526008602090815260408083209385168352929052205490915060ff1661393357613933610a6c8683613f6d565b6139408188866015613f8a565b979650505050505050565b6000610b6b8385846001613f8a565b60008183106139695781610966565b5090919050565b61397861456a565b6020810184905260a08501516080860151613994918691613d0d565b815260a085015160c08601516139ab918691613d0d565b604082015260a085015160e08601516139c5918691613d0d565b60608201526139da828463ffffffff612fac16565b6080820152949350505050565b613a018484610160015184866000015185602001516128ce565b613a1b8484610140015185600001518585600001516128ce565b613a3584846101a0015184866040015185606001516128ce565b613a53848461018001518560000151866040015185604001516128ce565b6000613a69858360800151866000015186614161565b905080612a8b57600060808301525050505050565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613aca57fe5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b6040516060907f3efe50c80000000000000000000000000000000000000000000000000000000090612ae29085908590602401615a41565b606063488219a660e01b848484604051602401611e1d9392919061580a565b60008160040183511015613bcd57613bcd610a6c6003855185600401613c8f565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6060634678472b60e01b848484604051602401611e1d93929190615569565b606063f598518460e01b8383604051602401612ae29291906158fe565b606063a26dac0960e01b848484604051602401611e1d939291906155f6565b606063dec4aedf60e01b8383604051602401612ae29291906154d7565b606063e53c76c860e01b848484604051602401611e1d93929190615866565b6060632800659560e01b848484604051602401611e1d939291906158ac565b9052565b6060631b8388f760e01b858585856040516024016122fa94939291906154fb565b606063fdb6ca8d60e01b8383604051602401612ae2929190615594565b606063b6555d6f60e01b8383604051602401612ae2929190615542565b6000613d1a8484846141a6565b15613d2d57613d2d610a6c85858561420c565b610b6b8361224e868563ffffffff612fac16565b613d496145c1565b81851184841184861115613d6957613d6289868661422b565b9250613db8565b86841115613da95782518790528251602001869052608088015160a0890151613d93919089613d0d565b6020808501805192909252905101879052613db8565b613db587878787614268565b92505b8115613dde576020808401510151835151613dd89163ffffffff611bd116565b60408401525b8015613e065782516020908101519084015151613e009163ffffffff611bd116565b60608401525b50505b9695505050505050565b613e1b6145c1565b82841115613e3557613e2e87848461422b565b9050613e83565b82841015613e745780518590528051602090810185905281015184905260a08601516080870151613e67919086614293565b6020808301510152613e83565b613e8085858585614268565b90505b6020808201510151815151613e9d9163ffffffff611bd116565b60408201529695505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff168015613efe57476000613edf8a84848b8b8a6142cb565b9050613ef189848385038b8a8a6142cb565b5060019350505050613e09565b6000915050613e09565b6000815183511480156109665750508051602091820120825192909101919091201490565b60008160140183511015613f4e57613f4e610a6c6004855185601401613c8f565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b606063a15c0d0660e01b8383604051602401612ae292919061537b565b8151600090613fa18484830363ffffffff613cae16565b6040516060907f20c13b0b0000000000000000000000000000000000000000000000000000000090613fd990889088906024016156f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050614068858363ffffffff613cae16565b600060608873ffffffffffffffffffffffffffffffffffffffff1683604051614091919061530d565b600060405180830381855afa9150503d80600081146140cc576040519150601f19603f3d011682016040523d82523d6000602084013e6140d1565b606091505b50915091508180156140e4575080516020145b15614146577f20c13b0b0000000000000000000000000000000000000000000000000000000061411b82600063ffffffff613bac16565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614945050505050610b6b565b614155610a6c8a8a8a85614403565b50505050949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16801561419c576141918682478888886142cb565b506001915050610b6b565b6000915050610b6b565b6000826141b8576141b8610a6c614424565b8115806141c3575083155b156141d057506000610966565b600083806141da57fe5b85840990506141ef858463ffffffff612fac16565b614201826103e863ffffffff612fac16565b101595945050505050565b606063339f3de260e01b848484604051602401611e1d939291906155f6565b6142336145c1565b60208082018051859052518101839052815101839052608084015160a085015161425e919085613d0d565b8151529392505050565b6142706145c1565b805194909452835160209081019390935282840180519290925290519091015290565b60006142a084848461445b565b156142b3576142b3610a6c85858561420c565b610b6b8361224e61223282600163ffffffff611bd116565b60008385106142d75750825b6040516060907fa3b4a3270000000000000000000000000000000000000000000000000000000090614311908690869089906024016153a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608873ffffffffffffffffffffffffffffffffffffffff16848460405161439a919061530d565b60006040518083038185875af1925050503d80600081146143d7576040519150601f19603f3d011682016040523d82523d6000602084013e6143dc565b606091505b5091509150816143f6576143f6610a6c8b898989866144bf565b5050509695505050505050565b6060635bd0428d60e01b858585856040516024016122fa94939291906153d3565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b60008261446d5761446d610a6c614424565b811580614478575083155b1561448557506000610966565b6000838061448f57fe5b8584099050836144a5818363ffffffff611bd116565b816144ac57fe5b0690506141ef858463ffffffff612fac16565b60606387cb1e7560e01b86868686866040516024016144e29594939291906155b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016060815260200160008152602001600081525090565b60405180608001604052806145d461456a565b81526020016145e161456a565b815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f557600080fd5b600082601f830112614712578081fd5b813561472561472082615b1f565b615af8565b81815291506020808301908481018184028601820187101561474657600080fd5b60005b8481101561476d5761475b88836146de565b84529282019290820190600101614749565b505050505092915050565b600082601f830112614788578081fd5b813561479661472082615b1f565b8181529150602080830190840160005b838110156147d3576147be8760208435890101614896565b835260209283019291909101906001016147a6565b5050505092915050565b600082601f8301126147ed578081fd5b81356147fb61472082615b1f565b8181529150602080830190840160005b838110156147d357614823876020843589010161491d565b8352602092830192919091019060010161480b565b600082601f830112614848578081fd5b813561485661472082615b1f565b81815291506020808301908481018184028601820187101561487757600080fd5b60005b8481101561476d5781358452928201929082019060010161487a565b600082601f8301126148a6578081fd5b813567ffffffffffffffff8111156148bc578182fd5b6148ed60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615af8565b915080825283602082850101111561490457600080fd5b8060208401602084013760009082016020015292915050565b60006101c0808385031215614930578182fd5b61493981615af8565b91505061494683836146de565b815261495583602084016146de565b602082015261496783604084016146de565b604082015261497983606084016146de565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff808211156149db57600080fd5b6149e786838701614896565b83850152610160925082850135915080821115614a0357600080fd5b614a0f86838701614896565b83850152610180925082850135915080821115614a2b57600080fd5b614a3786838701614896565b838501526101a0925082850135915080821115614a5357600080fd5b50614a6085828601614896565b82840152505092915050565b600060a08284031215614a7d578081fd5b614a8760a0615af8565b90508135815260208201356020820152604082013560408201526060820135614aaf81615b89565b6060820152608082013567ffffffffffffffff811115614ace57600080fd5b614ada84828501614896565b60808301525092915050565b600060208284031215614af7578081fd5b61096683836146de565b60008060408385031215614b13578081fd5b614b1d84846146de565b9150614b2c84602085016146de565b90509250929050565b60008060408385031215614b47578182fd5b614b5184846146de565b915060208301358015158114614b65578182fd5b809150509250929050565b60008060008060808587031215614b85578182fd5b843567ffffffffffffffff80821115614b9c578384fd5b614ba888838901614778565b95506020870135915080821115614bbd578384fd5b614bc988838901614702565b94506040870135915080821115614bde578384fd5b614bea88838901614702565b93506060870135915080821115614bff578283fd5b50614c0c87828801614838565b91505092959194509250565b600060208284031215614c29578081fd5b813567ffffffffffffffff811115614c3f578182fd5b610b6b848285016147dd565b60008060008060808587031215614c60578182fd5b843567ffffffffffffffff80821115614c77578384fd5b614c83888389016147dd565b95506020870135915080821115614c98578384fd5b614ca4888389016147dd565b94506040870135915080821115614cb9578384fd5b614cc588838901614778565b93506060870135915080821115614cda578283fd5b50614c0c87828801614778565b600080600060608486031215614cfb578081fd5b833567ffffffffffffffff80821115614d12578283fd5b614d1e878388016147dd565b94506020860135915080821115614d33578283fd5b614d3f87838801614838565b93506040860135915080821115614d54578283fd5b50614d6186828701614778565b9150509250925092565b600080600060608486031215614d7f578081fd5b833567ffffffffffffffff80821115614d96578283fd5b614da2878388016147dd565b9450602086013593506040860135915080821115614d54578283fd5b60008060408385031215614dd0578182fd5b823567ffffffffffffffff80821115614de7578384fd5b81850186601f820112614df8578485fd5b80359250614e0861472084615b1f565b83815260208082019190838101885b87811015614e4057614e2e8c848435890101614a6c565b85529382019390820190600101614e17565b50919750880135945050505080821115614e58578283fd5b50614e6585828601614778565b9150509250929050565b600060208284031215614e80578081fd5b5035919050565b60008060408385031215614e99578182fd5b823591506020830135614b6581615b89565b600080600060608486031215614ebf578081fd5b833592506020840135614ed181615b89565b9150604084013567ffffffffffffffff811115614eec578182fd5b614d6186828701614896565b600060208284031215614f09578081fd5b813561096681615bab565b600060208284031215614f25578081fd5b815161096681615bab565b600060a08284031215614f41578081fd5b614f4b60a0615af8565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215614f92578081fd5b813567ffffffffffffffff811115614fa8578182fd5b610b6b8482850161491d565b60008060408385031215614fc6578182fd5b823567ffffffffffffffff80821115614fdd578384fd5b614fe98683870161491d565b93506020850135915080821115614ffe578283fd5b50614e6585828601614896565b60008060008060808587031215615020578182fd5b843567ffffffffffffffff80821115615037578384fd5b6150438883890161491d565b95506020870135915080821115615058578384fd5b6150648883890161491d565b94506040870135915080821115615079578384fd5b61508588838901614896565b9350606087013591508082111561509a578283fd5b50614c0c87828801614896565b6000806000606084860312156150bb578081fd5b833567ffffffffffffffff808211156150d2578283fd5b6150de8783880161491d565b94506020860135935060408601359150808211156150fa578283fd5b50614d6186828701614896565b60008060408385031215615119578182fd5b823567ffffffffffffffff80821115615130578384fd5b614fe986838701614a6c565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156151925761517c8683516151e6565b60a0959095019460209190910190600101615169565b5093949350505050565b600081518084526151b4816020860160208601615b3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b80518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60006101c061522684845161513c565b6020830151615238602086018261513c565b50604083015161524b604086018261513c565b50606083015161525e606086018261513c565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152506101408084015182828701526152b78387018261519c565b915050610160915081840151858203838701526152d4828261519c565b9250505061018080840151858303828701526152f0838261519c565b9150506101a091508184015185820383870152613e09828261519c565b6000825161531f818460208701615b3f565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260806020830152615402608083018661519c565b8281036040840152615414818661519c565b8381036060850152615426818661519c565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156154a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261549185835161519c565b94509285019290850190600101615457565b5092979650505050505050565b6000602082526109666020830184615156565b901515815260200190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600085825273ffffffffffffffffffffffffffffffffffffffff8516602083015260806040830152615530608083018561519c565b8281036060840152613940818561519c565b918252602082015260400190565b600083825260406020830152610b6b604083018461519c565b600084825260606020830152615582606083018561519c565b8281036040840152613e09818561519c565b828152604081016155a483615b7f565b8260208301529392505050565b600086825285602083015273ffffffffffffffffffffffffffffffffffffffff808616604084015280851660608401525060a0608083015261394060a083018461519c565b9283526020830191909152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060208252610966602083018461519c565b6000608082526156c5608083018761519c565b73ffffffffffffffffffffffffffffffffffffffff95861660208401529390941660408201526060015292915050565b600060408252615708604083018561519c565b8281036020840152610e1a818561519c565b60006060825261572d606083018661519c565b828103602084015261573f818661519c565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600061016080835261577a8184018f61519c565b838103602085015261578c818f61519c565b91505082810360408401526157a1818d61519c565b83810360608501526157b3818d61519c565b73ffffffffffffffffffffffffffffffffffffffff9b8c16608086015299909a1660a0840152505060c081019590955260e08501939093526101008401919091526101208301526101409091015295945050505050565b600061581585615b6b565b84825283602083015260606040830152610e1a606083018461519c565b6020810161583f83615b75565b91905290565b6060810161585285615b75565b938152602081019290925260409091015290565b606081016003851061587457fe5b938152602081019290925273ffffffffffffffffffffffffffffffffffffffff1660409091015290565b606081016003851061585257fe5b606081016008851061585257fe5b60006158c586615b7f565b85825284602083015273ffffffffffffffffffffffffffffffffffffffff8416604083015260806060830152613e09608083018461519c565b6040810161590b84615b6b565b9281526020015290565b60208082526014908201527f5452414e53464552535f5355434345535346554c000000000000000000000000604082015260600190565b60006020825282516080602084015261596860a0840182615156565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526159a38183615156565b604086015160608601526060860151608086015280935050505092915050565b60a081016107f582846151e6565b6000610180820190506159e58284516151e6565b60208301516159f760a08401826151e6565b5060408301516101408301526060909201516101609091015290565b81516060820190615a2381615b7f565b80835250602083015160208301526040830151604083015292915050565b600060408252615a546040830185615216565b90508260208301529392505050565b600060608252615a766060830186615216565b8460208401528281036040840152613e09818561519c565b60006040825283516040830152602084015160608301526040840151608083015273ffffffffffffffffffffffffffffffffffffffff60608501511660a0830152608084015160a060c0840152615ae860e084018261519c565b9150508260208301529392505050565b60405181810167ffffffffffffffff81118282101715615b1757600080fd5b604052919050565b600067ffffffffffffffff821115615b35578081fd5b5060209081020190565b60005b83811015615b5a578181015183820152602001615b42565b838111156133785750506000910152565b6002811061084357fe5b6004811061084357fe5b6007811061084357fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461084357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461084357600080fd5b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a090209056fea365627a7a7231582014d0c4c051bc6bd0373e742aeadd0f096942ba0bb0c32d7fa567c4419076dfd96c6578706572696d656e74616cf564736f6c63430005110040",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8D45CD23 GT PUSH2 0x184 JUMPI DUP1 PUSH4 0xBEEE2E14 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0xDD885E2D GT PUSH2 0x8A JUMPI DUP1 PUSH4 0xEEA086BA GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x735 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x74A JUMPI DUP1 PUSH4 0xFC74896D EQ PUSH2 0x76A JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xDD885E2D EQ PUSH2 0x6ED JUMPI DUP1 PUSH4 0xDEDFC1F1 EQ PUSH2 0x70F JUMPI DUP1 PUSH4 0xE14B58C4 EQ PUSH2 0x722 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xC26CFECD GT PUSH2 0xBB JUMPI DUP1 PUSH4 0xC26CFECD EQ PUSH2 0x698 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x6AD JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x6CD JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0xBEEE2E14 EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0xC0FA16CC EQ PUSH2 0x678 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x9B44D556 GT PUSH2 0x138 JUMPI DUP1 PUSH4 0xA6C3BF33 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0xA6C3BF33 EQ PUSH2 0x61F JUMPI DUP1 PUSH4 0xB04FBDDD EQ PUSH2 0x632 JUMPI DUP1 PUSH4 0xB718E292 EQ PUSH2 0x652 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x9B44D556 EQ PUSH2 0x5BF JUMPI DUP1 PUSH4 0x9D3FA4B9 EQ PUSH2 0x5D2 JUMPI DUP1 PUSH4 0xA12DCC6F EQ PUSH2 0x5FF JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x8EA8DFE4 GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x8EA8DFE4 EQ PUSH2 0x56C JUMPI DUP1 PUSH4 0x9331C742 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x9694A402 EQ PUSH2 0x5AC JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x8D45CD23 EQ PUSH2 0x537 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x557 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x60704108 GT PUSH2 0x23D JUMPI DUP1 PUSH4 0x7B8E3514 GT PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x850A1501 GT PUSH2 0x1CB JUMPI DUP1 PUSH4 0x850A1501 EQ PUSH2 0x4EF JUMPI DUP1 PUSH4 0x88EC79FB EQ PUSH2 0x504 JUMPI DUP1 PUSH4 0x8BC8EFB3 EQ PUSH2 0x524 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x48F JUMPI DUP1 PUSH4 0x8171C407 EQ PUSH2 0x4AF JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x4CF JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x6FCF3E9E GT PUSH2 0x222 JUMPI DUP1 PUSH4 0x6FCF3E9E EQ PUSH2 0x456 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x469 JUMPI DUP1 PUSH4 0x78D29AC1 EQ PUSH2 0x47C JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x60704108 EQ PUSH2 0x409 JUMPI DUP1 PUSH4 0x6A1A80FD EQ PUSH2 0x436 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x2AC12622 GT PUSH2 0x294 JUMPI DUP1 PUSH4 0x369DA099 GT PUSH2 0x279 JUMPI DUP1 PUSH4 0x369DA099 EQ PUSH2 0x3C3 JUMPI DUP1 PUSH4 0x46C02D7A EQ PUSH2 0x3E3 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x3F6 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0x2DA62987 EQ PUSH2 0x3B0 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x1CE4C78B GT PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x1CE4C78B EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0x2280C910 EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x370 JUMPI PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH4 0x228E168 EQ PUSH2 0x2E1 JUMPI DUP1 PUSH4 0xEFCA185 EQ PUSH2 0x317 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x2FC CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x78A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x79F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54CE JUMP JUMPDEST PUSH2 0x363 PUSH2 0x35E CALLDATASIZE PUSH1 0x4 PUSH2 0x5107 JUMP JUMPDEST PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x569F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x38B CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x7FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x3AB CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x80D JUMP JUMPDEST PUSH2 0x32C PUSH2 0x3BE CALLDATASIZE PUSH1 0x4 PUSH2 0x4F81 JUMP JUMPDEST PUSH2 0x822 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x3D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0x846 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x59C3 JUMP JUMPDEST PUSH2 0x32C PUSH2 0x3F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x96D JUMP JUMPDEST PUSH2 0x32C PUSH2 0x404 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x9E0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x415 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0x424 CALLDATASIZE PUSH1 0x4 PUSH2 0x4EF8 JUMP JUMPDEST PUSH2 0xAED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x535A JUMP JUMPDEST PUSH2 0x449 PUSH2 0x444 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C4B JUMP JUMPDEST PUSH2 0xB3B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x594C JUMP JUMPDEST PUSH2 0x449 PUSH2 0x464 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C4B JUMP JUMPDEST PUSH2 0xB73 JUMP JUMPDEST PUSH2 0x32C PUSH2 0x477 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B35 JUMP JUMPDEST PUSH2 0xB91 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x48A CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0xC54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4AA CALLDATASIZE PUSH1 0x4 PUSH2 0x4B01 JUMP JUMPDEST PUSH2 0xDA4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4CA CALLDATASIZE PUSH1 0x4 PUSH2 0x4EAB JUMP JUMPDEST PUSH2 0xDC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x4EA CALLDATASIZE PUSH1 0x4 PUSH2 0x4E87 JUMP JUMPDEST PUSH2 0xE23 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0xE43 JUMP JUMPDEST PUSH2 0x517 PUSH2 0x512 CALLDATASIZE PUSH1 0x4 PUSH2 0x500B JUMP JUMPDEST PUSH2 0xE5F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x59D1 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x532 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0xE7D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x552 CALLDATASIZE PUSH1 0x4 PUSH2 0x5107 JUMP JUMPDEST PUSH2 0xEB1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x563 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x57F PUSH2 0x57A CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0xEF2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x54B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x5A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E6F JUMP JUMPDEST PUSH2 0x101D JUMP JUMPDEST PUSH2 0x57F PUSH2 0x5BA CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0x1065 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x5CD CALLDATASIZE PUSH1 0x4 PUSH2 0x50A7 JUMP JUMPDEST PUSH2 0x112C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5F2 PUSH2 0x5ED CALLDATASIZE PUSH1 0x4 PUSH2 0x4F81 JUMP JUMPDEST PUSH2 0x1151 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x5A13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x60B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x301 PUSH2 0x61A CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB4 JUMP JUMPDEST PUSH2 0x1246 JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x62D CALLDATASIZE PUSH1 0x4 PUSH2 0x4D6B JUMP JUMPDEST PUSH2 0x126B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x64D CALLDATASIZE PUSH1 0x4 PUSH2 0x4B70 JUMP JUMPDEST PUSH2 0x129F JUMP JUMPDEST PUSH2 0x517 PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x500B JUMP JUMPDEST PUSH2 0x134B JUMP JUMPDEST PUSH2 0x57F PUSH2 0x673 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE7 JUMP JUMPDEST PUSH2 0x1369 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x684 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x693 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x141E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x142F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x6C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x1435 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x343 PUSH2 0x6E8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B01 JUMP JUMPDEST PUSH2 0x15C9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x702 PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x562A JUMP JUMPDEST PUSH2 0x32C PUSH2 0x71D CALLDATASIZE PUSH1 0x4 PUSH2 0x4C18 JUMP JUMPDEST PUSH2 0x160A JUMP JUMPDEST PUSH2 0x3D6 PUSH2 0x730 CALLDATASIZE PUSH1 0x4 PUSH2 0x50A7 JUMP JUMPDEST PUSH2 0x164C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x741 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x429 PUSH2 0x1667 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x756 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x32C PUSH2 0x765 CALLDATASIZE PUSH1 0x4 PUSH2 0x4AE6 JUMP JUMPDEST PUSH2 0x1683 JUMP JUMPDEST PUSH2 0x77D PUSH2 0x778 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DBE JUMP JUMPDEST PUSH2 0x1726 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x30E SWAP2 SWAP1 PUSH2 0x5432 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x7A7 PUSH2 0x184F JUMP JUMPDEST PUSH2 0x7B1 PUSH1 0x0 PUSH2 0x1896 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x7C3 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x7D9 JUMPI PUSH2 0x7D2 DUP4 DUP4 PUSH2 0x1953 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x7E1 PUSH2 0x1A6D JUMP JUMPDEST PUSH2 0x7EB DUP4 DUP4 PUSH2 0x1953 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH2 0x1AAF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x82A PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x833 DUP2 PUSH2 0x1B4E JUMP JUMPDEST PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x843 PUSH2 0x1BA7 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x84E PUSH2 0x456A JUMP JUMPDEST PUSH2 0x856 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x8EC JUMPI DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI PUSH1 0x0 PUSH2 0x880 DUP5 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x88A PUSH2 0x456A JUMP JUMPDEST PUSH2 0x8BB DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x899 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1BF0 JUMP JUMPDEST SWAP1 POP PUSH2 0x8C7 DUP6 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP5 POP DUP7 DUP6 PUSH1 0x20 ADD MLOAD LT PUSH2 0x8DB JUMPI POP POP PUSH2 0x8E5 JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x860 JUMP JUMPDEST POP POP PUSH2 0x966 JUMP JUMPDEST PUSH2 0x8F4 PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI PUSH1 0x0 PUSH2 0x919 DUP5 PUSH1 0x20 ADD MLOAD DUP8 PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x923 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x932 DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x899 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x93E DUP6 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP5 POP DUP7 DUP6 PUSH1 0x20 ADD MLOAD LT PUSH2 0x952 JUMPI POP POP PUSH2 0x95C JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x8F9 JUMP JUMPDEST POP POP PUSH2 0x966 PUSH2 0x1AAF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x975 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97F PUSH2 0x1DCC JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x9E8 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9F2 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ PUSH2 0xA19 JUMPI CALLER PUSH2 0xA1C JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 DUP5 ADD SWAP1 DUP1 DUP3 GT PUSH2 0xA71 JUMPI PUSH2 0xA71 PUSH2 0xA6C DUP6 DUP6 DUP5 PUSH2 0x1DFE JUMP JUMPDEST PUSH2 0x1EA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xAD9 SWAP1 DUP7 SWAP1 PUSH2 0x54CE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xB43 PUSH2 0x4599 JUMP JUMPDEST PUSH2 0xB4B PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x1 PUSH2 0x1EAB JUMP JUMPDEST SWAP1 POP PUSH2 0xB63 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0xB6B PUSH2 0x1BA7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xB7B PUSH2 0x4599 JUMP JUMPDEST PUSH2 0xB83 PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x0 PUSH2 0x1EAB JUMP JUMPDEST PUSH2 0xB99 PUSH2 0x1ADF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBA3 PUSH2 0x1DCC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xC37 SWAP1 DUP7 SWAP1 PUSH2 0x54C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH2 0xC48 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0xC50 PUSH2 0x1BA7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xC5C PUSH2 0x456A JUMP JUMPDEST PUSH2 0xC64 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0xD22 JUMPI DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xC8B SWAP1 DUP8 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCC8 DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC9E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCB6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2218 JUMP JUMPDEST SWAP1 POP PUSH2 0xCD2 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xCF6 DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCE1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD02 DUP7 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP6 POP DUP8 DUP7 PUSH1 0x0 ADD MLOAD LT PUSH2 0xD17 JUMPI POP POP POP PUSH2 0x8E5 JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xC6E JUMP JUMPDEST PUSH2 0xD2A PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH2 0xD4C SWAP1 DUP8 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD5F DUP9 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC9E JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD69 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xD78 DUP10 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xD84 DUP7 DUP3 PUSH2 0x1D31 JUMP JUMPDEST SWAP6 POP DUP8 DUP7 PUSH1 0x0 ADD MLOAD LT PUSH2 0xD99 JUMPI POP POP POP PUSH2 0x95C JUMP JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0xD2F JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xDD2 DUP6 DUP6 DUP6 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDE2 JUMPI INVALID JUMPDEST EQ DUP1 PUSH2 0xDF9 JUMPI POP PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDF7 JUMPI INVALID JUMPDEST EQ JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH2 0xE0E PUSH2 0xA6C PUSH1 0x5 DUP8 DUP8 DUP8 PUSH2 0x22D9 JUMP JUMPDEST PUSH2 0xE1A DUP2 DUP7 DUP7 DUP7 PUSH2 0x2381 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0xE67 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0xE6F PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x0 PUSH2 0x25F1 JUMP JUMPDEST PUSH2 0xE85 PUSH2 0x456A JUMP JUMPDEST PUSH2 0xE90 DUP5 DUP5 DUP5 PUSH2 0xC54 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x0 ADD MLOAD LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x0 DUP6 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xEC9 PUSH1 0x1 SLOAD DUP6 PUSH2 0x26FD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B DUP5 DUP3 DUP6 PUSH2 0x2711 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xEFC PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0xF9F JUMPI DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xF3C JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xF29 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xF21 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x8E5 JUMPI PUSH2 0xF80 DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF58 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xF6C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x8AE JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF8C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xF42 JUMP JUMPDEST PUSH2 0xFA7 PUSH2 0x1A6D JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0xFE2 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xFCF PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xFC7 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x95C JUMPI PUSH2 0xFFE DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xF58 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x100A JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xFE8 JUMP JUMPDEST PUSH2 0x1025 PUSH2 0x184F JUMP JUMPDEST PUSH32 0x3A3E76D7A75E198AEF1F53137E4F2A8A2EC74E2E9526DB8404D08CCC9F1E621D PUSH1 0x3 SLOAD DUP3 PUSH1 0x40 MLOAD PUSH2 0x1058 SWAP3 SWAP2 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x3 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH2 0x106F PUSH2 0x1ADF JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x10AA JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1097 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x108F JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x111A JUMPI PUSH2 0x10FB DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10C6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x10DA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x10EE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2797 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1107 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x10B0 JUMP JUMPDEST POP POP PUSH2 0x1124 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x966 PUSH2 0x1BA7 JUMP JUMPDEST PUSH2 0x1134 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x113C PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x1147 DUP5 DUP5 DUP5 PUSH2 0x2797 JUMP JUMPDEST SWAP1 POP PUSH2 0x1124 PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x1159 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x1162 DUP3 PUSH2 0x2839 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD PUSH2 0x118E JUMPI DUP1 PUSH1 0x1 JUMPDEST SWAP1 DUP2 PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1186 JUMPI INVALID JUMPDEST SWAP1 MSTORE POP PUSH2 0xB36 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH2 0x119F JUMPI DUP1 PUSH1 0x2 PUSH2 0x1179 JUMP JUMPDEST DUP2 PUSH1 0xA0 ADD MLOAD DUP2 PUSH1 0x40 ADD MLOAD LT PUSH2 0x11B6 JUMPI DUP1 PUSH1 0x5 PUSH2 0x1179 JUMP JUMPDEST DUP2 PUSH2 0x100 ADD MLOAD TIMESTAMP LT PUSH2 0x11CA JUMPI DUP1 PUSH1 0x4 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x11EF JUMPI DUP1 PUSH1 0x6 PUSH2 0x1179 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x123D JUMPI DUP1 PUSH1 0x6 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x125E PUSH1 0x1 SLOAD DUP6 PUSH2 0x286A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B DUP5 DUP3 DUP6 PUSH2 0x2879 JUMP JUMPDEST PUSH2 0x1273 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x127E DUP5 DUP5 DUP5 PUSH2 0x846 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x1 DUP6 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x130F JUMPI PUSH2 0x1307 DUP2 PUSH1 0x0 SHL DUP8 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x12BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x12D2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x12E6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP8 DUP7 DUP2 MLOAD DUP2 LT PUSH2 0x12FA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x12A4 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1342 SWAP1 PUSH2 0x5915 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1353 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x135B PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0xB59 DUP6 DUP6 DUP6 DUP6 PUSH1 0x1 PUSH2 0x25F1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1373 PUSH2 0x1ADF JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x13AE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x139B PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1393 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x111A JUMPI PUSH2 0x13FF DUP7 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x13CA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x13DE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x13F2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2A92 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x140B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x13B4 JUMP JUMPDEST PUSH2 0x1426 PUSH2 0x184F JUMP JUMPDEST PUSH2 0x843 DUP2 PUSH2 0x1896 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x143D PUSH2 0x184F JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E 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 0x1485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1499 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 0x14BD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4F14 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x151B JUMPI PUSH2 0x151B PUSH2 0xA6C DUP4 DUP4 PUSH2 0x2AC5 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x15BC SWAP1 DUP5 SWAP1 DUP7 SWAP1 PUSH2 0x5657 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 DUP2 JUMP JUMPDEST PUSH2 0x1612 PUSH2 0x1ADF JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1642 JUMPI PUSH2 0x163A DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x162D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B4E JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1617 JUMP JUMPDEST POP POP PUSH2 0x83B PUSH2 0x1B93 JUMP JUMPDEST PUSH2 0x1654 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x165C PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x1147 DUP5 DUP5 DUP5 PUSH2 0x2A92 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x168B PUSH2 0x184F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16B6 JUMPI PUSH2 0x16B1 PUSH2 0xA6C PUSH2 0x2B67 JUMP JUMPDEST PUSH2 0x843 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1730 PUSH2 0x1931 JUMP JUMPDEST ISZERO PUSH2 0x17CD JUMPI DUP3 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x176A JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1755 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x17C6 JUMPI PUSH2 0x17A7 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1786 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x179A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1953 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x17B3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1770 JUMP JUMPDEST POP POP PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x17D5 PUSH2 0x1A6D JUMP JUMPDEST DUP3 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE DUP2 DUP1 ISZERO PUSH2 0x180A JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x17F5 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 EQ PUSH2 0x1845 JUMPI PUSH2 0x1826 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1786 JUMPI INVALID JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1832 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1810 JUMP JUMPDEST POP POP PUSH2 0x7F5 PUSH2 0x1AAF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7B1 JUMPI PUSH1 0x0 SLOAD PUSH2 0x7B1 SWAP1 PUSH2 0xA6C SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2B9E JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE1A5430EBEC577336427F40F15822F1F36C5E3509FF209D6DB9E6C9E6941CB0B SWAP2 PUSH2 0x18E2 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH2 0x537B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH22 0x1000000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x196C PUSH1 0x1 SLOAD DUP6 PUSH2 0x26FD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1979 DUP5 DUP5 DUP4 PUSH2 0x2BBB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x1988 DUP2 DUP1 PUSH2 0x2C8F JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 DUP8 ADD MLOAD SWAP1 MLOAD PUSH1 0x60 SWAP2 ADDRESS SWAP2 PUSH2 0x19D6 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A11 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 0x1A16 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x1A2D JUMPI PUSH2 0x1A2D PUSH2 0xA6C DUP6 DUP4 PUSH2 0x2CF2 JUMP JUMPDEST PUSH2 0x1A38 DUP4 PUSH1 0x0 PUSH2 0x2C8F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 SWAP1 PUSH32 0xA4A7329F1DD821363067E07D359E347B4AF9B1EFE4B6CCCF13240228AF3C800D SWAP1 PUSH1 0x0 SWAP1 LOG2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH22 0x1000000000000000000000000000000000000000000 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH2 0x7B1 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1B0D JUMPI PUSH2 0x1B0D PUSH2 0xA6C PUSH2 0x2D43 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1B56 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x1B5F DUP3 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH2 0x1B6B DUP3 DUP3 PUSH2 0x2D7A JUMP JUMPDEST PUSH1 0x3 DUP2 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x1B7A JUMPI INVALID JUMPDEST EQ PUSH2 0x1B85 JUMPI POP PUSH2 0x843 JUMP JUMPDEST PUSH2 0xC50 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x2E29 JUMP JUMPDEST PUSH2 0x1B9B PUSH2 0x1931 JUMP JUMPDEST PUSH2 0x7B1 JUMPI PUSH2 0x7B1 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BEA JUMPI PUSH2 0x1BEA PUSH2 0xA6C PUSH1 0x2 DUP6 DUP6 PUSH2 0x2ED2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1BF8 PUSH2 0x456A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x9B44D55600000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x1C32 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A63 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x1CBA SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1CF5 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 0x1CFA JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x1D27 JUMPI DUP1 MLOAD PUSH1 0xA0 EQ PUSH2 0x1D10 JUMPI INVALID JUMPDEST DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x1D24 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4F30 JUMP JUMPDEST SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1D39 PUSH2 0x456A JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD PUSH2 0x1D4C SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1D67 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1D85 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1DA3 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD MLOAD SWAP1 DUP5 ADD MLOAD PUSH2 0x1DC1 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 DUP2 ISZERO PUSH2 0x1DF5 JUMPI DUP2 PUSH2 0x1DF7 JUMP JUMPDEST CALLER JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x4AD31275 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53A2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x1EB3 PUSH2 0x4599 JUMP JUMPDEST DUP6 MLOAD PUSH2 0x1EC6 JUMPI PUSH2 0x1EC6 PUSH2 0xA6C PUSH1 0x0 PUSH2 0x2F0D JUMP JUMPDEST DUP5 MLOAD PUSH2 0x1ED9 JUMPI PUSH2 0x1ED9 PUSH2 0xA6C PUSH1 0x1 PUSH2 0x2F0D JUMP JUMPDEST DUP4 MLOAD DUP7 MLOAD EQ PUSH2 0x1EEF JUMPI PUSH2 0x1EEF PUSH2 0xA6C PUSH1 0x2 PUSH2 0x2F0D JUMP JUMPDEST DUP3 MLOAD DUP6 MLOAD EQ PUSH2 0x1F05 JUMPI PUSH2 0x1F05 PUSH2 0xA6C PUSH1 0x3 PUSH2 0x2F0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F40 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1F2D PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1F25 JUMPI SWAP1 POP JUMPDEST POP DUP2 MSTORE DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE SWAP1 DUP1 ISZERO PUSH2 0x1F7E JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1F6B PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1F63 JUMPI SWAP1 POP JUMPDEST POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 DUP1 PUSH2 0x1F8F PUSH2 0x4617 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1F9C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1FAE PUSH2 0x4617 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1FBB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1FD0 DUP4 PUSH2 0x2839 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x0 PUSH2 0x1FDE DUP4 PUSH2 0x2839 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1FE9 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x1FF1 PUSH2 0x456A JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x202C DUP8 DUP8 DUP16 DUP13 DUP2 MLOAD DUP2 LT PUSH2 0x200A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP16 DUP13 DUP2 MLOAD DUP2 LT PUSH2 0x201E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP16 PUSH2 0x25F1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP2 POP PUSH2 0x2046 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST SWAP5 POP PUSH2 0x2063 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD DUP6 PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP PUSH2 0x2073 DUP4 DUP3 PUSH1 0x0 ADD MLOAD PUSH2 0x1D31 JUMP JUMPDEST SWAP3 POP PUSH2 0x2083 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1D31 JUMP JUMPDEST SWAP2 POP PUSH2 0x20A0 DUP2 PUSH1 0x40 ADD MLOAD DUP12 PUSH1 0x40 ADD MLOAD PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP12 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP12 ADD MLOAD PUSH2 0x20BE SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x60 DUP12 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD DUP6 LT PUSH2 0x2169 JUMPI DUP10 MLOAD DUP1 MLOAD PUSH1 0x1 DUP12 ADD SWAP11 DUP6 SWAP3 SWAP2 DUP2 LT PUSH2 0x20E2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP3 POP DUP15 MLOAD DUP10 EQ ISZERO PUSH2 0x2146 JUMPI DUP2 DUP11 PUSH1 0x20 ADD MLOAD DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x2135 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP POP PUSH2 0x2207 JUMP JUMPDEST DUP15 DUP10 DUP2 MLOAD DUP2 LT PUSH2 0x2152 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP7 POP PUSH2 0x2165 DUP8 PUSH2 0x2839 JUMP JUMPDEST SWAP6 POP POP JUMPDEST DUP6 PUSH1 0xA0 ADD MLOAD DUP5 LT PUSH2 0x2201 JUMPI DUP2 DUP11 PUSH1 0x20 ADD MLOAD DUP10 DUP1 PUSH1 0x1 ADD SWAP11 POP DUP2 MLOAD DUP2 LT PUSH2 0x218B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP2 POP DUP14 MLOAD DUP9 EQ ISZERO PUSH2 0x21DE JUMPI DUP3 DUP11 PUSH1 0x0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH2 0x2135 JUMPI INVALID JUMPDEST DUP14 DUP9 DUP2 MLOAD DUP2 LT PUSH2 0x21EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP6 POP PUSH2 0x21FD DUP7 PUSH2 0x2839 JUMP JUMPDEST SWAP5 POP POP JUMPDEST POP PUSH2 0x1FF1 JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB6B DUP4 PUSH2 0x224E PUSH2 0x2232 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH2 0x2242 DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2FDD AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2267 DUP5 DUP5 DUP5 PUSH2 0x3007 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH2 0x2294 JUMPI PUSH2 0x2294 PUSH2 0xA6C PUSH1 0x6 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x8 DUP2 DUP2 DUP2 GT ISZERO PUSH2 0x22A1 JUMPI INVALID JUMPDEST PUSH1 0xFF AND LT PUSH2 0x22B9 JUMPI PUSH2 0x22B9 PUSH2 0xA6C PUSH1 0x3 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x22C7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x4 DUP7 DUP7 DUP7 JUMPDEST PUSH1 0x60 PUSH4 0x7E5A2318 PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58BA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2391 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x23B8 JUMPI DUP2 MLOAD PUSH1 0x1 EQ PUSH2 0x23B0 JUMPI PUSH2 0x23B0 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x2 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x23C6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x24BF JUMPI DUP2 MLOAD PUSH1 0x42 EQ PUSH2 0x23E5 JUMPI PUSH2 0x23E5 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x23F4 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2411 DUP5 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2426 DUP6 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP9 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x244D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x560C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x246F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND SWAP2 AND EQ SWAP6 POP PUSH2 0xB6B SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x24CD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x257A JUMPI DUP2 MLOAD PUSH1 0x42 EQ PUSH2 0x24EC JUMPI PUSH2 0x24EC PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x24FB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x2518 DUP5 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x252D DUP6 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x3046 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2544 SWAP2 SWAP1 PUSH2 0x5329 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 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x244D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x560C JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2588 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x25A0 JUMPI PUSH2 0x2599 DUP5 DUP5 DUP5 PUSH2 0x3070 JUMP JUMPDEST SWAP1 POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x6 DUP6 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x25AE JUMPI INVALID JUMPDEST EQ PUSH2 0x25B5 JUMPI INVALID JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x25F9 PUSH2 0x45C1 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP8 ADD MLOAD PUSH2 0x140 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP8 ADD MLOAD SWAP1 DUP7 ADD MSTORE PUSH2 0x2619 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x2622 DUP8 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH2 0x262C PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x2635 DUP8 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2641 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH2 0x264F DUP10 DUP5 DUP4 DUP11 PUSH2 0x3266 JUMP JUMPDEST PUSH2 0x265B DUP9 DUP4 DUP4 DUP10 PUSH2 0x3266 JUMP JUMPDEST PUSH2 0x266F DUP10 DUP10 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x337E JUMP JUMPDEST PUSH2 0x2688 DUP10 DUP10 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x3 SLOAD GASPRICE DUP12 PUSH2 0x33C3 JUMP JUMPDEST SWAP4 POP PUSH2 0x26A3 DUP10 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x26BC DUP9 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x26D2 DUP4 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD DUP12 DUP12 DUP6 DUP10 PUSH2 0x35F6 JUMP JUMPDEST POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x18E4B141 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x589E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x966 DUP3 PUSH2 0x270C DUP6 PUSH2 0x379D JUMP JUMPDEST PUSH2 0x3825 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x2725 DUP6 DUP4 DUP7 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2735 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x2757 JUMPI PUSH2 0x2750 PUSH2 0x2748 DUP8 DUP8 PUSH2 0x385F JUMP JUMPDEST DUP7 DUP5 DUP8 PUSH2 0x3897 JUMP JUMPDEST SWAP3 POP PUSH2 0x278E JUMP JUMPDEST PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x2765 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x277F JUMPI PUSH2 0x2750 PUSH2 0x2778 DUP8 DUP8 PUSH2 0x385F JUMP JUMPDEST DUP4 DUP7 PUSH2 0x394B JUMP JUMPDEST PUSH2 0x278B DUP2 DUP7 DUP5 DUP8 PUSH2 0x2381 JUMP JUMPDEST SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x279F PUSH2 0x456A JUMP JUMPDEST PUSH2 0x27A7 PUSH2 0x45F5 JUMP JUMPDEST PUSH2 0x27B0 DUP6 PUSH2 0x1151 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27BC PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP PUSH2 0x27CA DUP7 DUP4 DUP4 DUP8 PUSH2 0x3266 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27E7 DUP4 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0xA0 ADD MLOAD PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27F5 DUP8 DUP4 PUSH2 0x395A JUMP JUMPDEST SWAP1 POP PUSH2 0x2805 DUP9 DUP3 PUSH1 0x3 SLOAD GASPRICE PUSH2 0x3970 JUMP JUMPDEST SWAP5 POP PUSH1 0x0 DUP5 PUSH1 0x20 ADD MLOAD SWAP1 POP PUSH2 0x2821 DUP10 DUP6 DUP4 DUP9 PUSH1 0x40 ADD MLOAD DUP11 PUSH2 0x3518 JUMP JUMPDEST PUSH2 0x282D DUP2 DUP11 DUP7 DUP10 PUSH2 0x39E7 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2851 PUSH1 0x1 SLOAD DUP5 PUSH2 0x286A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x966 DUP3 PUSH2 0x270C DUP6 PUSH2 0x3A7E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x288A DUP6 DUP4 DUP7 PUSH2 0x225A JUMP JUMPDEST SWAP1 POP PUSH1 0x5 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x289A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x28AD JUMPI PUSH2 0x2750 PUSH2 0x2748 DUP8 DUP8 PUSH2 0x3B55 JUMP JUMPDEST PUSH1 0x7 DUP2 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x28BB JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x277F JUMPI PUSH2 0x2750 PUSH2 0x2778 DUP8 DUP8 PUSH2 0x3B55 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2A8B JUMPI PUSH1 0x20 DUP5 MLOAD DUP2 PUSH2 0x28DF JUMPI INVALID JUMPDEST MOD PUSH1 0x4 EQ PUSH2 0x28F6 JUMPI PUSH2 0x28F6 PUSH2 0xA6C PUSH1 0x0 DUP8 DUP8 PUSH2 0x3B8D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2908 DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 PUSH2 0x2967 JUMPI PUSH2 0x2967 PUSH2 0xA6C PUSH1 0x1 DUP10 DUP10 PUSH2 0x3B8D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x29A3 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x24 ADD PUSH2 0x56B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x2A2B SWAP2 SWAP1 PUSH2 0x530D 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 0x2A68 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 0x2A6D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2A85 JUMPI PUSH2 0x2A85 PUSH2 0xA6C DUP12 DUP12 DUP5 PUSH2 0x3BF8 JUMP JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2A9A PUSH2 0x456A JUMP JUMPDEST PUSH2 0x2AA5 DUP5 DUP5 DUP5 PUSH2 0x2797 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x2 DUP6 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x26DE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x11C7B720 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5657 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x537B JUMP JUMPDEST DUP3 PUSH1 0x20 ADD MLOAD TIMESTAMP LT PUSH2 0x2BD4 JUMPI PUSH2 0x2BD4 PUSH2 0xA6C PUSH1 0x1 DUP4 PUSH2 0x3C17 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD GASPRICE DUP2 EQ PUSH2 0x2BEE JUMPI PUSH2 0x2BEE PUSH2 0xA6C DUP4 GASPRICE DUP5 PUSH2 0x3C34 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x2C1A JUMPI PUSH2 0x2C1A PUSH2 0xA6C DUP5 DUP4 PUSH2 0x3C53 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2C3F JUMPI PUSH2 0x2C3F PUSH2 0xA6C PUSH1 0x0 DUP6 PUSH2 0x3C17 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x2C72 JUMPI POP PUSH2 0x2C70 DUP7 DUP6 DUP8 PUSH2 0x2711 JUMP JUMPDEST ISZERO JUMPDEST ISZERO PUSH2 0x2C87 JUMPI PUSH2 0x2C87 PUSH2 0xA6C PUSH1 0x1 DUP7 DUP5 DUP10 PUSH2 0x22D9 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ PUSH2 0xC50 JUMPI PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x20D11F61 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5550 JUMP JUMPDEST SELFBALANCE DUP1 ISZERO PUSH2 0x843 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC50 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xC3B823F00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2DCE JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2DCE JUMPI PUSH2 0x2DCE PUSH2 0xA6C PUSH1 0x2 DUP4 PUSH1 0x20 ADD MLOAD CALLER PUSH2 0x3C70 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DD8 PUSH2 0x1DCC JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2E24 JUMPI PUSH2 0x2E24 PUSH2 0xA6C PUSH1 0x0 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH2 0x3C70 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0x2C310A9A43963FF31A754A4099CC435ED498049687539D72D7818D9B093415C SWAP3 PUSH2 0x2EC6 SWAP3 SWAP1 SWAP2 SWAP1 CALLER SWAP1 PUSH2 0x571A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x0 DUP7 DUP7 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xD4092F4F PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2F28 SWAP2 SWAP1 PUSH2 0x5832 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2FBB JUMPI POP PUSH1 0x0 PUSH2 0x7F5 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x2FC8 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x966 JUMPI PUSH2 0x966 PUSH2 0xA6C PUSH1 0x1 DUP7 DUP7 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x2FF3 JUMPI PUSH2 0x2FF3 PUSH2 0xA6C PUSH1 0x3 DUP6 DUP6 PUSH2 0x2ED2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x2FFE JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x3023 JUMPI PUSH2 0x3023 PUSH2 0xA6C PUSH1 0x2 DUP7 DUP7 DUP7 PUSH2 0x22D9 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP4 MLOAD SUB DUP2 MLOAD DUP2 LT PUSH2 0x3033 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB6B JUMPI INVALID JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3067 JUMPI PUSH2 0x3067 PUSH2 0xA6C PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x30A7 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 ADD PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x30DF SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x5550 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x316E DUP5 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x3197 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x31D2 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 0x31D7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x31EA JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x324C JUMPI PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 PUSH2 0x3221 DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ SWAP5 POP POP POP POP POP PUSH2 0x966 JUMP JUMPDEST PUSH2 0x325B PUSH2 0xA6C DUP10 DUP10 DUP10 DUP6 PUSH2 0x3CB2 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP4 MLOAD PUSH1 0x6 DUP2 GT ISZERO PUSH2 0x3275 JUMPI INVALID JUMPDEST EQ PUSH2 0x328F JUMPI PUSH2 0x328F PUSH2 0xA6C DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3CD3 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x32E3 JUMPI PUSH1 0x60 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x32E3 JUMPI PUSH2 0x32E3 PUSH2 0xA6C PUSH1 0x2 DUP6 PUSH1 0x20 ADD MLOAD CALLER PUSH2 0x3C70 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x334D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x334D JUMPI PUSH2 0x334D PUSH2 0xA6C PUSH1 0x1 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH2 0x3C70 JUMP JUMPDEST PUSH2 0x335C DUP5 DUP5 PUSH1 0x20 ADD MLOAD DUP4 PUSH2 0x2879 JUMP JUMPDEST PUSH2 0x3378 JUMPI PUSH2 0x3378 PUSH2 0xA6C PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP6 PUSH2 0x22D9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 DUP1 DUP5 ADD MLOAD SWAP1 DUP6 ADD MLOAD PUSH2 0x3397 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x80 DUP1 DUP6 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH2 0x33B0 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST LT ISZERO PUSH2 0x3378 JUMPI PUSH2 0x3378 PUSH2 0xA6C DUP4 DUP4 PUSH2 0x3CF0 JUMP JUMPDEST PUSH2 0x33CB PUSH2 0x45C1 JUMP JUMPDEST PUSH1 0xA0 DUP9 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x33E3 SWAP1 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x33FA DUP11 PUSH1 0x80 ADD MLOAD DUP12 PUSH1 0xA0 ADD MLOAD DUP5 PUSH2 0x3D0D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3415 DUP9 DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1BD1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x342C DUP12 PUSH1 0x80 ADD MLOAD DUP13 PUSH1 0xA0 ADD MLOAD DUP5 PUSH2 0x3D0D JUMP JUMPDEST SWAP1 POP DUP6 ISZERO PUSH2 0x3449 JUMPI PUSH2 0x3442 DUP13 DUP13 DUP6 DUP8 DUP6 DUP8 PUSH2 0x3D41 JUMP JUMPDEST SWAP5 POP PUSH2 0x345A JUMP JUMPDEST PUSH2 0x3457 DUP13 DUP13 DUP6 DUP8 DUP6 DUP8 PUSH2 0x3E13 JUMP JUMPDEST SWAP5 POP JUMPDEST DUP5 MLOAD MLOAD PUSH1 0x80 DUP14 ADD MLOAD PUSH1 0xC0 DUP15 ADD MLOAD PUSH2 0x3472 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 ADD MSTORE DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0xA0 DUP14 ADD MLOAD PUSH1 0xE0 DUP15 ADD MLOAD PUSH2 0x3493 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 MLOAD PUSH1 0x60 ADD MSTORE PUSH1 0x20 DUP6 ADD MLOAD MLOAD PUSH1 0x80 DUP13 ADD MLOAD PUSH1 0xC0 DUP14 ADD MLOAD PUSH2 0x34B4 SWAP3 SWAP2 SWAP1 PUSH2 0x3D0D JUMP JUMPDEST DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x34DC DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD DUP13 PUSH1 0xA0 ADD MLOAD DUP14 PUSH1 0xE0 ADD MLOAD PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x60 ADD MSTORE PUSH1 0x0 PUSH2 0x34F7 DUP9 DUP11 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST DUP7 MLOAD PUSH1 0x80 SWAP1 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x20 DUP9 ADD MLOAD ADD MSTORE POP POP POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x352E SWAP1 DUP4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2EF1 AND JUMP JUMPDEST PUSH1 0x9 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x6869791F0A34781B29882982CC39E882768CF2C96995C2A110C577C53BC932D5 DUP9 PUSH2 0x140 ADD MLOAD DUP10 PUSH2 0x160 ADD MLOAD DUP11 PUSH2 0x180 ADD MLOAD DUP12 PUSH2 0x1A0 ADD MLOAD DUP12 CALLER DUP11 PUSH1 0x0 ADD MLOAD DUP12 PUSH1 0x20 ADD MLOAD DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x60 ADD MLOAD DUP15 PUSH1 0x80 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x35E7 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5766 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST DUP4 MLOAD DUP4 MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD SWAP1 DUP7 ADD MLOAD PUSH2 0x140 DUP8 ADD MLOAD DUP6 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x361F SWAP2 DUP12 SWAP2 DUP7 SWAP1 DUP9 SWAP1 PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3639 DUP11 DUP10 PUSH2 0x140 ADD MLOAD DUP7 DUP7 DUP10 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3653 DUP10 DUP9 PUSH2 0x180 ADD MLOAD DUP6 DUP5 DUP10 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x366D DUP11 DUP10 PUSH2 0x180 ADD MLOAD DUP7 DUP6 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3683 DUP11 DUP10 PUSH2 0x140 ADD MLOAD DUP7 DUP10 DUP10 PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3699 DUP10 DUP9 PUSH2 0x140 ADD MLOAD DUP6 DUP10 DUP10 PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36B1 DUP12 DUP12 DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x80 ADD MLOAD DUP9 DUP9 DUP13 PUSH2 0x3EAC JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x36CE JUMPI DUP6 MLOAD PUSH1 0x0 PUSH1 0x80 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x20 DUP9 ADD MLOAD SWAP1 SWAP2 ADD MSTORE JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 ISZERO PUSH2 0x371E JUMPI POP PUSH2 0x1A0 DUP1 DUP10 ADD MLOAD SWAP1 DUP11 ADD MLOAD PUSH2 0x371E SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x3F08 AND JUMP JUMPDEST ISZERO PUSH2 0x375C JUMPI PUSH2 0x3757 DUP12 DUP11 PUSH2 0x1A0 ADD MLOAD DUP10 DUP7 PUSH2 0x3752 DUP12 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP13 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x2EF1 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3790 JUMP JUMPDEST PUSH2 0x3776 DUP11 DUP10 PUSH2 0x1A0 ADD MLOAD DUP10 DUP6 DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3790 DUP12 DUP11 PUSH2 0x1A0 ADD MLOAD DUP10 DUP7 DUP11 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 DUP2 ADD MLOAD DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD PUSH1 0x60 SWAP8 DUP9 ADD MLOAD DUP7 MLOAD SWAP7 DUP6 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP3 MLOAD PUSH32 0xEC69816980A3A3CA4554410E60253953E9FF375BA4536A98ADFA15CC71541508 DUP2 MSTORE SWAP5 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xDE047DB400000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x2AE2 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A8E JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x15 DUP2 LT ISZERO PUSH2 0x38B5 JUMPI PUSH2 0x38B5 PUSH2 0xA6C PUSH1 0x2 DUP8 DUP8 DUP8 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38E9 DUP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB DUP5 ADD PUSH4 0xFFFFFFFF PUSH2 0x3F2D AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x3933 JUMPI PUSH2 0x3933 PUSH2 0xA6C DUP7 DUP4 PUSH2 0x3F6D JUMP JUMPDEST PUSH2 0x3940 DUP2 DUP9 DUP7 PUSH1 0x15 PUSH2 0x3F8A JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB6B DUP4 DUP6 DUP5 PUSH1 0x1 PUSH2 0x3F8A JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x3969 JUMPI DUP2 PUSH2 0x966 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3978 PUSH2 0x456A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH2 0x3994 SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xC0 DUP7 ADD MLOAD PUSH2 0x39AB SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP6 ADD MLOAD PUSH1 0xE0 DUP7 ADD MLOAD PUSH2 0x39C5 SWAP2 DUP7 SWAP2 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x39DA DUP3 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x3A01 DUP5 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A1B DUP5 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A35 DUP5 DUP5 PUSH2 0x1A0 ADD MLOAD DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH2 0x3A53 DUP5 DUP5 PUSH2 0x180 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x28CE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A69 DUP6 DUP4 PUSH1 0x80 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH2 0x4161 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2A8B JUMPI PUSH1 0x0 PUSH1 0x80 DUP4 ADD MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH2 0x140 DUP2 ADD MLOAD PUSH2 0x160 DUP3 ADD MLOAD PUSH2 0x180 DUP4 ADD MLOAD PUSH2 0x1A0 DUP5 ADD MLOAD PUSH1 0x0 SWAP4 PUSH32 0xF80322EB8376AAFB64EADF8F0D7623F22130FD9491A221E902B713CB984A7534 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x20 DUP8 LT ISZERO PUSH2 0x3ACA JUMPI INVALID JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP8 ADD DUP1 MLOAD PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x160 DUP12 ADD DUP1 MLOAD PUSH2 0x180 DUP14 ADD DUP1 MLOAD PUSH2 0x1A0 DUP16 ADD DUP1 MLOAD SWAP14 DUP10 MSTORE DUP13 MLOAD PUSH1 0x20 SWAP14 DUP15 ADD KECCAK256 DUP8 MSTORE DUP12 MLOAD SWAP12 DUP14 ADD SWAP12 SWAP1 SWAP12 KECCAK256 DUP5 MSTORE DUP10 MLOAD SWAP10 DUP13 ADD SWAP10 SWAP1 SWAP10 KECCAK256 DUP2 MSTORE DUP8 MLOAD SWAP8 SWAP1 SWAP11 ADD SWAP7 SWAP1 SWAP7 KECCAK256 DUP9 MSTORE PUSH2 0x1E0 DUP6 KECCAK256 SWAP4 SWAP1 SWAP5 MSTORE SWAP1 MSTORE SWAP2 SWAP1 MSTORE SWAP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x3EFE50C800000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x2AE2 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x5A41 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x488219A6 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x580A JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3BCD JUMPI PUSH2 0x3BCD PUSH2 0xA6C PUSH1 0x3 DUP6 MLOAD DUP6 PUSH1 0x4 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x4678472B PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5569 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xF5985184 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x58FE JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA26DAC09 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55F6 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDEC4AEDF PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x54D7 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE53C76C8 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5866 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58AC JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1B8388F7 PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54FB JUMP JUMPDEST PUSH1 0x60 PUSH4 0xFDB6CA8D PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5594 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB6555D6F PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x5542 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D1A DUP5 DUP5 DUP5 PUSH2 0x41A6 JUMP JUMPDEST ISZERO PUSH2 0x3D2D JUMPI PUSH2 0x3D2D PUSH2 0xA6C DUP6 DUP6 DUP6 PUSH2 0x420C JUMP JUMPDEST PUSH2 0xB6B DUP4 PUSH2 0x224E DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH2 0x3D49 PUSH2 0x45C1 JUMP JUMPDEST DUP2 DUP6 GT DUP5 DUP5 GT DUP5 DUP7 GT ISZERO PUSH2 0x3D69 JUMPI PUSH2 0x3D62 DUP10 DUP7 DUP7 PUSH2 0x422B JUMP JUMPDEST SWAP3 POP PUSH2 0x3DB8 JUMP JUMPDEST DUP7 DUP5 GT ISZERO PUSH2 0x3DA9 JUMPI DUP3 MLOAD DUP8 SWAP1 MSTORE DUP3 MLOAD PUSH1 0x20 ADD DUP7 SWAP1 MSTORE PUSH1 0x80 DUP9 ADD MLOAD PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x3D93 SWAP2 SWAP1 DUP10 PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD DUP1 MLOAD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 MLOAD ADD DUP8 SWAP1 MSTORE PUSH2 0x3DB8 JUMP JUMPDEST PUSH2 0x3DB5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x4268 JUMP JUMPDEST SWAP3 POP JUMPDEST DUP2 ISZERO PUSH2 0x3DDE JUMPI PUSH1 0x20 DUP1 DUP5 ADD MLOAD ADD MLOAD DUP4 MLOAD MLOAD PUSH2 0x3DD8 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x40 DUP5 ADD MSTORE JUMPDEST DUP1 ISZERO PUSH2 0x3E06 JUMPI DUP3 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP1 DUP5 ADD MLOAD MLOAD PUSH2 0x3E00 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE JUMPDEST POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3E1B PUSH2 0x45C1 JUMP JUMPDEST DUP3 DUP5 GT ISZERO PUSH2 0x3E35 JUMPI PUSH2 0x3E2E DUP8 DUP5 DUP5 PUSH2 0x422B JUMP JUMPDEST SWAP1 POP PUSH2 0x3E83 JUMP JUMPDEST DUP3 DUP5 LT ISZERO PUSH2 0x3E74 JUMPI DUP1 MLOAD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD DUP6 SWAP1 MSTORE DUP2 ADD MLOAD DUP5 SWAP1 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x3E67 SWAP2 SWAP1 DUP7 PUSH2 0x4293 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD MLOAD ADD MSTORE PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x3E80 DUP6 DUP6 DUP6 DUP6 PUSH2 0x4268 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD ADD MLOAD DUP2 MLOAD MLOAD PUSH2 0x3E9D SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x3EFE JUMPI SELFBALANCE PUSH1 0x0 PUSH2 0x3EDF DUP11 DUP5 DUP5 DUP12 DUP12 DUP11 PUSH2 0x42CB JUMP JUMPDEST SWAP1 POP PUSH2 0x3EF1 DUP10 DUP5 DUP4 DUP6 SUB DUP12 DUP11 DUP11 PUSH2 0x42CB JUMP JUMPDEST POP PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x966 JUMPI POP POP DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH2 0x3F4E JUMPI PUSH2 0x3F4E PUSH2 0xA6C PUSH1 0x4 DUP6 MLOAD DUP6 PUSH1 0x14 ADD PUSH2 0x3C8F JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA15C0D06 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2AE2 SWAP3 SWAP2 SWAP1 PUSH2 0x537B JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x3FA1 DUP5 DUP5 DUP4 SUB PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x3FD9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x56F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0x4068 DUP6 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x3CAE AND JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x4091 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40CC 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 0x40D1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x40E4 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST ISZERO PUSH2 0x4146 JUMPI PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 PUSH2 0x411B DUP3 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x3BAC AND JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ SWAP5 POP POP POP POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH2 0x4155 PUSH2 0xA6C DUP11 DUP11 DUP11 DUP6 PUSH2 0x4403 JUMP JUMPDEST POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO PUSH2 0x419C JUMPI PUSH2 0x4191 DUP7 DUP3 SELFBALANCE DUP9 DUP9 DUP9 PUSH2 0x42CB JUMP JUMPDEST POP PUSH1 0x1 SWAP2 POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0xB6B JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x41B8 JUMPI PUSH2 0x41B8 PUSH2 0xA6C PUSH2 0x4424 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x41C3 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x41D0 JUMPI POP PUSH1 0x0 PUSH2 0x966 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x41DA JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x41EF DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH2 0x4201 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1E1D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55F6 JUMP JUMPDEST PUSH2 0x4233 PUSH2 0x45C1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD DUP1 MLOAD DUP6 SWAP1 MSTORE MLOAD DUP2 ADD DUP4 SWAP1 MSTORE DUP2 MLOAD ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 DUP6 ADD MLOAD PUSH2 0x425E SWAP2 SWAP1 DUP6 PUSH2 0x3D0D JUMP JUMPDEST DUP2 MLOAD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4270 PUSH2 0x45C1 JUMP JUMPDEST DUP1 MLOAD SWAP5 SWAP1 SWAP5 MSTORE DUP4 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP3 DUP5 ADD DUP1 MLOAD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 MLOAD SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x42A0 DUP5 DUP5 DUP5 PUSH2 0x445B JUMP JUMPDEST ISZERO PUSH2 0x42B3 JUMPI PUSH2 0x42B3 PUSH2 0xA6C DUP6 DUP6 DUP6 PUSH2 0x420C JUMP JUMPDEST PUSH2 0xB6B DUP4 PUSH2 0x224E PUSH2 0x2232 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP6 LT PUSH2 0x42D7 JUMPI POP DUP3 JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA3B4A32700000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x4311 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x24 ADD PUSH2 0x53A2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x439A SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x43D7 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 0x43DC JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x43F6 JUMPI PUSH2 0x43F6 PUSH2 0xA6C DUP12 DUP10 DUP10 DUP10 DUP7 PUSH2 0x44BF JUMP JUMPDEST POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5BD0428D PUSH1 0xE0 SHL DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x22FA SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xA791837C00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x446D JUMPI PUSH2 0x446D PUSH2 0xA6C PUSH2 0x4424 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x4478 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x4485 JUMPI POP PUSH1 0x0 PUSH2 0x966 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x448F JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP DUP4 PUSH2 0x44A5 DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST DUP2 PUSH2 0x44AC JUMPI INVALID JUMPDEST MOD SWAP1 POP PUSH2 0x41EF DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2FAC AND JUMP JUMPDEST PUSH1 0x60 PUSH4 0x87CB1E75 PUSH1 0xE0 SHL DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x44E2 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55B1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x45D4 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x45E1 PUSH2 0x456A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x7F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4712 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4725 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST PUSH2 0x5AF8 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4746 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x476D JUMPI PUSH2 0x475B DUP9 DUP4 PUSH2 0x46DE JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4749 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4788 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4796 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47D3 JUMPI PUSH2 0x47BE DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x47A6 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x47ED JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x47FB PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 ADD PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47D3 JUMPI PUSH2 0x4823 DUP8 PUSH1 0x20 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x491D JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x480B JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4848 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4856 PUSH2 0x4720 DUP3 PUSH2 0x5B1F JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4877 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x476D JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x487A JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x48A6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x48BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48ED PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x5AF8 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x4904 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4930 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4939 DUP2 PUSH2 0x5AF8 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x4946 DUP4 DUP4 PUSH2 0x46DE JUMP JUMPDEST DUP2 MSTORE PUSH2 0x4955 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x4967 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x4979 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP3 ADD CALLDATALOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP PUSH2 0x140 DUP1 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x49DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x49E7 DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x160 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A0F DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x180 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A37 DUP7 DUP4 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST DUP4 DUP6 ADD MSTORE PUSH2 0x1A0 SWAP3 POP DUP3 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4A53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4A60 DUP6 DUP3 DUP7 ADD PUSH2 0x4896 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4A7D JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4A87 PUSH1 0xA0 PUSH2 0x5AF8 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH2 0x4AAF DUP2 PUSH2 0x5B89 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4ACE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4ADA DUP5 DUP3 DUP6 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4AF7 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x966 DUP4 DUP4 PUSH2 0x46DE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B13 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4B1D DUP5 DUP5 PUSH2 0x46DE JUMP JUMPDEST SWAP2 POP PUSH2 0x4B2C DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x46DE JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4B47 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4B51 DUP5 DUP5 PUSH2 0x46DE JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x4B65 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4B85 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4B9C JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BA8 DUP9 DUP4 DUP10 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BBD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BC9 DUP9 DUP4 DUP10 ADD PUSH2 0x4702 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BDE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4BEA DUP9 DUP4 DUP10 ADD PUSH2 0x4702 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4BFF JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4838 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4C29 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4C3F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB6B DUP5 DUP3 DUP6 ADD PUSH2 0x47DD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4C60 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4C77 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4C83 DUP9 DUP4 DUP10 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4C98 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4CA4 DUP9 DUP4 DUP10 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4CB9 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4CC5 DUP9 DUP4 DUP10 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4CDA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4778 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4CFB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D12 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4D1E DUP8 DUP4 DUP9 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D33 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4D3F DUP8 DUP4 DUP9 ADD PUSH2 0x4838 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D54 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4D7F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4D96 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4DA2 DUP8 DUP4 DUP9 ADD PUSH2 0x47DD JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4D54 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4DD0 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4DE7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x4DF8 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP PUSH2 0x4E08 PUSH2 0x4720 DUP5 PUSH2 0x5B1F JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP2 SWAP1 DUP4 DUP2 ADD DUP9 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x4E40 JUMPI PUSH2 0x4E2E DUP13 DUP5 DUP5 CALLDATALOAD DUP10 ADD ADD PUSH2 0x4A6C JUMP JUMPDEST DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4E17 JUMP JUMPDEST POP SWAP2 SWAP8 POP DUP9 ADD CALLDATALOAD SWAP5 POP POP POP POP DUP1 DUP3 GT ISZERO PUSH2 0x4E58 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E65 DUP6 DUP3 DUP7 ADD PUSH2 0x4778 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4E80 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E99 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4B65 DUP2 PUSH2 0x5B89 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4EBF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4ED1 DUP2 PUSH2 0x5B89 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4EEC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F09 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x966 DUP2 PUSH2 0x5BAB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F25 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x966 DUP2 PUSH2 0x5BAB JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F41 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4F4B PUSH1 0xA0 PUSH2 0x5AF8 JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F92 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FA8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB6B DUP5 DUP3 DUP6 ADD PUSH2 0x491D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4FC6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4FDD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4FE9 DUP7 DUP4 DUP8 ADD PUSH2 0x491D JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4FFE JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E65 DUP6 DUP3 DUP7 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5020 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5037 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5043 DUP9 DUP4 DUP10 ADD PUSH2 0x491D JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x5058 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5064 DUP9 DUP4 DUP10 ADD PUSH2 0x491D JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x5079 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x5085 DUP9 DUP4 DUP10 ADD PUSH2 0x4896 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x509A JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4C0C DUP8 DUP3 DUP9 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50BB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x50D2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x50DE DUP8 DUP4 DUP9 ADD PUSH2 0x491D JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x50FA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4D61 DUP7 DUP3 DUP8 ADD PUSH2 0x4896 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5119 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x5130 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4FE9 DUP7 DUP4 DUP8 ADD PUSH2 0x4A6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP4 ADD DUP3 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5192 JUMPI PUSH2 0x517C DUP7 DUP4 MLOAD PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0xA0 SWAP6 SWAP1 SWAP6 ADD SWAP5 PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5169 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x51B4 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5B3F JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1C0 PUSH2 0x5226 DUP5 DUP5 MLOAD PUSH2 0x513C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x5238 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x524B PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x525E PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x513C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0x52B7 DUP4 DUP8 ADD DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x52D4 DUP3 DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x180 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x52F0 DUP4 DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1A0 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0x3E09 DUP3 DUP3 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x531F DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5B3F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE PUSH1 0x1C DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3C ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP3 MSTORE PUSH1 0x80 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5402 PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x5414 DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x5426 DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP1 DUP6 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 POP PUSH1 0x40 DUP5 DUP3 MUL DUP8 ADD ADD SWAP3 POP DUP4 DUP8 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x54A3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP9 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x5491 DUP6 DUP4 MLOAD PUSH2 0x519C JUMP JUMPDEST SWAP5 POP SWAP3 DUP6 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5457 JUMP JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x966 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5156 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x5530 PUSH1 0x80 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3940 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xB6B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 DUP5 DUP3 MSTORE PUSH1 0x60 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x5582 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x3E09 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 DUP2 ADD PUSH2 0x55A4 DUP4 PUSH2 0x5B7F JUMP JUMPDEST DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP7 DUP3 MSTORE DUP6 PUSH1 0x20 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP6 AND PUSH1 0x60 DUP5 ADD MSTORE POP PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x3940 PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x966 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x56C5 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x519C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP4 SWAP1 SWAP5 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x5708 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xE1A DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x572D PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x519C JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x573F DUP2 DUP7 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP1 DUP4 MSTORE PUSH2 0x577A DUP2 DUP5 ADD DUP16 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x20 DUP6 ADD MSTORE PUSH2 0x578C DUP2 DUP16 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x57A1 DUP2 DUP14 PUSH2 0x519C JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x57B3 DUP2 DUP14 PUSH2 0x519C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP12 DUP13 AND PUSH1 0x80 DUP7 ADD MSTORE SWAP10 SWAP1 SWAP11 AND PUSH1 0xA0 DUP5 ADD MSTORE POP POP PUSH1 0xC0 DUP2 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0xE0 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH2 0x100 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x120 DUP4 ADD MSTORE PUSH2 0x140 SWAP1 SWAP2 ADD MSTORE SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5815 DUP6 PUSH2 0x5B6B JUMP JUMPDEST DUP5 DUP3 MSTORE DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xE1A PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x583F DUP4 PUSH2 0x5B75 JUMP JUMPDEST SWAP2 SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x5852 DUP6 PUSH2 0x5B75 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x3 DUP6 LT PUSH2 0x5874 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x3 DUP6 LT PUSH2 0x5852 JUMPI INVALID JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x5852 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH2 0x58C5 DUP7 PUSH2 0x5B7F JUMP JUMPDEST DUP6 DUP3 MSTORE DUP5 PUSH1 0x20 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x3E09 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x590B DUP5 PUSH2 0x5B6B JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x5452414E53464552535F5355434345535346554C000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x5968 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x5156 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x59A3 DUP2 DUP4 PUSH2 0x5156 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x80 DUP7 ADD MSTORE DUP1 SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x7F5 DUP3 DUP5 PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 ADD SWAP1 POP PUSH2 0x59E5 DUP3 DUP5 MLOAD PUSH2 0x51E6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x59F7 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x51E6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x140 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD MLOAD PUSH2 0x160 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x60 DUP3 ADD SWAP1 PUSH2 0x5A23 DUP2 PUSH2 0x5B7F JUMP JUMPDEST DUP1 DUP4 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE PUSH2 0x5A54 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x5216 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0x5A76 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0x5216 JUMP JUMPDEST DUP5 PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x3E09 DUP2 DUP6 PUSH2 0x519C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 MSTORE DUP4 MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x60 DUP6 ADD MLOAD AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0xA0 PUSH1 0xC0 DUP5 ADD MSTORE PUSH2 0x5AE8 PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x519C JUMP JUMPDEST SWAP2 POP POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5B17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5B35 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5B5A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5B42 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x3378 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH1 0x7 DUP2 LT PUSH2 0x843 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x843 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x843 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x20 SWAP5 DUP6 ADD KECCAK256 DUP4 MLOAD SWAP4 DUP6 ADD SWAP4 SWAP1 SWAP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP2 MSTORE SWAP6 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 SWAP1 KECCAK256 SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 EQ 0xD0 0xC4 0xC0 MLOAD 0xBC PUSH12 0xD0373E742AEADD0F096942BA SIGNEXTEND 0xB0 0xC3 0x2D PUSH32 0xA567C4419076DFD96C6578706572696D656E74616CF564736F6C634300051100 BLOCKHASH ",
"sourceMap": "1057:384:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1508:53:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1508:53:6;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2236:137:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2236:137:4;;;:::i;:::-;;1091:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1091:36:4;;;:::i;:::-;;;;;;;;2020:296:6;;;;;;;;;:::i;:::-;;;;;;;;1843:42:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1843:42:2;;;;;;;;:::i;2019:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2019:42:2;;;;;;;;:::i;4971:157::-;;;;;;;;;:::i;5783:1239:8:-;;;;;;;;;:::i;:::-;;;;;;;;2529:219:5;;;;;;;;;:::i;2822:1260:2:-;;;;;;;;;:::i;2299:166:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2299:166:1;;;;;;;;:::i;:::-;;;;;;;;3083:549:3;;;;;;;;;:::i;:::-;;;;;;;;1847:535;;;;;;;;;:::i;3035:444:5:-;;;;;;;;;:::i;7573:1652:8:-;;;;;;;;;:::i;2265:71:5:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2265:71:5;;;;;;;;:::i;3831:1003::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3831:1003:5;;;;;;;;:::i;1972:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1972:63:5;;;;;;;;:::i;1299:35:4:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1299:35:4;;;:::i;4361:499:3:-;;;;;;;;;:::i;:::-;;;;;;;;10891:705:8;;;;;;;;;:::i;5787:472:5:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5787:472:5;;;;;;;;:::i;827:20:56:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;827:20:56;;;:::i;4564:669:8:-;;;;;;;;;:::i;:::-;;;;;;;;1491:269:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1491:269:4;;;;;;;;:::i;2438:661:8:-;;;;;;;;;:::i;4411:422:2:-;;;;;;;;;:::i;5402:2305::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5402:2305:2;;;;;;;;:::i;:::-;;;;;;;;5096:406:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5096:406:5;;;;;;;;:::i;9704:708:8:-;;;;;;;;;:::i;1676:696:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:696:7;;;;;;;;:::i;5507:513:3:-;;;;;;;;;:::i;3471:673:8:-;;;;;;;;;:::i;1934:193:4:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1934:193:4;;;;;;;;:::i;1066:42:37:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1066:42:37;;;:::i;1390:700:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1390:700:1;;;;;;;;:::i;2431:67:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2431:67:2;;;;;;;;:::i;729:55:49:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;729:55:49;;;:::i;:::-;;;;;;;;11708:284:8;;;;;;;;;:::i;1638:434::-;;;;;;;;;:::i;1695:36:6:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1695:36:6;;;:::i;1097:329:56:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1097:329:56;;;;;;;;:::i;2681:515:6:-;;;;;;;;;:::i;:::-;;;;;;;;1508:53;;;;;;;;;;;;;;;:::o;2236:137:4:-;960:22:56;:20;:22::i;:::-;2323:43:4;2363:1;2323:31;:43::i;:::-;2236:137::o;1091:36::-;;;;:::o;2020:296:6:-;2231:12;1123:21:58;:19;:21::i;:::-;1119:161;;;2266:43:6;2286:11;2299:9;2266:19;:43::i;:::-;2259:50;;1119:161:58;;;1192:16;:14;:16::i;:::-;2266:43:6;2286:11;2299:9;2266:19;:43::i;:::-;2259:50;;1237:32:58;:30;:32::i;:::-;2020:296:6;;;;:::o;1843:42:2:-;;;;;;;;;;;;;:::o;2019:::-;;;;;;;;;;;;;;;:::o;4971:157::-;954:34:58;:32;:34::i;:::-;5102:19:2;5115:5;5102:12;:19::i;:::-;1009:32:58;:30;:32::i;:::-;1051:14;:12;:14::i;:::-;4971:157:2;:::o;5783:1239:8:-;6013:45;;:::i;:::-;1123:21:58;:19;:21::i;:::-;1119:161;;;6097:13:8;;6074:20;6120:868;6145:12;6140:1;:17;6120:868;;6247:37;6287:64;6316:11;:34;;;6287:20;:28;;:64;;;;:::i;:::-;6247:104;;6432:51;;:::i;:::-;6486:136;6521:6;6528:1;6521:9;;;;;;;;;;;;;;6548:29;6595:10;6606:1;6595:13;;;;;;;;;;;;;;6486:17;:136::i;:::-;6432:190;;6721:61;6751:11;6764:17;6721:29;:61::i;:::-;6707:75;;6918:20;6880:11;:34;;;:58;6876:102;;6958:5;;;;6876:102;-1:-1:-1;;6159:3:8;;6120:868;;;-1:-1:-1;;1119:161:58;;;1192:16;:14;:16::i;:::-;6097:13:8;;6074:20;6120:868;6145:12;6140:1;:17;6120:868;;6247:37;6287:64;6316:11;:34;;;6287:20;:28;;:64;;;;:::i;:::-;6247:104;;6432:51;;:::i;:::-;6486:136;6521:6;6528:1;6521:9;;;;;;;6486:136;6432:190;;6721:61;6751:11;6764:17;6721:29;:61::i;:::-;6707:75;;6918:20;6880:11;:34;;;:58;6876:102;;6958:5;;;;6876:102;-1:-1:-1;;6159:3:8;;6120:868;;;-1:-1:-1;;1237:32:58;:30;:32::i;:::-;5783:1239:8;;;;;:::o;2529:219:5:-;954:34:58;:32;:34::i;:::-;2643:21:5;2667:27;:25;:27::i;:::-;2704:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;:37;;;;2737:4;2704:37;;;-1:-1:-1;1009:32:58;:30;:32::i;2822:1260:2:-;954:34:58;:32;:34::i;:::-;2957:20:2;2980:27;:25;:27::i;:::-;2957:50;-1:-1:-1;3265:26:2;3294;;;3310:10;3294:26;:52;;3336:10;3294:52;;;3331:1;3294:52;3512:24;;;;3434:21;3512:24;;;:10;:24;;;;;;;;:44;;;;;;;;;;3265:81;;-1:-1:-1;3477:1:2;3458:20;;;3628:30;;;3624:232;;3674:171;3696:148;3751:12;3781:18;3817:13;3696:37;:148::i;:::-;3674:21;:171::i;:::-;3895:24;;;;;;;;:10;:24;;;;;;;;:44;;;;;;;;;;;;;;:60;;;3970:105;;;;;3942:13;;3970:105;;;;;;;;;;998:1:58;;;;1009:32;:30;:32::i;2299:166:1:-;2431:27;;;2390:18;2431:27;;;:13;:27;;;;;;;;2299:166;;;;:::o;3083:549:3:-;3382:69;;:::i;:::-;954:34:58;:32;:34::i;:::-;3474:151:3;3505:10;3529:11;3554:14;3582:15;3611:4;3474:17;:151::i;:::-;3467:158;;1009:32:58;:30;:32::i;:::-;1051:14;:12;:14::i;:::-;3083:549:3;;;;;;:::o;1847:535::-;2131:69;;:::i;:::-;954:34:58;:32;:34::i;:::-;2223:152:3;2254:10;2278:11;2303:14;2331:15;2360:5;2223:17;:152::i;3035:444:5:-;954:34:58;:32;:34::i;:::-;3220:21:5;3244:27;:25;:27::i;:::-;3281:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;;:61;;;;;;;;;;3357:115;3281:32;;-1:-1:-1;3281:50:5;;3357:115;;;;3281:61;;3357:115;;;;;;;;;;998:1:58;1009:32;:30;:32::i;:::-;1051:14;:12;:14::i;:::-;3035:444:5;;:::o;7573:1652:8:-;7802:45;;:::i;:::-;1123:21:58;:19;:21::i;:::-;1119:161;;;7886:13:8;;7863:20;7909:1282;7934:12;7929:1;:17;7909:1282;;8104:34;;8035:37;;8075:64;;:20;;:64;:28;:64;:::i;:::-;8035:104;;8335:37;8375:177;8421:6;8428:1;8421:9;;;;;;;;;;;;;;:26;;;8465:6;8472:1;8465:9;;;;;;;;;;;;;;:26;;;8509:29;8375:28;:177::i;:::-;8335:217;;8633:51;;:::i;:::-;8687:136;8722:6;8729:1;8722:9;;;;;;;;;;;;;;8749:29;8796:10;8807:1;8796:13;;;;;;;8687:136;8633:190;;8922:61;8952:11;8965:17;8922:29;:61::i;:::-;8908:75;;9121:20;9083:11;:34;;;:58;9079:102;;9161:5;;;;;9079:102;-1:-1:-1;;;7948:3:8;;7909:1282;;1119:161:58;1192:16;:14;:16::i;:::-;7886:13:8;;7863:20;7909:1282;7934:12;7929:1;:17;7909:1282;;8104:34;;8035:37;;8075:64;;:20;;:64;:28;:64;:::i;:::-;8035:104;;8335:37;8375:177;8421:6;8428:1;8421:9;;;;;;;8375:177;8335:217;;8633:51;;:::i;:::-;8687:136;8722:6;8729:1;8722:9;;;;;;;8687:136;8633:190;;8922:61;8952:11;8965:17;8922:29;:61::i;:::-;8908:75;;9121:20;9083:11;:34;;;:58;9079:102;;9161:5;;;;;9079:102;-1:-1:-1;;;7948:3:8;;7909:1282;;2265:71:5;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3831:1003::-;3997:12;4025:27;4055:101;4092:4;4110:13;4137:9;4055:23;:101::i;:::-;4025:131;-1:-1:-1;4292:23:5;4275:13;:40;;;;;;;;;:100;;;-1:-1:-1;4348:27:5;4331:13;:44;;;;;;;;;4275:100;4258:394;;;4400:241;4422:218;4476:70;4564:4;4586:13;4617:9;4422:36;:218::i;4400:241::-;4671:132;4712:13;4739:4;4757:13;4784:9;4671:27;:132::i;:::-;4661:142;3831:1003;-1:-1:-1;;;;;3831:1003:5:o;1972:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1299:35:4:-;;;;;;:::o;4361:499:3:-;4628:59;;:::i;:::-;954:34:58;:32;:34::i;:::-;4710:143:3;4736:9;4759:10;4783:13;4810:14;4838:5;4710:12;:143::i;10891:705:8:-;11093:45;;:::i;:::-;11168:64;11191:6;11199:20;11221:10;11168:22;:64::i;:::-;11154:78;;11283:20;11246:11;:34;;;:57;11242:348;;;11319:260;11341:237;11400:74;11492:20;11530:11;:34;;;11341:41;:237::i;5787:472:5:-;5974:12;6002:23;6028:57;6057:27;;6028:11;:28;;:57;;;;:::i;:::-;6002:83;;6105:123;6155:11;6180:15;6209:9;6105:36;:123::i;827:20:56:-;;;;;;:::o;4564:669:8:-;4803:47;1123:21:58;:19;:21::i;:::-;1119:161;;;4889:13:8;;4926:46;;;;;;;;;;;;;;;;4889:13;4926:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;4912:60:8;-1:-1:-1;4987:9:8;4982:217;5007:12;5002:1;:17;4982:217;;5057:131;5092:6;5099:1;5092:9;;;;;;;;;;;;;;5119:21;5141:1;5119:24;;;;;;;;;;;;;;5161:10;5172:1;5161:13;;;;;;;5057:131;5040:11;5052:1;5040:14;;;;;;;;;;;;;;;;;:148;5021:3;;4982:217;;1119:161:58;1192:16;:14;:16::i;:::-;4889:13:8;;4926:46;;;;;;;;;;;;;;;;4889:13;4926:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;4912:60:8;-1:-1:-1;4987:9:8;4982:217;5007:12;5002:1;:17;4982:217;;5057:131;5092:6;5099:1;5092:9;;;;;;;5057:131;5040:11;5052:1;5040:14;;;;;;;;;;;;;;;;;:148;5021:3;;4982:217;;1491:269:4;960:22:56;:20;:22::i;:::-;1617:74:4;1639:21;;1662:28;1617:74;;;;;;;;;;;;;;;;1701:21;:52;1491:269::o;2438:661:8:-;2676:47;954:34:58;:32;:34::i;:::-;2762:13:8;;2799:46;;;;;;;;;;;;;;;;2762:13;2799:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;2785:60:8;-1:-1:-1;2860:9:8;2855:210;2880:12;2875:1;:17;2855:210;;2930:124;2958:6;2965:1;2958:9;;;;;;;;;;;;;;2985:21;3007:1;2985:24;;;;;;;;;;;;;;3027:10;3038:1;3027:13;;;;;;;;;;;;;;2930:10;:124::i;:::-;2913:11;2925:1;2913:14;;;;;;;;;;;;;;;;;:141;2894:3;;2855:210;;;-1:-1:-1;;1009:32:58;:30;:32::i;:::-;1051:14;:12;:14::i;4411:422:2:-;4627:45;;:::i;:::-;954:34:58;:32;:34::i;:::-;4702:96:2;4726:5;4745:20;4779:9;4702:10;:96::i;:::-;4688:110;-1:-1:-1;1009:32:58;:30;:32::i;5402:2305:2:-;5498:35;;:::i;:::-;5710;5739:5;5710:28;:35::i;:::-;5669:37;;;5647:98;5648:19;;;5647:98;6047:22;;;;6043:159;;6090:9;6114:47;6090:71;;;;;;;;;;;;;-1:-1:-1;6175:16:2;;6043:159;6515:22;;;;6511:159;;6558:9;6582:47;6558:71;;6511:159;6764:5;:22;;;6723:9;:37;;;:63;6719:181;;6802:9;6826:33;6802:57;;6719:181;7024:5;:27;;;7005:15;:46;7001:159;;7067:9;7091:28;7067:52;;7001:159;7229:19;;;;;7219:30;;;;:9;:30;;;;;;;;;7215:145;;;7265:9;7289:30;7265:54;;7215:145;7427:10;;;;7384:18;;7373:30;;;;;;;;:10;:30;;;;;;;;7404:19;;;;7373:51;;;;;;;;;;:64;7369:179;;;7453:9;7477:30;7453:54;;7369:179;7645:29;7621:53;;:9;5402:2305;-1:-1:-1;5402:2305:2:o;5096:406:5:-;5247:12;5275:17;5295:51;5318:27;;5295:5;:22;;:51;;;;:::i;:::-;5275:71;;5366:105;5410:5;5429:9;5452;5366:30;:105::i;9704:708:8:-;9907:45;;:::i;:::-;9982:65;10006:6;10014:20;10036:10;9982:23;:65::i;:::-;9968:79;;10098:20;10061:11;:34;;;:57;10057:349;;;10134:261;10156:238;10215:75;10308:20;10346:11;:34;;;10156:41;:238::i;1676:696:7:-;1917:16;;1900:14;1943:383;1968:6;1963:1;:11;1943:383;;1995:320;2175:1;2167:10;;2195:9;2205:1;2195:12;;;;;;;;;;;;;;2225:13;2239:1;2225:16;;;;;;;;;;;;;;2259:11;2271:1;2259:14;;;;;;;;;;;;;;2291:7;2299:1;2291:10;;;;;;;;;;;;;;1995:21;:320::i;:::-;1976:3;;1943:383;;;;2335:30;;;;;;;;;;;;;;;;;;;5507:513:3;5789:59;;:::i;:::-;954:34:58;:32;:34::i;:::-;5871:142:3;5897:9;5920:10;5944:13;5971:14;5999:4;5871:12;:142::i;3471:673:8:-;3715:47;954:34:58;:32;:34::i;:::-;3801:13:8;;3838:46;;;;;;;;;;;;;;;;3801:13;3838:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;3824:60:8;-1:-1:-1;3899:9:8;3894:216;3919:12;3914:1;:17;3894:216;;3969:130;4003:6;4010:1;4003:9;;;;;;;;;;;;;;4030:21;4052:1;4030:24;;;;;;;;;;;;;;4072:10;4083:1;4072:13;;;;;;;;;;;;;;3969:16;:130::i;:::-;3952:11;3964:1;3952:14;;;;;;;;;;;;;;;;;:147;3933:3;;3894:216;;1934:193:4;960:22:56;:20;:22::i;:::-;2060:60:4;2092:27;2060:31;:60::i;1066:42:37:-;;;;:::o;1390:700:1:-;960:22:56;:20;:22::i;:::-;1549:19:1;1583:10;1571:34;;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1571:36:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1571:36:1;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1571:36:1;;;;;;;;;1645:27;;;1617:25;1645:27;;;:13;:27;;;;;;1549:58;;-1:-1:-1;1645:27:1;;1686:31;;1682:207;;1733:145;1755:122;1816:12;1846:17;1755:43;:122::i;1733:145::-;1948:27;;;;;;;:13;:27;;;;;;;:40;;;;;;;;;;2003:80;;;;;1948:27;;:40;;2003:80;;;;;;;;;;992:1:56;;1390:700:1;:::o;2431:67:2:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;729:55:49:-;;;:::o;11708:284:8:-;954:34:58;:32;:34::i;:::-;11871:13:8;;11848:20;11894:92;11919:12;11914:1;:17;11894:92;;11952:23;11965:6;11972:1;11965:9;;;;;;;;;;;;;;11952:12;:23::i;:::-;11933:3;;11894:92;;;;998:1:58;1009:32;:30;:32::i;1638:434:8:-;1860:45;;:::i;:::-;954:34:58;:32;:34::i;:::-;1935:102:8;1965:5;1984:20;2018:9;1935:16;:102::i;1695:36:6:-;;;;;;:::o;1097:329:56:-;960:22;:20;:22::i;:::-;1193;;;1189:231;;1231:70;1253:47;:45;:47::i;1231:70::-;1189:231;;;1332:5;:16;;;;;;;;;;;;1367:42;;1332:16;;1388:10;;1367:42;;1332:5;1367:42;1097:329;:::o;2681:515:6:-;2904:25;1123:21:58;:19;:21::i;:::-;1119:161;;;2962:19:6;;3004;;;;;;;;;;;;;;;;2962;3004;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2991:32:6;-1:-1:-1;3038:9:6;3033:130;3058:6;3053:1;:11;3033:130;;3101:51;3121:12;3134:1;3121:15;;;;;;;;;;;;;;3138:10;3149:1;3138:13;;;;;;;;;;;;;;3101:19;:51::i;:::-;3085:10;3096:1;3085:13;;;;;;;;;;;;;;;;;:67;3066:3;;3033:130;;;-1:-1:-1;;1119:161:58;;;1192:16;:14;:16::i;:::-;2962:19:6;;3004;;;;;;;;;;;;;;;;2962;3004;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2991:32:6;-1:-1:-1;3038:9:6;3033:130;3058:6;3053:1;:11;3033:130;;3101:51;3121:12;3134:1;3121:15;;;;;;;3101:51;3085:10;3096:1;3085:13;;;;;;;;;;;;;;;;;:67;3066:3;;3033:130;;;-1:-1:-1;;1237:32:58;:30;:32::i;1432:255:56:-;1526:5;;;;1512:10;:19;1508:173;;1650:5;;1547:123;;1569:100;;1622:10;;1650:5;;1569:35;:100::i;2544:259:4:-;2686:20;;2658:78;;;;;;2686:20;;;;;2708:27;;2658:78;;;;;;;;;;2746:20;:50;;;;;;;;;;;;;;;2544:259::o;1884:128:58:-;1962:4;1989:16;;;;;;;1884:128::o;3484:1201:6:-;3652:12;3680:23;3706:57;3735:27;;3706:11;:28;;:57;;;;:::i;:::-;3680:83;;3774:115;3816:11;3841:9;3864:15;3774:28;:115::i;:::-;3970:25;;;;4005:65;3970:25;;4005:35;:65::i;:::-;4112:37;;;;:20;:37;;;;;;:44;;;;4152:4;4112:44;;;4238:16;;;;4211:44;;4184:23;;4219:4;;4211:44;;4238:16;4211:44;;;;;;;;;;;;;;;;;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;;4166:89:6;;;;4270:10;4265:187;;4296:145;4318:122;4383:15;4416:10;4318:47;:122::i;4296:145::-;4535:62;4571:13;4594:1;4535:35;:62::i;:::-;4613:37;;4634:15;;4613:37;;;;;4668:10;3484:1201;-1:-1:-1;;;;;;3484:1201:6:o;1648:87:58:-;1705:16;:23;;;;;;;;1648:87::o;1741:137::-;1833:5;1814:24;;;;;;1848:23;:21;:23::i;1041:309:57:-;1157:7;;;;;;;1153:144;;;1180:106;1219:53;:51;:53::i;1180:106::-;1329:7;:14;;;;;;;;1041:309::o;9819:493:2:-;9939:35;;:::i;:::-;9977:19;9990:5;9977:12;:19::i;:::-;9939:57;;10035:36;10054:5;10061:9;10035:18;:36::i;:::-;10158:29;10133:21;;:54;;;;;;;;;10129:91;;10203:7;;;10129:91;10256:49;10278:5;10285:9;:19;;;10256:21;:49::i;1292:155:58:-;1370:21;:19;:21::i;:::-;1365:76;;1407:23;:21;:23::i;1356:102:57:-;1446:5;1436:15;;;;;;1356:102::o;965:364:54:-;1051:7;1082:1;1078;:5;1074:227;;;1099:191;1121:168;1178:59;1255:1;1274;1121:39;:168::i;1099:191::-;-1:-1:-1;1317:5:54;;;965:364::o;13456:855:8:-;13630:45;;:::i;:::-;13771:166;;13738:30;;13807:44;;13771:166;;13865:5;;13884:20;;13918:9;;13771:166;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13771:166:8;;;;;;;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;;;13771:166:8;13738:199;;13949:15;13966:23;14001:4;13993:26;;14020:17;13993:45;;;;;;;;;;;;;;;;;;;;;;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;;13948:90:8;;;;14052:10;14048:153;;;14085:10;:17;14106:3;14085:24;14078:32;;;;14149:10;14138:52;;;;;;;;;;;;;;14124:66;;14048:153;-1:-1:-1;;;13456:855:8;;;;;:::o;8481:820:39:-;8640:35;;:::i;:::-;8777;;8733;;:80;;;:43;:80;:::i;:::-;8691:122;;8909:35;;;;;8865;;;;:80;;;:43;:80;:::i;:::-;8823:39;;;:122;9021:25;;;;;8987;;;;:60;;;:33;:60;:::i;:::-;8955:29;;;:92;9123:25;;;;;9089;;;;:60;;;:33;:60;:::i;:::-;9057:29;;;:92;9231:28;;;;;9194;;;;:66;;;:36;:66;:::i;:::-;9159:32;;;:101;8481:820;;;;:::o;8177:308:6:-;8317:21;;8261:7;;8317:21;;8261:7;8373:36;;:74;;8425:22;8373:74;;;8412:10;8373:74;8348:99;-1:-1:-1;;;8177:308:6;:::o;10732:372:38:-;10906:12;2939:10;10977:26;;11017:12;11043:18;11075:12;10941:156;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;10941:156:38;;;49:4:-1;25:18;;61:17;;10941:156:38;182:15:-1;10941:156:38;;;;179:29:-1;;;;160:49;;;10941:156:38;-1:-1:-1;10732:372:38;;;;;:::o;1511:170:53:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;8431:6398:3;8706:69;;:::i;:::-;8866:17;;8862:216;;8904:163;8926:140;8987:65;8926:43;:140::i;8904:163::-;9091:18;;9087:218;;9130:164;9152:141;9213:66;9152:43;:141::i;9130:164::-;9405:14;:21;9384:10;:17;:42;9380:250;;9442:177;9464:154;9525:79;9464:43;:154::i;9442:177::-;9665:15;:22;9643:11;:18;:44;9639:253;;9703:178;9725:155;9786:80;9725:43;:155::i;9703:178::-;9966:10;:17;9933:51;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;9902:82:3;;10059:18;;10026:52;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;9994:29:3;;;:84;10124:15;;10281:31;;:::i;:::-;10315:10;10326:1;10315:13;;;;;;;;;;;;;;10281:47;;10338:32;;:::i;:::-;10373:11;10385:1;10373:14;;;;;;;;;;;;;;10338:49;;10400:39;10443;10472:9;10443:28;:39::i;:::-;10397:85;;;10495:40;10539;10568:10;10539:28;:40::i;:::-;10492:87;;;10589:49;;:::i;:::-;10648:50;;:::i;:::-;10948:53;;:::i;:::-;11004:208;11034:9;11061:10;11089:14;11104:7;11089:23;;;;;;;;;;;;;;11130:15;11146:8;11130:25;;;;;;;;;;;;;;11173;11004:12;:208::i;:::-;11388:17;;:40;;;10948:264;;-1:-1:-1;11348:81:3;;:31;;:81;:39;:81;:::i;:::-;11314:115;;11478:83;11519:12;:18;;;:41;;;11478:32;:40;;:83;;;;:::i;:::-;11443:118;;11695:111;11742:15;11775:12;:17;;;11695:29;:111::i;:::-;11677:129;;11839:113;11886:16;11920:12;:18;;;11839:29;:113::i;:::-;11820:132;;12133:121;12205:12;:35;;;12133:23;:46;;;:54;;:121;;;;:::i;:::-;12084:46;;;:170;12391:36;;;;;12318:47;;;;:123;;;:55;:123;:::i;:::-;12268:47;;;:173;12670:26;;;;12635:61;;12631:940;;12796:28;;:39;;12825:9;;;;12838:15;;12796:28;:39;;;;;;;;;;;:57;;;;12951:41;;;;;;;;12978:1;12951:41;;;;12981:1;12951:41;;;;12984:1;12951:41;;;;12987:1;12951:41;;;;12990:1;12951:41;;;12933:59;;13174:10;:17;13163:7;:28;13159:398;;;13318:16;13276:23;:29;;;13306:8;13276:39;;;;;;;;;;;;;:58;;;;13356:5;;;13159:398;13420:10;13431:7;13420:19;;;;;;;;;;;;;;13408:31;;13499:39;13528:9;13499:28;:39::i;:::-;13461:77;-1:-1:-1;;13159:398:3;13805:10;:27;;;13769:32;:63;13765:951;;13977:16;13933:23;:29;;;13963:10;;;;;;13933:41;;;;;;;;;;;;;:60;;;;14092:41;;;;;;;;14119:1;14092:41;;;;14122:1;14092:41;;;;14125:1;14092:41;;;;14128:1;14092:41;;;;14131:1;14092:41;;;14073:60;;14317:11;:18;14305:8;:30;14301:401;;;14459:15;14419:23;:28;;;14448:7;14419:37;;;;;;;14301:401;14561:11;14573:8;14561:21;;;;;;;;;;;;;;14548:34;;14643:40;14672:10;14643:28;:40::i;:::-;14604:79;-1:-1:-1;;14301:401:3;10839:3887;;;;-1:-1:-1;;;;;;;;8431:6398:3;;;;;;;:::o;3762:545:40:-;3925:21;4165:104;4257:11;4165:70;4212:22;4257:11;4232:1;4212:22;:19;:22;:::i;:::-;4165:25;:9;4183:6;4165:25;:17;:25;:::i;:::-;:46;:70;:46;:70;:::i;:::-;:91;:104;:91;:104;:::i;13751:1772:5:-;13921:27;14033:96;14065:4;14083:13;14110:9;14033:18;:96::i;:::-;14017:112;-1:-1:-1;14222:27:5;;;14218:285;;14265:227;14287:204;14341:56;14415:4;14437:13;14468:9;14287:36;:204::i;14265:227::-;14588:29;14564:13;14558:20;;;;;;;;:60;;;14554:315;;14634:224;14656:201;14710:53;14781:4;14803:13;14834:9;14656:36;:201::i;14634:224::-;15218:21;15201:13;:38;;;;;;;;;15197:289;;;15255:220;15277:197;15331:49;15398:4;15420:13;15451:9;8091:404:38;8292:12;1851:10;8363:24;;8401:9;8424:4;8442:13;8469:9;8327:161;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;8327:161:38;;;49:4:-1;25:18;;61:17;;8327:161:38;182:15:-1;8327:161:38;;;;179:29:-1;;;;160:49;;;8327:161:38;-1:-1:-1;8091:404:38;;;;;;:::o;9966:3058:5:-;10177:12;10469:21;10452:13;:38;;;;;;;;;10448:2546;;;10510:9;:16;10530:1;10510:21;10506:307;;10551:247;10573:224;10631:56;10709:4;10735:13;10770:9;10573:36;:224::i;10551:247::-;-1:-1:-1;10836:5:5;10448:2546;;;10914:20;10897:13;:37;;;;;;;;;10893:2101;;;10954:9;:16;10974:2;10954:22;10950:308;;10996:247;11018:224;11076:56;11154:4;11180:13;11215:9;11018:36;:224::i;10996:247::-;11271:7;11287:9;11297:1;11287:12;;;;;;;;;;;;;;;-1:-1:-1;11314:9:5;11326:24;:9;11348:1;11326:24;:21;:24;:::i;:::-;11314:36;-1:-1:-1;11364:9:5;11376:25;:9;11398:2;11376:25;:21;:25;:::i;:::-;11364:37;;11415:17;11435:102;11462:4;11484:1;11503;11522;11435:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;11435:102:5;;;;;11561:26;;;;;;;;-1:-1:-1;10893:2101:5;;-1:-1:-1;;;;;10893:2101:5;;11664:21;11647:13;:38;;;;;;;;;11643:1351;;;11705:9;:16;11725:2;11705:22;11701:308;;11747:247;11769:224;11827:56;11905:4;11931:13;11966:9;11769:36;:224::i;11747:247::-;12022:7;12038:9;12048:1;12038:12;;;;;;;;;;;;;;;-1:-1:-1;12065:9:5;12077:24;:9;12099:1;12077:24;:21;:24;:::i;:::-;12065:36;-1:-1:-1;12115:9:5;12127:25;:9;12149:2;12127:25;:21;:25;:::i;:::-;12115:37;;12166:17;12186:225;12317:4;12223:116;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12223:116:5;;;12213:127;;;;;;12358:1;12377;12396;12186:225;;;;;;;;;;;;;;;;;;;11643:1351;12550:20;12533:13;:37;;;;;;;;;12529:465;;;12596:117;12637:4;12659:13;12690:9;12596:23;:117::i;:::-;12586:127;;12529:465;;;12832:23;12815:13;:40;;;;;;;;;12808:48;;;;-1:-1:-1;12953:15:5;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;9966:3058;;;;;;:::o;15830:2739:3:-;16088:59;;:::i;:::-;16524:24;;;;;16496:25;;;;:52;;;;16586:24;;;16558:25;;;:52;16660:39;;:::i;:::-;16702:23;16715:9;16702:12;:23::i;:::-;16660:65;;16735:40;;:::i;:::-;16778:24;16791:10;16778:12;:24::i;:::-;16735:67;;16844:20;16867:27;:25;:27::i;:::-;16844:50;;16957:133;16991:9;17014:13;17041:12;17067:13;16957:20;:133::i;:::-;17100:136;17134:10;17158:14;17186:12;17212:14;17100:20;:136::i;:::-;17246:149;17277:9;17300:10;17324:13;:23;;;17361:14;:24;;;17246:17;:149::i;:::-;17472:309;17528:9;17551:10;17575:13;:41;;;17630:14;:42;;;17686:21;;17721:11;17746:25;17472:42;:309::i;:::-;17451:330;;17825:206;17857:9;17880:12;17906:13;:23;;;17943:13;:41;;;17998:18;:23;;;17825:18;:206::i;:::-;18041:210;18073:10;18097:12;18123:14;:24;;;18161:14;:42;;;18217:18;:24;;;18041:18;:210::i;:::-;18316;18350:13;:23;;;18387:14;:24;;;18425:9;18448:10;18472:12;18498:18;18316:20;:210::i;:::-;-1:-1:-1;;;15830:2739:3;;;;;;;:::o;13960:418:38:-;14165:12;4354:10;14236:30;;14280:9;14303:23;14340:21;14200:171;;;;;;;;;;;1921:441:43;2066:23;2207:116;2248:24;2286:27;:11;:25;:27::i;:::-;2207;:116::i;8377:1482:5:-;8660:25;;;;8608:12;;;8725:112;8762:15;8660:25;8818:9;8725:23;:112::i;:::-;8695:142;-1:-1:-1;8868:23:5;8851:13;:40;;;;;;;;;8847:982;;;8992:213;9037:63;9071:11;9084:15;9037:33;:63::i;:::-;9118:15;9151:13;9182:9;8992:27;:213::i;:::-;8982:223;;8847:982;;;9243:27;9226:13;:44;;;;;;;;;9222:607;;;9368:177;9410:63;9444:11;9457:15;9410:33;:63::i;:::-;9491:13;9522:9;9368:24;:177::i;9222:607::-;9655:163;9700:13;9731:15;9764:13;9795:9;9655:27;:163::i;:::-;9645:173;;9222:607;-1:-1:-1;;8377:1482:5;;;;;:::o;8036:1552:2:-;8203:45;;:::i;:::-;8292:35;;:::i;:::-;8330:19;8343:5;8330:12;:19::i;:::-;8292:57;;8391:20;8414:27;:25;:27::i;:::-;8391:50;;8506:121;8540:5;8559:9;8582:12;8608:9;8506:20;:121::i;:::-;8682:33;8718:69;8749:9;:37;;;8718:5;:22;;;:30;;:69;;;;:::i;:::-;8682:105;;8797:30;8830:67;8849:20;8871:25;8830:18;:67::i;:::-;8797:100;;8967:160;9016:5;9035:22;9071:21;;9106:11;8967:35;:160::i;:::-;8953:174;;9138:17;9158:9;:19;;;9138:39;;9230:172;9262:5;9281:12;9307:9;9330;:37;;;9381:11;9230:18;:172::i;:::-;9437:115;9463:9;9486:5;9505:12;9531:11;9437:12;:115::i;:::-;-1:-1:-1;;;;;8036:1552:2;;;;;:::o;17818:368::-;17932:17;17951:35;18014:51;18037:27;;18014:5;:22;;:51;;;;:::i;:::-;18105:17;;;;:6;:17;;;;;;18002:63;;-1:-1:-1;18105:17:2;-1:-1:-1;17818:368:2;;;:::o;4810:315:42:-;4937:17;4982:110;5023:24;5061:21;:5;:19;:21::i;6617:1367:5:-;6858:18;;6806:12;;;6916:106;6953:9;6858:18;7003:9;6916:23;:106::i;:::-;6886:136;-1:-1:-1;7053:23:5;7036:13;:40;;;;;;;;;7032:922;;;7171:189;7216:45;7244:5;7251:9;7216:27;:45::i;7032:922::-;7398:27;7381:13;:44;;;;;;;;;7377:577;;;7517:159;7559:45;7587:5;7594:9;7559:27;:45::i;2854:2037:1:-;3109:10;;3105:1780;;3261:2;3242:9;:16;:21;;;;;;3267:1;3242:26;3238:311;;3288:246;3310:223;3377:76;3475:9;3506;3310:45;:223::i;3288:246::-;3597:19;3619:23;:9;3597:19;3619:23;:20;:23;:::i;:::-;3677:27;;;3656:18;3677:27;;;:13;:27;;;;;;3597:45;;-1:-1:-1;3677:27:1;;3768:24;3764:303;;3812:240;3834:217;3901:70;3993:9;4024;3834:45;:217::i;3812:240::-;4175:192;;4146:26;;4215:45;;4175:192;;4278:9;;4305:4;;4327:2;;4347:6;;4175:192;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4175:192: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;;;4175:192:1;4146:221;;4474:15;4491:23;4518:10;:15;;4534:13;4518:30;;;;;;;;;;;;;;;;;;;;;;;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;;4473:75:1;;;;4650:10;4645:230;;4680:180;4702:157;4769:9;4800;4831:10;4702:45;:157::i;4680:180::-;3105:1780;;;;;;2854:2037;;;;;:::o;12305:730:8:-;12478:45;;:::i;:::-;12553:96;12577:5;12596:20;12630:9;12553:10;:96::i;:::-;12539:110;;12701:20;12663:11;:34;;;:58;12659:342;;12737:253;12759:230;12818:67;12903:20;12941:11;:34;;;12759:41;:230::i;11110:326:38:-;11258:12;3091:10;11329:33;;11376:12;11402:17;11293:136;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;11293:136:38;;;49:4:-1;25:18;;61:17;;11293:136:38;182:15:-1;11293:136:38;;;;179:29:-1;;;;160:49;;;11293:136:38;-1:-1:-1;11110:326:38;;;;:::o;669:159:51:-;787:34;;;;;;;;;;;;;;;;;669:159;:::o;387:276::-;511:12;183:10;582:25;;621:6;641:5;546:110;;;;;;;;;;4967:2304:6;5308:11;:33;;;5289:15;:52;5285:260;;5357:177;5379:154;5435:51;5504:15;5379:38;:154::i;5357:177::-;5657:20;;;;5691:11;:31;;5687:241;;5738:179;5760:156;5824:15;5857:11;5886:16;5760:46;:156::i;5738:179::-;6057:21;;;;6092:36;;6088:229;;6144:162;6166:139;6236:15;6269:22;6166:52;:139::i;6144:162::-;6385:37;;;;:20;:37;;;;;;;;6381:254;;;6438:186;6460:163;6516:60;6594:15;6460:38;:163::i;6438:186::-;6770:25;;;;6809:27;;;6826:10;6809:27;;;;:171;;;6841:139;6895:11;6924:15;6957:9;6841:36;:139::i;:::-;6840:140;6809:171;6805:460;;;7005:249;7027:226;7081:67;7166:15;7199:13;7230:9;7027:36;:226::i;7005:249::-;4967:2304;;;;;;:::o;7486:247::-;7635:27;;;7652:10;7635:27;7631:96;;7678:21;:38;;;;;;;;;;;;7486:247;;:::o;12857:329:38:-;13010:12;3858:10;13081:36;;13131:15;13160:9;13045:134;;;;;;;;;;1453:189:58;1535:21;1570:11;;1566:70;;1597:28;;:10;;:28;;;;;1617:7;;1597:28;;;;1617:7;1597:10;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;840:162:52;956:39;;;;;;;;;;;;;;;;;840:162;:::o;14629:1022:2:-;14852:19;;;;:33;;;14848:382;;14905:19;;;;:33;;14928:10;14905:33;14901:319;;14958:247;14980:224;15051:62;15135:9;:19;;;15176:10;14980:49;:224::i;14958:247::-;15288:20;15311:27;:25;:27::i;:::-;15288:50;;15374:12;15352:34;;:5;:18;;;:34;;;15348:297;;15402:232;15424:209;15491:61;15570:9;:19;;;15607:12;15424:49;:209::i;15402:232::-;14629:1022;;;:::o;11767:432::-;11925:20;;;;:9;:20;;;;;;;:27;;;;11948:4;11925:27;;;12042:25;;;;12010:18;;12081:20;;;;12115;;;;11990:202;;11935:9;;11990:202;;;;;;;;;;;;;;12081:20;;12115;12149:10;;11990:202;;;;;;;;;;11767:432;;:::o;731:322:55:-;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;1335:383:54;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;7811:274:38:-;7941:12;4497:10;8012:33;;8059:9;7976:102;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;7976:102:38;;;49:4:-1;25:18;;61:17;;7976:102:38;182:15:-1;7976:102:38;;;;179:29:-1;;;;160:49;;;7976:102:38;-1:-1:-1;7811:274:38;;;:::o;122:448:54:-;208:7;235:6;231:45;;-1:-1:-1;264:1:54;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;576:383::-;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:54:o;13111:549:5:-;13276:13;13309:9;:16;13329:1;13309:21;13305:279;;;13346:227;13368:204;13422:56;13496:4;13518:13;13549:9;13368:36;:204::i;13346:227::-;13620:9;13649:1;13630:9;:16;:20;13620:31;;;;;;;;;;;;;;13600:53;;;;;;;14133:679:47;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;14325:245::-;-1:-1:-1;14759:13:47;14661:2;14759:13;14753:20;;14133:679::o;16983:1271:5:-;17237:16;;17153:4;;17334:42;17237:9;17356:19;;;17334:42;:21;:42;:::i;:::-;17443:132;;17419:21;;17479:45;;17443:132;;17538:4;;17556:9;;17443:132;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;17443:132:5;;;49:4:-1;25:18;;61:17;;17443:132:5;182:15:-1;17443:132:5;;;;179:29:-1;;;;160:49;;;17443:132:5;-1:-1:-1;17634:38:5;:9;17656:15;17634:38;:21;:38;:::i;:::-;17733:15;17750:23;17777:13;:24;;17802:8;17777:34;;;;;;;;;;;;;;;;;;;;;;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;;17732:79:5;;;;17900:10;:37;;;;;17914:10;:17;17935:2;17914:23;17900:37;17896:128;;;17988:25;17960:24;:10;17982:1;17960:24;:21;:24;:::i;:::-;:53;;;;17953:60;;;;;;;;17896:128;18080:167;18102:144;18158:4;18176:13;18203:9;18226:10;18102:42;:144::i;18080:167::-;16983:1271;;;;;;;;;:::o;12516:1916:2:-;12835:29;12810:21;;:54;;;;;;;;;12806:258;;12880:173;12902:150;12958:9;:19;;;13016:9;:21;;;12902:38;:150::i;12880:173::-;13135:19;;;;:33;;;13131:382;;13188:19;;;;:33;;13211:10;13188:33;13184:319;;13241:247;13263:224;13334:62;13418:9;:19;;;13459:10;13263:49;:224::i;13241:247::-;13583:18;;;;:32;;;13579:383;;13657:12;13635:34;;:5;:18;;;:34;;;13631:321;;13689:248;13711:225;13782:61;13865:9;:19;;;13906:12;13711:49;:225::i;13689:248::-;14007:131;14055:5;14078:9;:19;;;14115:9;14007:30;:131::i;:::-;14002:424;;14163:252;14185:229;14239:61;14318:9;:19;;;14355:5;:18;;;14391:9;14185:36;:229::i;14163:252::-;12516:1916;;;;:::o;6302:1236:3:-;7336:27;;;;;7301:26;;;;:63;;;:34;:63;:::i;:::-;7258:27;;;;;7223:26;;;;:63;;;:34;:63;:::i;:::-;:141;7219:313;;;7380:141;7402:118;7461:13;7492:14;7402:41;:118::i;4804:3462:39:-;5181:44;;:::i;:::-;5377:26;;;;5337:37;;5377:67;;5412:31;5377:67;:34;:67;:::i;:::-;5337:107;;5454:37;5494:166;5541:9;:26;;;5581:9;:26;;;5621:29;5494:33;:166::i;:::-;5454:206;;5670:38;5711:69;5747:32;5711:10;:27;;;:35;;:69;;;;:::i;:::-;5670:110;;5790:38;5831:169;5878:10;:27;;;5919:10;:27;;;5960:30;5831:33;:169::i;:::-;5790:210;;6123:25;6119:718;;;6185:302;6246:9;6273:10;6301:29;6348;6395:30;6443;6185:43;:302::i;:::-;6164:323;;6119:718;;;6539:287;6585:9;6612:10;6640:29;6687;6734:30;6782;6539:28;:287::i;:::-;6518:308;;6119:718;6972:23;;:46;7032:26;;;;7072:18;;;;6925:175;;6972:46;7032:26;6925:33;:175::i;:::-;6886:23;;:36;;:214;7196:23;;:46;;;7256:26;;;;7296:18;;;;7149:175;;7196:46;7256:26;7149:33;:175::i;:::-;7110:23;;:36;;:214;7462:24;;;;:47;7523:27;;;;7564:19;;;;7415:178;;7462:47;7523:27;7415:33;:178::i;:::-;7375:18;:24;;;:37;;:218;;;;;7643:178;7690:18;:24;;;:47;;;7751:10;:27;;;7792:10;:19;;;7643:33;:178::i;:::-;7603:24;;;;:37;;:218;8004:19;8026:39;:8;8043:21;8026:39;:16;:39;:::i;:::-;8075:23;;:39;;;;:53;;;8138:24;;;;:40;:54;-1:-1:-1;;;;;4804:3462:39;;;;;;;;;:::o;10555:910:2:-;10894:34;;;;10858:71;;:27;;:71;:35;:71;:::i;:::-;10838:6;:17;10845:9;10838:17;;;;;;;;;;;:91;;;;11176:9;10995:5;:25;;;10945:513;;10963:5;:18;;;10945:513;;;11034:5;:20;;;11068:5;:20;;;11102:5;:23;;;11139:5;:23;;;11199:12;11225:10;11249:11;:34;;;11297:11;:34;;;11345:11;:24;;;11383:11;:24;;;11421:11;:27;;;10945:513;;;;;;;;;;;;;;;;;;;;;;;;;10555:910;;;;;:::o;19127:3954:3:-;19466:22;;19526:23;;19593:29;;;;;19667:30;;;;19814:25;;;;19914:23;;:46;;;19751:219;;19786:14;;19526:23;;19466:22;;19751:21;:219::i;:::-;20024:218;20059:13;20086:9;:24;;;20124:16;20154:17;20185:18;:24;;;:47;;;20024:21;:218::i;:::-;20303:221;20338:14;20366:10;:28;;;20408:17;20439:24;20477:18;:24;;;:37;;;20303:21;:221::i;:::-;20583:216;20618:13;20645:9;:27;;;20686:16;20716:23;20753:18;:23;;;:36;;;20583:21;:216::i;:::-;20843:207;20878:13;20905:9;:24;;;20943:16;20973:12;20999:18;:41;;;20843:21;:207::i;:::-;21060:211;21095:14;21123:10;:25;;;21162:17;21193:12;21219:18;:42;;;21060:21;:211::i;:::-;21326:23;21352:224;21385:13;21412:14;21440:18;:23;;;:39;;;21493:16;21523:17;21554:12;21352:19;:224::i;:::-;21326:250;;21678:18;21673:151;;21712:23;;21754:1;21712:39;;;;:43;;;21769:24;;;;:40;;;:44;21673:151;21908:24;21881:51;;:23;:51;;;:131;;;;-1:-1:-1;21983:28:3;;;;;21948:27;;;;:64;;;:34;:64;:::i;:::-;21864:1211;;;22153:283;22192:13;22223:9;:27;;;22268:12;22298:23;22339:83;22384:18;:24;;;:37;;;22339:18;:23;;;:36;;;:44;;:83;;;;:::i;:::-;22153:21;:283::i;:::-;21864:1211;;;22521:240;22560:14;22592:10;:28;;;22638:12;22668:24;22710:18;:24;;;:37;;;22521:21;:240::i;:::-;22828:236;22867:13;22898:9;:27;;;22943:12;22973:23;23014:18;:23;;;:36;;;22828:21;:236::i;:::-;19127:3954;;;;;;;;;;;:::o;2542:1786:43:-;2769:16;;;;;2810;;2868:33;;;;;2930:20;;;;;2749:17;2984:25;;;;3417:11;;3402:13;;;3392:37;;;;3497:9;;1160:66;3520:26;;3647:15;;;3640:29;;;;3757:15;;;3750:46;;;;3884:15;;;3877:33;;;;4035:42;4016:62;;;3998:16;;;3991:88;;;;4129:3;4117:16;;4110:34;4285:3;4267:22;;;2542:1786::o;2889:890:50:-;3318:2;3312:9;3350:66;3335:82;;3467:1;3455:14;;3448:40;;;;3585:2;3573:15;;3566:35;3737:2;3719:21;;;2889:890::o;16158:404:5:-;16396:159;;16353:20;;16432:59;;16396:159;;16505:11;;16530:15;;16396:159;;;;19630:1395;19885:16;;19831:12;;19933:2;19915:20;;19911:278;;;19951:227;19973:204;20027:56;20101:4;20123:13;20154:9;19973:36;:204::i;19951:227::-;20344:24;20371:43;:9;20393:20;;;20371:43;:21;:43;:::i;:::-;20478:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;20344:70;;-1:-1:-1;20478:50:5;;20473:240;;20544:158;20566:135;20640:13;20671:16;20566:56;:135::i;20544:158::-;20732:262;20796:16;20826:4;20844:9;20867:2;20732:50;:262::i;:::-;20722:272;19630:1395;-1:-1:-1;;;;;;;19630:1395:5:o;18679:479::-;18855:12;18893:234;18957:13;18984:4;19002:9;19025:1;18893:50;:234::i;1866:135:54:-;1951:7;1985:1;1981;:5;:13;;1993:1;1981:13;;;-1:-1:-1;1989:1:54;;1974:20;-1:-1:-1;1866:135:54:o;2505:1128:39:-;2730:30;;:::i;:::-;2825:34;;;:59;;;3014:22;;;;3050;;;;2931:151;;2862:22;;2931:33;:151::i;:::-;2894:188;;3202:22;;;;3238:14;;;;3119:143;;3166:22;;3119:33;:143::i;:::-;3092:24;;;:170;3382:22;;;;3418:14;;;;3299:143;;3346:22;;3299:33;:143::i;:::-;3272:24;;;:170;3558:39;:8;3575:21;3558:39;:16;:39;:::i;:::-;3528:27;;;:69;2505:1128;;;;;;:::o;16002:1585:2:-;16245:194;16280:9;16303:5;:20;;;16337:12;16363:5;:18;;;16395:11;:34;;;16245:21;:194::i;:::-;16485;16520:9;16543:5;:20;;;16577:5;:18;;;16609:12;16635:11;:34;;;16485:21;:194::i;:::-;16736;16771:9;16794:5;:23;;;16831:12;16857:5;:25;;;16896:11;:24;;;16736:21;:194::i;:::-;16987:200;17022:9;17045:5;:23;;;17082:5;:18;;;17114:5;:25;;;17153:11;:24;;;16987:21;:200::i;:::-;17226:22;17251:153;17286:9;17309:11;:27;;;17350:5;:18;;;17382:12;17251:21;:153::i;:::-;17226:178;;17506:17;17501:80;;17569:1;17539:27;;;:31;16002:1585;;;;;:::o;5279:2665:42:-;5485:20;;;;5545;;;;5608:23;;;;5674;;;;5369:14;;1422:66;;5485:20;;5545;;6578:2;6568:13;;6565:2;;;6600:9;6565:2;6731:14;;;6954:11;;6781:3;6770:15;;6991:11;;6821:3;6810:15;;7028:11;;6861:3;6850:15;;7065:11;;6901:3;6890:15;;7102:11;;7156:24;;;7241:21;;6742:2;7216:23;;;7206:57;7193:71;;7364:21;;7339:23;;;7329:57;;;;7316:71;;7490:24;;7462:26;;;7452:63;;;;7439:77;;7616:24;;7588:26;;;;7578:63;;;;7565:77;;7717:3;7701:20;;7758:19;;;;7790;;7822;;;7854;;7886;;;;7701:20;-1:-1:-1;5279:2665:42;;;:::o;15669:338:5:-;15865:135;;15822:20;;15901:47;;15865:135;;15962:5;;15981:9;;15865:135;;;;11442:385:38;11635:12;3252:10;11706:35;;11755:9;11778;11801;11670:150;;;;;;;;;;;16814:871:47;16934:13;16978:5;16986:1;16978:9;16967:1;:8;:20;16963:290;;;17003:239;17025:216;17087:87;17192:1;:8;17218:5;17226:1;17218:9;17025:44;:216::i;17003:239::-;-1:-1:-1;17426:13:47;17329:2;17426:13;17420:20;17579:66;17567:79;;16814:871::o;11833:369:38:-;12010:12;3413:10;12081:35;;12130:9;12153;12176;12045:150;;;;;;;;;;;12532:319;12685:12;3700:10;12756:26;;12796:9;12819:15;12720:124;;;;;;;;;;13192:397;13378:12;4029:10;13449:36;;13499:15;13528:14;13556:16;13413:169;;;;;;;;;;;13595:359;13760:12;4200:10;13831:42;;13887:15;13916:21;13795:152;;;;;;;;;;10039:395;10233:12;2666:10;10304:39;;10357:9;10380;10403:14;10268:159;;;;;;;;;;;1292:378:48;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;18060:153:47;18180:17;;18166:41::o;9306:410:38:-;9506:12;2355:10;9577:31;;9622:4;9640:13;9667:9;9690;9541:168;;;;;;;;;;;;9722:311;9870:12;2495:10;9941:27;;9982:9;10005:11;9905:121;;;;;;;;;;12208:318;12353:12;3561:10;12424:30;;12468:13;12495:14;12388:131;;;;;;;;;;1141:603:40;1309:21;1350:110;1388:9;1415:11;1444:6;1350:20;:110::i;:::-;1346:289;;;1476:148;1498:125;1547:9;1574:11;1603:6;1498:31;:125::i;1476:148::-;1661:46;1695:11;1661:25;:9;1679:6;1661:25;:17;:25;:::i;14339:4364:39:-;14717:44;;:::i;:::-;14945:62;;;15055;;;16229;;;16225:1694;;;16423:164;16468:9;16495:30;16543;16423:27;:164::i;:::-;16402:185;;16225:1694;;;16641:29;16608:30;:62;16604:1315;;;16782:23;;:78;;;16874:23;;:46;;:78;;;17334:27;;;;17379;;;;17283:184;;17334:27;16831:29;17283:33;:184::i;:::-;17233:24;;;;;;:234;;;;17481:24;;:47;:79;;;16604:1315;;;17678:230;17722:29;17769;17816:30;17864;17678:26;:230::i;:::-;17657:251;;16604:1315;18055:29;18051:237;;;18216:24;;;;;:47;;18144:23;;:46;:133;;;:54;:133;:::i;:::-;18100:41;;;:177;18051:237;18426:30;18422:239;;;18590:23;;:46;;;;;18517:24;;;;:47;:133;;;:55;:133;:::i;:::-;18472:42;;;:178;18422:239;-1:-1:-1;;14339:4364:39;;;;;;;;;:::o;10157:3363::-;10520:44;;:::i;:::-;11497:30;11465:29;:62;11461:1794;;;11615:164;11660:9;11687:30;11735;11615:27;:164::i;:::-;11594:185;;11461:1794;;;11832:30;11800:29;:62;11796:1459;;;11928:23;;:78;;;12020:23;;:46;;;;:78;;;12112:24;;;:79;;;12489:27;;;;12534;;;;12439:234;;12489:27;12069:29;12439:32;:234::i;:::-;12389:24;;;;;:47;:284;11796:1459;;;13014:230;13058:29;13105;13152:30;13200;13014:26;:230::i;:::-;12993:251;;11796:1459;13420:24;;;;;:47;;13352:23;;:46;:125;;;:54;:125;:::i;:::-;13308:41;;;:169;10157:3363;;;;;;;;:::o;4299:1259:4:-;4588:20;;4545:4;;4588:20;;4622:26;;4618:934;;4819:21;4793:23;4936:224;4983:10;5011:12;4819:21;5074:11;5103:13;5134:12;4936:29;:224::i;:::-;4916:244;;5237:236;5284:10;5312:12;5360:9;5342:15;:27;5387:11;5416:13;5447:12;5237:29;:236::i;:::-;;5494:4;5487:11;;;;;;;4618:934;5536:5;5529:12;;;;;10136:403:47;10257:10;10486:3;:10;10472:3;:10;:24;:60;;;;-1:-1:-1;;10518:14:47;;;;;;;10500;;;;;;;;;;:32;;10136:403::o;10753:1071::-;10874:14;10919:5;10927:2;10919:10;10908:1;:8;:21;10904:321;;;10945:269;10967:246;11029:89;11136:1;:8;11162:5;11170:2;11162:10;10967:44;:246::i;10945:269::-;-1:-1:-1;11726:13:47;11471:2;11726:13;11720:20;11742:42;11716:69;;10753:1071::o;8501:354:38:-;8663:12;2031:10;8734:47;;8795:13;8822:16;8698:150;;;;;;;;;;21625:1353:5;21968:16;;21880:4;;22049:65;21968:9;22071:42;;;22049:65;:21;:65;:::i;:::-;22148:139;;22124:21;;22184:52;;22148:139;;22250:4;;22268:9;;22148:139;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;22148:139:5;;;49:4:-1;25:18;;61:17;;22148:139:5;182:15:-1;22148:139:5;;;;179:29:-1;;;;160:49;;;22148:139:5;-1:-1:-1;22342:38:5;:9;22364:15;22342:38;:21;:38;:::i;:::-;22440:15;22457:23;22484:24;:35;;22520:8;22484:45;;;;;;;;;;;;;;;;;;;;;;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;;22439:90:5;;;;22618:10;:37;;;;;22632:10;:17;22653:2;22632:23;22618:37;22614:122;;;22706:19;22678:24;:10;22700:1;22678:24;:21;:24;:::i;:::-;:47;;;;22671:54;;;;;;;;22614:122;22792:179;22814:156;22871:24;22909:4;22927:9;22950:10;22814:43;:156::i;22792:179::-;21625:1353;;;;;;;;;;:::o;3140:619:4:-;3370:20;;3327:4;;3370:20;;3404:26;;3400:353;;3446:228;3493:9;3520:12;3550:21;3589:11;3618:12;3648;3446:29;:228::i;:::-;;3695:4;3688:11;;;;;3400:353;3737:5;3730:12;;;;;4566:1880:40;4729:12;4761:16;4757:109;;4793:62;4815:39;:37;:39::i;4793:62::-;5676:11;;;:29;;-1:-1:-1;5691:14:40;;5676:29;5672:72;;;-1:-1:-1;5728:5:40;5721:12;;5672:72;6239:17;6322:11;6259:84;;;;;6299:9;6279:6;6259:84;6239:104;-1:-1:-1;6390:25:40;:9;6408:6;6390:25;:17;:25;:::i;:::-;6363:23;:9;6381:4;6363:23;:17;:23;:::i;:::-;:52;;;4566:1880;-1:-1:-1;;;;;4566:1880:40:o;520:335:41:-;676:12;312:10;747:23;;784:9;807:11;832:6;711:137;;;;;;;;;;;20995:1066:39;21221:44;;:::i;:::-;21281:24;;;;;;:80;;;21371:24;:47;;:80;;;21461:23;;:46;:79;;;21898:26;;;;21938;;;;21851:167;;21898:26;21331:30;21851:33;:167::i;:::-;21802:23;;:216;20995:1066;;;;;:::o;19492:790::-;19770:44;;:::i;:::-;19893:23;;:78;;;;19981:23;;:46;;;;:78;;;;20069:24;;;;;:80;;;;20159:24;;:47;;;:80;19893:23;19492:790::o;2067:847:40:-;2234:21;2275:109;2312:9;2339:11;2368:6;2275:19;:109::i;:::-;2271:288;;;2400:148;2422:125;2471:9;2498:11;2527:6;2422:31;:125::i;2400:148::-;2772:104;2864:11;2772:70;2819:22;2864:11;2839:1;2819:22;:19;:22;:::i;6036:1219:4:-;6294:17;6515:11;6496:15;:30;6492:84;;-1:-1:-1;6554:11:4;6492:84;6619:167;;6585:31;;6655:44;;6619:167;;6713:12;;6739;;6765:11;;6619:167;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6619:167:4;;;;;;;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;;;6619:167:4;6585:201;;6851:15;6868:23;6895:12;:17;;6919:9;6930:18;6895:54;;;;;;;;;;;;;;;;;;;;;;;;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;;6850:99:4;;;;6964:10;6959:264;;6990:222;7012:199;7071:9;7098:11;7127:12;7157;7187:10;7012:41;:199::i;6990:222::-;-1:-1:-1;;;6036:1219:4;;;;;;;;:::o;8861:439:38:-;9078:12;2193:10;9149:32;;9195:24;9233:4;9251:9;9274;9113:180;;;;;;;;;;;;372:142:41;485:22;;;;;;;;;;;;;;;;;372:142;:::o;6703:937:40:-;6865:12;6897:16;6893:109;;6929:62;6951:39;:37;:39::i;6929:62::-;7066:11;;;:29;;-1:-1:-1;7081:14:40;;7066:29;7062:257;;;-1:-1:-1;7303:5:40;7296:12;;7062:257;7367:17;7450:11;7387:84;;;;;7427:9;7407:6;7387:84;7367:104;-1:-1:-1;7526:11:40;7493:30;7526:11;7367:104;7493:30;:19;:30;:::i;:::-;:44;;;;;;;-1:-1:-1;7584:25:40;:9;7602:6;7584:25;:17;:25;:::i;14384:472:38:-;14614:12;4668:10;14685:31;;14730:9;14753:11;14778:12;14804;14830:9;14649:200;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;14649:200:38;;;49:4:-1;25:18;;61:17;;14649:200:38;182:15:-1;14649:200:38;;;;179:29:-1;;;;160:49;;;14649:200:38;-1:-1:-1;14384:472:38;;;;;;;:::o;1057:384:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;1057:384:0;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;73643:42;73632:54;;77554:35;;77544:2;;77603:1;;77593:12;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;462:21;;;345:89;-1:-1;506:4;519:14;;;;494:17;;;608;;;599:27;;;;596:36;-1:-1;593:2;;;645:1;;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;;;748:50;;812:14;;;;840;;;;702:1;695:9;655:206;;;659:14;;;;;237:630;;;;;891:693;;1013:3;1006:4;998:6;994:17;990:27;980:2;;-1:-1;;1021:12;980:2;1068:6;1055:20;1090:85;1105:69;1167:6;1105:69;;1090:85;1203:21;;;1081:94;-1:-1;1247:4;1260:14;;;;1235:17;;1355:1;1340:238;1365:6;1362:1;1359:13;1340:238;;;1472:42;1510:3;1247:4;1448:3;1435:17;1239:6;1423:30;;1472:42;;;1460:55;;1247:4;1529:14;;;;1557;;;;;1387:1;1380:9;1340:238;;;1344:14;;;;973:611;;;;;1624:735;;1760:3;1753:4;1745:6;1741:17;1737:27;1727:2;;-1:-1;;1768:12;1727:2;1815:6;1802:20;1837:99;1852:83;1928:6;1852:83;;1837:99;1964:21;;;1828:108;-1:-1;2008:4;2021:14;;;;1996:17;;2116:1;2101:252;2126:6;2123:1;2120:13;2101:252;;;2233:56;2285:3;2008:4;2209:3;2196:17;2000:6;2184:30;;2233:56;;;2221:69;;2008:4;2304:14;;;;2332;;;;;2148:1;2141:9;2101:252;;3220:707;;3337:3;3330:4;3322:6;3318:17;3314:27;3304:2;;-1:-1;;3345:12;3304:2;3392:6;3379:20;3414:80;3429:64;3486:6;3429:64;;3414:80;3522:21;;;3405:89;-1:-1;3566:4;3579:14;;;;3554:17;;;3668;;;3659:27;;;;3656:36;-1:-1;3653:2;;;3705:1;;3695:12;3653:2;3730:1;3715:206;3740:6;3737:1;3734:13;3715:206;;;14188:20;;3808:50;;3872:14;;;;3900;;;;3762:1;3755:9;3715:206;;4478:432;;4575:3;4568:4;4560:6;4556:17;4552:27;4542:2;;-1:-1;;4583:12;4542:2;4630:6;4617:20;68057:18;68049:6;68046:30;68043:2;;;-1:-1;;68079:12;68043:2;4652:60;68220:4;68152:9;4568:4;68137:6;68133:17;68129:33;68210:15;4652:60;;;4643:69;;4732:6;4725:5;4718:21;4836:3;68220:4;4827:6;4760;4818:16;;4815:25;4812:2;;;4853:1;;4843:12;4812:2;75833:6;68220:4;4760:6;4756:17;68220:4;4794:5;4790:16;75810:30;75889:1;75871:16;;;68220:4;75871:16;75864:27;4794:5;4535:375;-1:-1;;4535:375;6471:2714;;6579:6;;6567:9;6562:3;6558:19;6554:32;6551:2;;;-1:-1;;6589:12;6551:2;6617:22;6579:6;6617:22;;;6608:31;;;6729:49;6774:3;6750:22;6729:49;;;6711:16;6704:75;6881:49;6926:3;6848:2;6906:9;6902:22;6881:49;;;6848:2;6867:5;6863:16;6856:75;7040:49;7085:3;7007:2;7065:9;7061:22;7040:49;;;7007:2;7026:5;7022:16;7015:75;7193:49;7238:3;7160:2;7218:9;7214:22;7193:49;;;7160:2;7179:5;7175:16;7168:75;7316:3;7375:9;7371:22;14188:20;7316:3;7336:5;7332:16;7325:75;7473:3;7532:9;7528:22;14188:20;7473:3;7493:5;7489:16;7482:75;7622:3;7681:9;7677:22;14188:20;7622:3;7642:5;7638:16;7631:75;7771:3;7830:9;7826:22;14188:20;7771:3;7791:5;7787:16;7780:75;7933:3;;7994:9;7990:22;14188:20;7933:3;7953:5;7949:18;7942:77;;8080:3;;8141:9;8137:22;14188:20;8080:3;8100:5;8096:18;8089:77;;8265:3;;8254:9;8250:19;8237:33;8290:18;;8282:6;8279:30;8276:2;;;6697:1;;8312:12;8276:2;8359:54;8409:3;8400:6;8389:9;8385:22;8359:54;;;8265:3;8343:5;8339:18;8332:82;8513:3;;;;8502:9;8498:19;8485:33;8471:47;;8290:18;8530:6;8527:30;8524:2;;;6697:1;;8560:12;8524:2;8607:54;8657:3;8648:6;8637:9;8633:22;8607:54;;;8513:3;8591:5;8587:18;8580:82;8764:3;;;;8753:9;8749:19;8736:33;8722:47;;8290:18;8781:6;8778:30;8775:2;;;6697:1;;8811:12;8775:2;8858:54;8908:3;8899:6;8888:9;8884:22;8858:54;;;8764:3;8842:5;8838:18;8831:82;9015:3;;;;9004:9;9000:19;8987:33;8973:47;;8290:18;9032:6;9029:30;9026:2;;;6697:1;;9062:12;9026:2;;9109:54;9159:3;9150:6;9139:9;9135:22;9109:54;;;9015:3;9093:5;9089:18;9082:82;;;6545:2640;;;;;11997:1027;;12117:4;12105:9;12100:3;12096:19;12092:30;12089:2;;;-1:-1;;12125:12;12089:2;12153:20;12117:4;12153:20;;;12144:29;;14201:6;14188:20;12237:16;12230:75;12383:2;12441:9;12437:22;14188:20;12383:2;12402:5;12398:16;12391:75;12531:2;12589:9;12585:22;14188:20;12531:2;12550:5;12546:16;12539:75;12684:2;12742:9;12738:22;72:20;97:33;124:5;97:33;;;12684:2;12699:16;;12692:75;12856:3;12841:19;;12828:33;12881:18;12870:30;;12867:2;;;-1:-1;;12903:12;12867:2;12948:54;12998:3;12989:6;12978:9;12974:22;12948:54;;;12856:3;12934:5;12930:16;12923:80;;12083:941;;;;;14399:241;;14503:2;14491:9;14482:7;14478:23;14474:32;14471:2;;;-1:-1;;14509:12;14471:2;14571:53;14616:7;14592:22;14571:53;;14647:366;;;14768:2;14756:9;14747:7;14743:23;14739:32;14736:2;;;-1:-1;;14774:12;14736:2;14836:53;14881:7;14857:22;14836:53;;;14826:63;;14944:53;14989:7;14926:2;14969:9;14965:22;14944:53;;;14934:63;;14730:283;;;;;;15020:360;;;15138:2;15126:9;15117:7;15113:23;15109:32;15106:2;;;-1:-1;;15144:12;15106:2;15206:53;15251:7;15227:22;15206:53;;;15196:63;;15296:2;15336:9;15332:22;3999:20;77700:5;71807:13;71800:21;77678:5;77675:32;77665:2;;-1:-1;;77711:12;77665:2;15304:60;;;;15100:280;;;;;;15387:1171;;;;;15647:3;15635:9;15626:7;15622:23;15618:33;15615:2;;;-1:-1;;15654:12;15615:2;15712:17;15699:31;15750:18;;15742:6;15739:30;15736:2;;;-1:-1;;15772:12;15736:2;15802:83;15877:7;15868:6;15857:9;15853:22;15802:83;;;15792:93;;15950:2;15939:9;15935:18;15922:32;15908:46;;15750:18;15966:6;15963:30;15960:2;;;-1:-1;;15996:12;15960:2;16026:78;16096:7;16087:6;16076:9;16072:22;16026:78;;;16016:88;;16169:2;16158:9;16154:18;16141:32;16127:46;;15750:18;16185:6;16182:30;16179:2;;;-1:-1;;16215:12;16179:2;16245:78;16315:7;16306:6;16295:9;16291:22;16245:78;;;16235:88;;16388:2;16377:9;16373:18;16360:32;16346:46;;15750:18;16404:6;16401:30;16398:2;;;-1:-1;;16434:12;16398:2;;16464:78;16534:7;16525:6;16514:9;16510:22;16464:78;;;16454:88;;;15609:949;;;;;;;;16565:415;;16713:2;16701:9;16692:7;16688:23;16684:32;16681:2;;;-1:-1;;16719:12;16681:2;16777:17;16764:31;16815:18;16807:6;16804:30;16801:2;;;-1:-1;;16837:12;16801:2;16867:97;16956:7;16947:6;16936:9;16932:22;16867:97;;16987:1257;;;;;17290:3;17278:9;17269:7;17265:23;17261:33;17258:2;;;-1:-1;;17297:12;17258:2;17355:17;17342:31;17393:18;;17385:6;17382:30;17379:2;;;-1:-1;;17415:12;17379:2;17445:97;17534:7;17525:6;17514:9;17510:22;17445:97;;;17435:107;;17607:2;17596:9;17592:18;17579:32;17565:46;;17393:18;17623:6;17620:30;17617:2;;;-1:-1;;17653:12;17617:2;17683:97;17772:7;17763:6;17752:9;17748:22;17683:97;;;17673:107;;17845:2;17834:9;17830:18;17817:32;17803:46;;17393:18;17861:6;17858:30;17855:2;;;-1:-1;;17891:12;17855:2;17921:83;17996:7;17987:6;17976:9;17972:22;17921:83;;;17911:93;;18069:2;18058:9;18054:18;18041:32;18027:46;;17393:18;18085:6;18082:30;18079:2;;;-1:-1;;18115:12;18079:2;;18145:83;18220:7;18211:6;18200:9;18196:22;18145:83;;18251:947;;;;18488:2;18476:9;18467:7;18463:23;18459:32;18456:2;;;-1:-1;;18494:12;18456:2;18552:17;18539:31;18590:18;;18582:6;18579:30;18576:2;;;-1:-1;;18612:12;18576:2;18642:97;18731:7;18722:6;18711:9;18707:22;18642:97;;;18632:107;;18804:2;18793:9;18789:18;18776:32;18762:46;;18590:18;18820:6;18817:30;18814:2;;;-1:-1;;18850:12;18814:2;18880:78;18950:7;18941:6;18930:9;18926:22;18880:78;;;18870:88;;19023:2;19012:9;19008:18;18995:32;18981:46;;18590:18;19039:6;19036:30;19033:2;;;-1:-1;;19069:12;19033:2;;19099:83;19174:7;19165:6;19154:9;19150:22;19099:83;;;19089:93;;;18450:748;;;;;;19205:811;;;;19417:2;19405:9;19396:7;19392:23;19388:32;19385:2;;;-1:-1;;19423:12;19385:2;19481:17;19468:31;19519:18;;19511:6;19508:30;19505:2;;;-1:-1;;19541:12;19505:2;19571:97;19660:7;19651:6;19640:9;19636:22;19571:97;;;19561:107;;19705:2;19748:9;19744:22;14188:20;19713:63;;19841:2;19830:9;19826:18;19813:32;19799:46;;19519:18;19857:6;19854:30;19851:2;;;-1:-1;;19887:12;20023:710;;;20230:2;20218:9;20209:7;20205:23;20201:32;20198:2;;;-1:-1;;20236:12;20198:2;20294:17;20281:31;20332:18;;20324:6;20321:30;20318:2;;;-1:-1;;20354:12;20318:2;20476:6;20465:9;20461:22;2571:3;2564:4;2556:6;2552:17;2548:27;2538:2;;-1:-1;;2579:12;2538:2;2626:6;2613:20;2599:34;;2648:111;2663:95;2751:6;2663:95;;2648:111;2787:21;;;2831:4;2844:14;;;;2765:16;2819:17;;;-1:-1;2924:264;2949:6;2946:1;2943:13;2924:264;;;3056:68;3120:3;2831:4;3032:3;3019:17;2823:6;3007:30;;3056:68;;;3044:81;;3139:14;;;;3167;;;;2971:1;2964:9;2924:264;;;-1:-1;20374:119;;-1:-1;20543:18;;20530:32;;-1:-1;;;;20571:30;;;20568:2;;;-1:-1;;20604:12;20568:2;;20634:83;20709:7;20700:6;20689:9;20685:22;20634:83;;;20624:93;;;20192:541;;;;;;20740:241;;20844:2;20832:9;20823:7;20819:23;20815:32;20812:2;;;-1:-1;;20850:12;20812:2;-1:-1;4133:20;;20806:175;-1:-1;20806:175;20988:366;;;21109:2;21097:9;21088:7;21084:23;21080:32;21077:2;;;-1:-1;;21115:12;21077:2;4146:6;4133:20;21167:63;;21267:2;21310:9;21306:22;72:20;97:33;124:5;97:33;;21361:595;;;;21508:2;21496:9;21487:7;21483:23;21479:32;21476:2;;;-1:-1;;21514:12;21476:2;4146:6;4133:20;21566:63;;21666:2;21709:9;21705:22;72:20;97:33;124:5;97:33;;;21674:63;-1:-1;21802:2;21787:18;;21774:32;21826:18;21815:30;;21812:2;;;-1:-1;;21848:12;21812:2;21878:62;21932:7;21923:6;21912:9;21908:22;21878:62;;21963:239;;22066:2;22054:9;22045:7;22041:23;22037:32;22034:2;;;-1:-1;;22072:12;22034:2;4282:6;4269:20;4294:32;4320:5;4294:32;;22209:261;;22323:2;22311:9;22302:7;22298:23;22294:32;22291:2;;;-1:-1;;22329:12;22291:2;4421:6;4415:13;4433:32;4459:5;4433:32;;22477:314;;22617:3;22605:9;22596:7;22592:23;22588:33;22585:2;;;-1:-1;;22624:12;22585:2;5568:20;22617:3;5568:20;;;14342:6;14336:13;5670:16;5663:86;5828:2;5897:9;5893:22;14336:13;5828:2;5847:5;5843:16;5836:86;5991:2;6060:9;6056:22;14336:13;5991:2;6010:5;6006:16;5999:86;6154:2;6223:9;6219:22;14336:13;6154:2;6173:5;6169:16;6162:86;6320:3;6390:9;6386:22;14336:13;6320:3;6340:5;6336:16;6329:86;22676:99;;;;22579:212;;;;;22798:373;;22925:2;22913:9;22904:7;22900:23;22896:32;22893:2;;;-1:-1;;22931:12;22893:2;22989:17;22976:31;23027:18;23019:6;23016:30;23013:2;;;-1:-1;;23049:12;23013:2;23079:76;23147:7;23138:6;23127:9;23123:22;23079:76;;23178:602;;;23331:2;23319:9;23310:7;23306:23;23302:32;23299:2;;;-1:-1;;23337:12;23299:2;23395:17;23382:31;23433:18;;23425:6;23422:30;23419:2;;;-1:-1;;23455:12;23419:2;23485:76;23553:7;23544:6;23533:9;23529:22;23485:76;;;23475:86;;23626:2;23615:9;23611:18;23598:32;23584:46;;23433:18;23642:6;23639:30;23636:2;;;-1:-1;;23672:12;23636:2;;23702:62;23756:7;23747:6;23736:9;23732:22;23702:62;;23787:1089;;;;;24006:3;23994:9;23985:7;23981:23;23977:33;23974:2;;;-1:-1;;24013:12;23974:2;24071:17;24058:31;24109:18;;24101:6;24098:30;24095:2;;;-1:-1;;24131:12;24095:2;24161:76;24229:7;24220:6;24209:9;24205:22;24161:76;;;24151:86;;24302:2;24291:9;24287:18;24274:32;24260:46;;24109:18;24318:6;24315:30;24312:2;;;-1:-1;;24348:12;24312:2;24378:76;24446:7;24437:6;24426:9;24422:22;24378:76;;;24368:86;;24519:2;24508:9;24504:18;24491:32;24477:46;;24109:18;24535:6;24532:30;24529:2;;;-1:-1;;24565:12;24529:2;24595:62;24649:7;24640:6;24629:9;24625:22;24595:62;;;24585:72;;24722:2;24711:9;24707:18;24694:32;24680:46;;24109:18;24738:6;24735:30;24732:2;;;-1:-1;;24768:12;24732:2;;24798:62;24852:7;24843:6;24832:9;24828:22;24798:62;;24883:727;;;;25053:2;25041:9;25032:7;25028:23;25024:32;25021:2;;;-1:-1;;25059:12;25021:2;25117:17;25104:31;25155:18;;25147:6;25144:30;25141:2;;;-1:-1;;25177:12;25141:2;25207:76;25275:7;25266:6;25255:9;25251:22;25207:76;;;25197:86;;25320:2;25363:9;25359:22;14188:20;25328:63;;25456:2;25445:9;25441:18;25428:32;25414:46;;25155:18;25472:6;25469:30;25466:2;;;-1:-1;;25502:12;25466:2;;25532:62;25586:7;25577:6;25566:9;25562:22;25532:62;;25617:626;;;25782:2;25770:9;25761:7;25757:23;25753:32;25750:2;;;-1:-1;;25788:12;25750:2;25846:17;25833:31;25884:18;;25876:6;25873:30;25870:2;;;-1:-1;;25906:12;25870:2;25936:88;26016:7;26007:6;25996:9;25992:22;25936:88;;27119:103;73643:42;73632:54;27180:37;;27174:48;28355:890;;28623:5;69203:12;70362:6;70357:3;70350:19;70399:4;70394:3;70390:14;28635:118;;70399:4;28849:5;68690:14;-1:-1;28888:335;28913:6;28910:1;28907:13;28888:335;;;26822:100;26918:3;28980:6;28974:13;26822:100;;;26951:4;26942:14;;;;;70399:4;69924:14;;;;;28935:1;28928:9;28888:335;;;-1:-1;29229:10;;28529:716;-1:-1;;;;28529:716;30815:343;;30957:5;69203:12;70362:6;70357:3;70350:19;31050:52;31095:6;70399:4;70394:3;70390:14;70399:4;31076:5;31072:16;31050:52;;;76351:2;76331:14;76347:7;76327:28;31114:39;;;;70399:4;31114:39;;30905:253;-1:-1;;30905:253;36449:1009;36690:16;36684:23;30377:3;30370:37;36873:4;36866:5;36862:16;36856:23;36873:4;36937:3;36933:14;30370:37;37035:4;37028:5;37024:16;37018:23;37035:4;37099:3;37095:14;30370:37;37197:4;37190:5;37186:16;37180:23;37197:4;37261:3;37257:14;30370:37;37362:4;37355:5;37351:16;37345:23;37362:4;37426:3;37422:14;30370:37;36573:885;;;40404:2780;;40551:6;40656:63;40704:14;40633:16;40627:23;40656:63;;;40806:4;40799:5;40795:16;40789:23;40818:63;40806:4;40870:3;40866:14;40852:12;40818:63;;;;40975:4;40968:5;40964:16;40958:23;40987:63;40975:4;41039:3;41035:14;41021:12;40987:63;;;;41138:4;41131:5;41127:16;41121:23;41150:63;41138:4;41202:3;41198:14;41184:12;41150:63;;;;41304:4;41297:5;41293:16;41287:23;41304:4;41368:3;41364:14;30370:37;41470:4;41463:5;41459:16;41453:23;41470:4;41534:3;41530:14;30370:37;41628:4;41621:5;41617:16;41611:23;41628:4;41692:3;41688:14;30370:37;41786:4;41779:5;41775:16;41769:23;41786:4;41850:3;41846:14;30370:37;41957:6;;41950:5;41946:18;41940:25;41957:6;42023:3;42019:16;30370:37;;42115:6;;42108:5;42104:18;42098:25;42115:6;42181:3;42177:16;30370:37;;42283:6;;42276:5;42272:18;42266:25;40551:6;42283;42315:3;42311:16;42304:40;42359:67;40551:6;40546:3;40542:16;42407:12;42359:67;;;42351:75;;;42521:6;;;;42514:5;42510:18;42504:25;42577:3;42571:4;42567:14;42521:6;42553:3;42549:16;42542:40;42597:67;42659:4;42645:12;42597:67;;;42589:75;;;;42762:6;;42755:5;42751:18;42745:25;42818:3;42812:4;42808:14;42762:6;42794:3;42790:16;42783:40;42838:67;42900:4;42886:12;42838:67;;;42830:75;;;43003:6;;;;42996:5;42992:18;42986:25;43059:3;43053:4;43049:14;43003:6;43035:3;43031:16;43024:40;43079:67;43141:4;43127:12;43079:67;;44720:254;;31325:5;69203:12;31436:52;31481:6;31476:3;31469:4;31462:5;31458:16;31436:52;;;31500:16;;;;;44841:133;-1:-1;;44841:133;45250:511;34646:66;34626:87;;34610:2;34732:12;;30370:37;;;;45724:12;;;45458:303;45768:213;73643:42;73632:54;;;;27180:37;;45886:2;45871:18;;45857:124;45988:324;73643:42;73632:54;;;27180:37;;73632:54;;46298:2;46283:18;;27180:37;46134:2;46119:18;;46105:207;46319:435;73643:42;73632:54;;;27180:37;;73632:54;;;;46657:2;46642:18;;27180:37;46740:2;46725:18;;30370:37;;;;46493:2;46478:18;;46464:290;46761:799;;73643:42;73636:5;73632:54;27187:3;27180:37;47017:3;47136:2;47125:9;47121:18;47114:48;47176:76;47017:3;47006:9;47002:19;47238:6;47176:76;;;47300:9;47294:4;47290:20;47285:2;47274:9;47270:18;47263:48;47325:76;47396:4;47387:6;47325:76;;;47449:9;47443:4;47439:20;47434:2;47423:9;47419:18;47412:48;47474:76;47545:4;47536:6;47474:76;;;47466:84;46988:572;-1:-1;;;;;;;;46988:572;47567:381;;47745:2;;47734:9;47730:18;47745:2;47766:17;47759:47;47820:118;27584:5;69203:12;70362:6;70357:3;70350:19;70390:14;47734:9;70390:14;27596:98;;70390:14;47745:2;27751:6;27747:17;47734:9;27738:27;;27726:39;;47745:2;27841:5;68690:14;-1:-1;27880:345;27905:6;27902:1;27899:13;27880:345;;;27957:20;47734:9;27961:4;27957:20;;27952:3;27945:33;26610:60;26666:3;28012:6;28006:13;26610:60;;;28026:82;-1:-1;28204:14;;;;69924;;;;27927:1;27920:9;27880:345;;;-1:-1;47812:126;;47716:232;-1:-1;;;;;;;47716:232;47955:461;;48173:2;48194:17;48187:47;48248:158;48173:2;48162:9;48158:18;48392:6;48248:158;;48423:201;71807:13;;71800:21;30263:34;;48535:2;48520:18;;48506:118;48631:213;30370:37;;;48749:2;48734:18;;48720:124;48851:324;30370:37;;;73643:42;73632:54;49161:2;49146:18;;27180:37;48997:2;48982:18;;48968:207;49182:715;;30400:5;30377:3;30370:37;73643:42;27210:5;73632:54;49585:2;49574:9;49570:18;27180:37;49420:3;49622:2;49611:9;49607:18;49600:48;49662:76;49420:3;49409:9;49405:19;49724:6;49662:76;;;49786:9;49780:4;49776:20;49771:2;49760:9;49756:18;49749:48;49811:76;49882:4;49873:6;49811:76;;49904:324;30370:37;;;50214:2;50199:18;;30370:37;50050:2;50035:18;;50021:207;50235:408;;30400:5;30377:3;30370:37;50399:2;50517;50506:9;50502:18;50495:48;50557:76;50399:2;50388:9;50384:18;50619:6;50557:76;;50650:603;;30400:5;30377:3;30370:37;50860:2;50978;50967:9;50963:18;50956:48;51018:76;50860:2;50849:9;50845:18;51080:6;51018:76;;;51142:9;51136:4;51132:20;51127:2;51116:9;51112:18;51105:48;51167:76;51238:4;51229:6;51167:76;;51260:352;30370:37;;;51420:2;51405:18;;73183:49;73226:5;73183:49;;;75130:40;51598:2;51587:9;51583:18;33754:64;51391:221;;;;;;51619:743;;30400:5;30377:3;30370:37;30400:5;52032:2;52021:9;52017:18;30370:37;73643:42;;73636:5;73632:54;52115:2;52104:9;52100:18;27180:37;73643:42;73636:5;73632:54;52198:2;52187:9;52183:18;27180:37;;51867:3;52235;52224:9;52220:19;52213:49;52276:76;51867:3;51856:9;51852:19;52338:6;52276:76;;52369:435;30370:37;;;52707:2;52692:18;;30370:37;;;;52790:2;52775:18;;30370:37;52543:2;52528:18;;52514:290;52811:539;30370:37;;;73848:4;73837:16;;;;53170:2;53155:18;;44673:35;53253:2;53238:18;;30370:37;53336:2;53321:18;;30370:37;53009:3;52994:19;;52980:370;53357:209;71984:66;71973:78;;;;30767:36;;53473:2;53458:18;;53444:122;53573:320;71984:66;71973:78;;;;30767:36;;73643:42;73632:54;53879:2;53864:18;;27180:37;53717:2;53702:18;;53688:205;53900:297;;54036:2;54057:17;54050:47;54111:76;54036:2;54025:9;54021:18;54173:6;54111:76;;54204:631;;54424:3;54446:17;54439:47;54500:76;54424:3;54413:9;54409:19;54562:6;54500:76;;;73643:42;73632:54;;;54655:2;54640:18;;27180:37;73632:54;;;;54738:2;54723:18;;27180:37;54821:2;54806:18;30370:37;54492:84;54395:440;-1:-1;;54395:440;54842:492;;55024:2;55045:17;55038:47;55099:76;55024:2;55013:9;55009:18;55161:6;55099:76;;;55223:9;55217:4;55213:20;55208:2;55197:9;55193:18;55186:48;55248:76;55319:4;55310:6;55248:76;;55341:603;;55551:2;55572:17;55565:47;55626:72;55551:2;55540:9;55536:18;55684:6;55626:72;;;55746:9;55740:4;55736:20;55731:2;55720:9;55716:18;55709:48;55771:72;55838:4;55829:6;55771:72;;;55763:80;;;73643:42;73636:5;73632:54;55930:2;55919:9;55915:18;27049:58;55522:422;;;;;;;55951:1653;;56414:3;;56436:17;56429:47;56490:72;56414:3;56403:9;56399:19;56548:6;56490:72;;;56610:9;56604:4;56600:20;56595:2;56584:9;56580:18;56573:48;56635:72;56702:4;56693:6;56635:72;;;56627:80;;;56755:9;56749:4;56745:20;56740:2;56729:9;56725:18;56718:48;56780:72;56847:4;56838:6;56780:72;;;56900:9;56894:4;56890:20;56885:2;56874:9;56870:18;56863:48;56925:72;56992:4;56983:6;56925:72;;;73643:42;73632:54;;;57076:3;57061:19;;27180:37;73632:54;;;;57168:3;57153:19;;27049:58;-1:-1;;57252:3;57237:19;;30370:37;;;;57336:3;57321:19;;30370:37;;;;57420:3;57405:19;;30370:37;;;;57504:3;57489:19;;30370:37;57589:3;57574:19;;;30370:37;56917:80;56385:1219;-1:-1;;;;;56385:1219;57611:581;;72164:66;72224:5;72164:66;;;74111:57;32656:3;32649:81;30400:5;58029:2;58018:9;58014:18;30370:37;57834:2;58066;58055:9;58051:18;58044:48;58106:76;57834:2;57823:9;57819:18;58168:6;58106:76;;58199:271;58346:2;58331:18;;72341:64;72399:5;72341:64;;;32842:79;;;58317:153;;58477:473;58670:2;58655:18;;72341:64;72399:5;72341:64;;;33023:69;;;58853:2;58838:18;;30370:37;;;;58936:2;58921:18;;;30370:37;58641:309;;58957:491;59159:2;59144:18;;76846:1;76836:12;;76826:2;;76852:9;76826:2;33203:78;;;59351:2;59336:18;;30370:37;;;;73643:42;73632:54;59434:2;59419:18;;;27180:37;59130:318;;59455:487;59655:2;59640:18;;76846:1;76836:12;;76826:2;;76852:9;59949:503;60157:2;60142:18;;77106:1;77096:12;;77086:2;;77112:9;60459:675;;73183:49;73226:5;73183:49;;;75283:48;34091:3;34084:72;30400:5;60888:2;60877:9;60873:18;30370:37;73643:42;73636:5;73632:54;60971:2;60960:9;60956:18;27180:37;60701:3;61008:2;60997:9;60993:18;60986:48;61048:76;60701:3;60690:9;60686:19;61110:6;61048:76;;61141:372;61311:2;61296:18;;72164:66;72224:5;72164:66;;;34263:74;;;61499:2;61484:18;30370:37;61282:231;;61520:407;61711:2;61725:47;;;34983:2;61696:18;;;70350:19;35019:22;70390:14;;;34999:43;35061:12;;;61682:245;61934:425;;62134:2;62155:17;62148:47;35443:16;35437:23;35371:4;62134:2;62123:9;62119:18;35473:38;35526:149;35362:14;62123:9;35362:14;35656:12;35526:149;;;62134:2;35754:5;35750:16;35744:23;35724:43;;35803:14;62123:9;35807:4;35803:14;;35787;62123:9;35787:14;35780:38;35833:149;35977:4;35963:12;35833:149;;;35787:14;36078:5;36074:16;36068:23;36145:14;62123:9;36145:14;30370:37;36145:14;36251:5;36247:16;36241:23;35371:4;62123:9;36318:14;30370:37;62201:148;;;;;;62105:254;;;;;62366:330;62542:3;62527:19;;62557:129;62531:9;62659:6;62557:129;;62703:358;;62893:3;62882:9;62878:19;62870:27;;38897:117;38999:14;38874:16;38868:23;38897:117;;;39094:4;39087:5;39083:16;39077:23;39106:117;39217:4;39212:3;39208:14;39194:12;39106:117;;;-1:-1;39320:4;39309:16;;39303:23;39389:6;39380:16;;30370:37;39495:4;39484:16;;;39478:23;39564:6;39555:16;;;30370:37;62864:197;;63068:321;39881:23;;63240:2;63225:18;;;73183:49;39881:23;73183:49;;;75130:40;33761:3;33754:64;;40071:4;40064:5;40060:16;40054:23;40071:4;40135:3;40131:14;30370:37;40248:4;40241:5;40237:16;40231:23;40248:4;40312:3;40308:14;30370:37;63211:178;;;;;63396:464;;63588:2;63609:17;63602:47;63663:104;63588:2;63577:9;63573:18;63753:6;63663:104;;;63655:112;;30400:5;63846:2;63835:9;63831:18;30370:37;63559:301;;;;;;63867:659;;64105:2;64126:17;64119:47;64180:104;64105:2;64094:9;64090:18;64270:6;64180:104;;;30400:5;64363:2;64352:9;64348:18;30370:37;64415:9;64409:4;64405:20;64400:2;64389:9;64385:18;64378:48;64440:76;64511:4;64502:6;64440:76;;64533:512;;64749:2;64770:17;64763:47;43535:16;43529:23;64749:2;64738:9;64734:18;30370:37;43717:4;43710:5;43706:16;43700:23;43777:14;64738:9;43777:14;30370:37;64749:2;43868:5;43864:16;43858:23;43935:14;64738:9;43935:14;30370:37;73643:42;43777:14;44031:5;44027:16;44021:23;73632:54;43463:4;64738:9;44098:14;27180:37;43935:14;44185:5;44181:16;44175:23;43463:4;44218:14;64738:9;44218:14;44211:38;44264:67;43454:14;64738:9;43454:14;44312:12;44264:67;;;64816:136;;;30400:5;43717:4;65020:9;65016:18;30370:37;64720:325;;;;;;66045:256;66107:2;66101:9;66133:17;;;66208:18;66193:34;;66229:22;;;66190:62;66187:2;;;66265:1;;66255:12;66187:2;66107;66274:22;66085:216;;-1:-1;66085:216;66308:304;;66467:18;66459:6;66456:30;66453:2;;;-1:-1;;66489:12;66453:2;-1:-1;66534:4;66522:17;;;66587:15;;66390:222;75906:268;75971:1;75978:101;75992:6;75989:1;75986:13;75978:101;;;76059:11;;;76053:18;76040:11;;;76033:39;76014:2;76007:10;75978:101;;;76094:6;76091:1;76088:13;76085:2;;;-1:-1;;75971:1;76141:16;;76134:27;75955:219;76368:124;76470:1;76463:5;76460:12;76450:2;;76476:9;76499:122;76599:1;76592:5;76589:12;76579:2;;76605:9;77135:107;77220:1;77213:5;77210:12;77200:2;;77226:9;77495:117;73643:42;77582:5;73632:54;77557:5;77554:35;77544:2;;77603:1;;77593:12;77861:115;71984:66;77946:5;71973:78;77922:5;77919:34;77909:2;;77967:1;;77957:12;77903:73;1997:11:50;;1992:2;1982:13;;;1972:37;2069:14;;2051:16;;;2041:43;;;;2158:2;2152:9;;962:66;2213:26;;2259:15;;;2252:33;;;;2305:15;;;2298:36;;;;2366:2;2354:15;;2347:32;2411:3;2399:16;;2392:43;2505:3;2487:22;;;1285:1263::o"
}
}
},
"sourceTreeHashHex": "0x53b9e5a81a606e83ec84af5761921029a6d257cae54f9474fd6773bd151df240",
"sources": {
"./Exchange.sol": {
"id": 0,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"./MixinMatchOrders.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinTransferSimulator.sol\";\n\n\n// solhint-disable no-empty-blocks\n// MixinAssetProxyDispatcher, MixinExchangeCore, MixinSignatureValidator,\n// and MixinTransactions are all inherited via the other Mixins that are\n// used.\n/// @dev The 0x Exchange contract.\ncontract Exchange is\n LibEIP712ExchangeDomain,\n MixinMatchOrders,\n MixinWrapperFunctions,\n MixinTransferSimulator\n{\n /// @dev Mixins are instantiated in the order they are inherited\n /// @param chainId Chain ID of the network this contract is deployed on.\n constructor (uint256 chainId)\n public\n LibEIP712ExchangeDomain(chainId, address(0))\n {}\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": {
"id": 37,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712ExchangeDomain {\n\n // EIP712 Exchange Domain Name value\n string constant internal _EIP712_EXCHANGE_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Exchange Domain Version value\n string constant internal _EIP712_EXCHANGE_DOMAIN_VERSION = \"3.0.0\";\n\n // solhint-disable var-name-mixedcase\n /// @dev Hash of the EIP712 Domain Separator data\n /// @return 0 Domain hash.\n bytes32 public EIP712_EXCHANGE_DOMAIN_HASH;\n // solhint-enable var-name-mixedcase\n\n /// @param chainId Chain ID of the network this contract is deployed on.\n /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n constructor (\n uint256 chainId,\n address verifyingContractAddressIfExists\n )\n public\n {\n address verifyingContractAddress = verifyingContractAddressIfExists == address(0) ? address(this) : verifyingContractAddressIfExists;\n EIP712_EXCHANGE_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n _EIP712_EXCHANGE_DOMAIN_NAME,\n _EIP712_EXCHANGE_DOMAIN_VERSION,\n chainId,\n verifyingContractAddress\n );\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibEIP712.sol": {
"id": 50,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n // Hash of the EIP712 Domain Separator Schema\n // keccak256(abi.encodePacked(\n // \"EIP712Domain(\",\n // \"string name,\",\n // \"string version,\",\n // \"uint256 chainId,\",\n // \"address verifyingContract\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev Calculates a EIP712 domain separator.\n /// @param name The EIP712 domain name.\n /// @param version The EIP712 domain version.\n /// @param verifyingContract The EIP712 verifying contract.\n /// @return EIP712 domain separator.\n function hashEIP712Domain(\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n // keccak256(bytes(name)),\n // keccak256(bytes(version)),\n // chainId,\n // uint256(verifyingContract)\n // ))\n\n assembly {\n // Calculate hashes of dynamic data\n let nameHash := keccak256(add(name, 32), mload(name))\n let versionHash := keccak256(add(version, 32), mload(version))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n // Store params in memory\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), nameHash)\n mstore(add(memPtr, 64), versionHash)\n mstore(add(memPtr, 96), chainId)\n mstore(add(memPtr, 128), verifyingContract)\n\n // Compute hash\n result := keccak256(memPtr, 160)\n }\n return result;\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n /// @param eip712DomainHash Hash of the domain domain separator data, computed\n /// with getDomainHash().\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to the given EIP712 Domain.\n function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n internal\n pure\n returns (bytes32 result)\n {\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n"
},
"./MixinMatchOrders.sol": {
"id": 3,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IMatchOrders.sol\";\nimport \"./MixinExchangeCore.sol\";\n\n\ncontract MixinMatchOrders is\n MixinExchangeCore,\n IMatchOrders\n{\n using LibBytes for bytes;\n using LibSafeMath for uint256;\n using LibOrder for LibOrder.Order;\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n return _batchMatchOrders(\n leftOrders,\n rightOrders,\n leftSignatures,\n rightSignatures,\n false\n );\n }\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrdersWithMaximalFill(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n return _batchMatchOrders(\n leftOrders,\n rightOrders,\n leftSignatures,\n rightSignatures,\n true\n );\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n return _matchOrders(\n leftOrder,\n rightOrder,\n leftSignature,\n rightSignature,\n false\n );\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n function matchOrdersWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n return _matchOrders(\n leftOrder,\n rightOrder,\n leftSignature,\n rightSignature,\n true\n );\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderHash First matched order hash.\n /// @param rightOrderHash Second matched order hash.\n function _assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n if (leftOrder.makerAssetAmount.safeMul(rightOrder.makerAssetAmount) <\n leftOrder.takerAssetAmount.safeMul(rightOrder.takerAssetAmount)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.NegativeSpreadError(\n leftOrderHash,\n rightOrderHash\n ));\n }\n }\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// This is the reentrant version of `batchMatchOrders` and `batchMatchOrdersWithMaximalFill`.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @param shouldMaximallyFillOrders A value that indicates whether or not the order matching\n /// should be done with maximal fill.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function _batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures,\n bool shouldMaximallyFillOrders\n )\n internal\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n // Ensure that the left and right orders have nonzero lengths.\n if (leftOrders.length == 0) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.ZERO_LEFT_ORDERS\n ));\n }\n if (rightOrders.length == 0) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.ZERO_RIGHT_ORDERS\n ));\n }\n\n // Ensure that the left and right arrays are compatible.\n if (leftOrders.length != leftSignatures.length) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.INVALID_LENGTH_LEFT_SIGNATURES\n ));\n }\n if (rightOrders.length != rightSignatures.length) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.INVALID_LENGTH_RIGHT_SIGNATURES\n ));\n }\n\n batchMatchedFillResults.left = new LibFillResults.FillResults[](leftOrders.length);\n batchMatchedFillResults.right = new LibFillResults.FillResults[](rightOrders.length);\n\n // Set up initial indices.\n uint256 leftIdx = 0;\n uint256 rightIdx = 0;\n\n // Keep local variables for orders, order filled amounts, and signatures for efficiency.\n LibOrder.Order memory leftOrder = leftOrders[0];\n LibOrder.Order memory rightOrder = rightOrders[0];\n (, uint256 leftOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(leftOrder);\n (, uint256 rightOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(rightOrder);\n LibFillResults.FillResults memory leftFillResults;\n LibFillResults.FillResults memory rightFillResults;\n\n // Loop infinitely (until broken inside of the loop), but keep a counter of how\n // many orders have been matched.\n for (;;) {\n // Match the two orders that are pointed to by the left and right indices\n LibFillResults.MatchedFillResults memory matchResults = _matchOrders(\n leftOrder,\n rightOrder,\n leftSignatures[leftIdx],\n rightSignatures[rightIdx],\n shouldMaximallyFillOrders\n );\n\n // Update the order filled amounts with the updated takerAssetFilledAmount\n leftOrderTakerAssetFilledAmount = leftOrderTakerAssetFilledAmount.safeAdd(matchResults.left.takerAssetFilledAmount);\n rightOrderTakerAssetFilledAmount = rightOrderTakerAssetFilledAmount.safeAdd(matchResults.right.takerAssetFilledAmount);\n\n // Aggregate the new fill results with the previous fill results for the current orders.\n leftFillResults = LibFillResults.addFillResults(\n leftFillResults,\n matchResults.left\n );\n rightFillResults = LibFillResults.addFillResults(\n rightFillResults,\n matchResults.right\n );\n\n // Update the profit in the left and right maker assets using the profits from\n // the match.\n batchMatchedFillResults.profitInLeftMakerAsset = batchMatchedFillResults.profitInLeftMakerAsset.safeAdd(\n matchResults.profitInLeftMakerAsset\n );\n batchMatchedFillResults.profitInRightMakerAsset = batchMatchedFillResults.profitInRightMakerAsset.safeAdd(\n matchResults.profitInRightMakerAsset\n );\n\n // If the leftOrder is filled, update the leftIdx, leftOrder, and leftSignature,\n // or break out of the loop if there are no more leftOrders to match.\n if (leftOrderTakerAssetFilledAmount >= leftOrder.takerAssetAmount) {\n // Update the batched fill results once the leftIdx is updated.\n batchMatchedFillResults.left[leftIdx++] = leftFillResults;\n // Clear the intermediate fill results value.\n leftFillResults = LibFillResults.FillResults(0, 0, 0, 0, 0);\n\n // If all of the left orders have been filled, break out of the loop.\n // Otherwise, update the current right order.\n if (leftIdx == leftOrders.length) {\n // Update the right batched fill results\n batchMatchedFillResults.right[rightIdx] = rightFillResults;\n break;\n } else {\n leftOrder = leftOrders[leftIdx];\n (, leftOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(leftOrder);\n }\n }\n\n // If the rightOrder is filled, update the rightIdx, rightOrder, and rightSignature,\n // or break out of the loop if there are no more rightOrders to match.\n if (rightOrderTakerAssetFilledAmount >= rightOrder.takerAssetAmount) {\n // Update the batched fill results once the rightIdx is updated.\n batchMatchedFillResults.right[rightIdx++] = rightFillResults;\n // Clear the intermediate fill results value.\n rightFillResults = LibFillResults.FillResults(0, 0, 0, 0, 0);\n\n // If all of the right orders have been filled, break out of the loop.\n // Otherwise, update the current right order.\n if (rightIdx == rightOrders.length) {\n // Update the left batched fill results\n batchMatchedFillResults.left[leftIdx] = leftFillResults;\n break;\n } else {\n rightOrder = rightOrders[rightIdx];\n (, rightOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(rightOrder);\n }\n }\n }\n\n // Return the fill results from the batch match\n return batchMatchedFillResults;\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders). This\n /// function is needed to allow for reentrant order matching (used by `batchMatchOrders` and\n /// `batchMatchOrdersWithMaximalFill`).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @param shouldMaximallyFillOrders Indicates whether or not the maximal fill matching strategy should be used\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function _matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature,\n bool shouldMaximallyFillOrders\n )\n internal\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData\n // by pointing these values to the same location in memory. This is cheaper than checking equality.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = _getCurrentContextAddress();\n\n // Either our context is valid or we revert\n _assertFillableOrder(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n leftSignature\n );\n _assertFillableOrder(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n rightSignature\n );\n _assertValidMatch(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderHash,\n rightOrderInfo.orderHash\n );\n\n // Compute proportional fill amounts\n matchedFillResults = LibFillResults.calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount,\n protocolFeeMultiplier,\n tx.gasprice,\n shouldMaximallyFillOrders\n );\n\n // Update exchange state\n _updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n _updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n\n // Settle matched orders. Succeeds or throws.\n _settleMatchedOrders(\n leftOrderInfo.orderHash,\n rightOrderInfo.orderHash,\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrderHash First matched order hash.\n /// @param rightOrderHash Second matched order hash.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function _settleMatchedOrders(\n bytes32 leftOrderHash,\n bytes32 rightOrderHash,\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n internal\n {\n address leftMakerAddress = leftOrder.makerAddress;\n address rightMakerAddress = rightOrder.makerAddress;\n address leftFeeRecipientAddress = leftOrder.feeRecipientAddress;\n address rightFeeRecipientAddress = rightOrder.feeRecipientAddress;\n\n // Right maker asset -> left maker\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerAssetData,\n rightMakerAddress,\n leftMakerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n\n // Left maker asset -> right maker\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerAssetData,\n leftMakerAddress,\n rightMakerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Right maker fee -> right fee recipient\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerFeeAssetData,\n rightMakerAddress,\n rightFeeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Left maker fee -> left fee recipient\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerFeeAssetData,\n leftMakerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n\n // Settle taker profits.\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerAssetData,\n leftMakerAddress,\n takerAddress,\n matchedFillResults.profitInLeftMakerAsset\n );\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerAssetData,\n rightMakerAddress,\n takerAddress,\n matchedFillResults.profitInRightMakerAsset\n );\n\n // Pay protocol fees for each maker\n bool didPayProtocolFees = _payTwoProtocolFees(\n leftOrderHash,\n rightOrderHash,\n matchedFillResults.left.protocolFeePaid,\n leftMakerAddress,\n rightMakerAddress,\n takerAddress\n );\n\n // Protocol fees are not paid if the protocolFeeCollector contract is not set\n if (!didPayProtocolFees) {\n matchedFillResults.left.protocolFeePaid = 0;\n matchedFillResults.right.protocolFeePaid = 0;\n }\n\n // Settle taker fees.\n if (\n leftFeeRecipientAddress == rightFeeRecipientAddress &&\n leftOrder.takerFeeAssetData.equals(rightOrder.takerFeeAssetData)\n ) {\n // Fee recipients and taker fee assets are identical, so we can\n // transfer them in one go.\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.takerFeeAssetData,\n takerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.takerFeePaid.safeAdd(matchedFillResults.right.takerFeePaid)\n );\n } else {\n // Right taker fee -> right fee recipient\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.takerFeeAssetData,\n takerAddress,\n rightFeeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n\n // Left taker fee -> left fee recipient\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.takerFeeAssetData,\n takerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n }\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibBytes.sol": {
"id": 47,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": {
"id": 48,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
"id": 53,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR =\n 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(\n string memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": {
"id": 42,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n using LibOrder for Order;\n\n // Hash for the EIP712 Order Schema:\n // keccak256(abi.encodePacked(\n // \"Order(\",\n // \"address makerAddress,\",\n // \"address takerAddress,\",\n // \"address feeRecipientAddress,\",\n // \"address senderAddress,\",\n // \"uint256 makerAssetAmount,\",\n // \"uint256 takerAssetAmount,\",\n // \"uint256 makerFee,\",\n // \"uint256 takerFee,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 salt,\",\n // \"bytes makerAssetData,\",\n // \"bytes takerAssetData,\",\n // \"bytes makerFeeAssetData,\",\n // \"bytes takerFeeAssetData\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n 0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's status is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n /// @dev Canonical order structure.\n struct Order {\n address makerAddress; // Address that created the order.\n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n address feeRecipientAddress; // Address that will recieve fees when order is filled.\n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.\n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.\n uint256 makerFee; // Fee paid to feeRecipient by maker when order is filled.\n uint256 takerFee; // Fee paid to feeRecipient by taker when order is filled.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.\n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.\n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n bytes makerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n }\n // solhint-enable max-line-length\n\n /// @dev Order information returned by `getOrderInfo()`.\n struct OrderInfo {\n OrderStatus orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n /// @param order The order structure.\n /// @return EIP712 typed data hash of the order.\n function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 orderHash)\n {\n orderHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n order.getStructHash()\n );\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order struct.\n /// @param order The order structure.\n /// @return EIP712 hash of the order struct.\n function getStructHash(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n bytes memory makerAssetData = order.makerAssetData;\n bytes memory takerAssetData = order.takerAssetData;\n bytes memory makerFeeAssetData = order.makerFeeAssetData;\n bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // uint256(order.makerAddress),\n // uint256(order.takerAddress),\n // uint256(order.feeRecipientAddress),\n // uint256(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData),\n // keccak256(order.makerFeeAssetData),\n // keccak256(order.takerFeeAssetData)\n // ));\n\n assembly {\n // Assert order offset (this is an internal error that should never be triggered)\n if lt(order, 32) {\n invalid()\n }\n\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n let pos4 := add(order, 384)\n let pos5 := add(order, 416)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n let temp4 := mload(pos4)\n let temp5 := mload(pos5)\n\n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData\n mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData\n mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData\n mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData\n result := keccak256(pos1, 480)\n\n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n mstore(pos4, temp4)\n mstore(pos5, temp5)\n }\n return result;\n }\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": {
"id": 39,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibMath.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibFillResults {\n\n using LibSafeMath for uint256;\n\n struct BatchMatchedFillResults {\n FillResults[] left; // Fill results for left orders\n FillResults[] right; // Fill results for right orders\n uint256 profitInLeftMakerAsset; // Profit taken from left makers\n uint256 profitInRightMakerAsset; // Profit taken from right makers\n }\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of fees paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of fees paid by taker to feeRecipients(s).\n uint256 protocolFeePaid; // Total amount of fees paid by taker to the staking contract.\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 profitInLeftMakerAsset; // Profit taken from the left maker\n uint256 profitInRightMakerAsset; // Profit taken from the right maker\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill.\n fillResults.protocolFeePaid = gasPrice.safeMul(protocolFeeMultiplier);\n\n return fillResults;\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @param shouldMaximallyFillOrders A value that indicates whether or not this calculation should use\n /// the maximal fill order matching strategy.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice,\n bool shouldMaximallyFillOrders\n )\n internal\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Derive maker asset amounts for left & right orders, given store taker assert amounts\n uint256 leftTakerAssetAmountRemaining = leftOrder.takerAssetAmount.safeSub(leftOrderTakerAssetFilledAmount);\n uint256 leftMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n leftTakerAssetAmountRemaining\n );\n uint256 rightTakerAssetAmountRemaining = rightOrder.takerAssetAmount.safeSub(rightOrderTakerAssetFilledAmount);\n uint256 rightMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetAmountRemaining\n );\n\n // Maximally fill the orders and pay out profits to the matcher in one or both of the maker assets.\n if (shouldMaximallyFillOrders) {\n matchedFillResults = _calculateMatchedFillResultsWithMaximalFill(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else {\n matchedFillResults = _calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Compute fees for left order\n matchedFillResults.left.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.makerAssetFilledAmount,\n leftOrder.makerAssetAmount,\n leftOrder.makerFee\n );\n matchedFillResults.left.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.takerAssetFilledAmount,\n leftOrder.takerAssetAmount,\n leftOrder.takerFee\n );\n\n // Compute fees for right order\n matchedFillResults.right.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.makerAssetFilledAmount,\n rightOrder.makerAssetAmount,\n rightOrder.makerFee\n );\n matchedFillResults.right.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.takerAssetFilledAmount,\n rightOrder.takerAssetAmount,\n rightOrder.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill. In this\n // case this should be made the protocol fee for both the left and right orders.\n uint256 protocolFee = gasPrice.safeMul(protocolFeeMultiplier);\n matchedFillResults.left.protocolFeePaid = protocolFee;\n matchedFillResults.right.protocolFeePaid = protocolFee;\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// @param fillResults1 The first FillResults.\n /// @param fillResults2 The second FillResults.\n /// @return The sum of both fill results.\n function addFillResults(\n FillResults memory fillResults1,\n FillResults memory fillResults2\n )\n internal\n pure\n returns (FillResults memory totalFillResults)\n {\n totalFillResults.makerAssetFilledAmount = fillResults1.makerAssetFilledAmount.safeAdd(fillResults2.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = fillResults1.takerAssetFilledAmount.safeAdd(fillResults2.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = fillResults1.makerFeePaid.safeAdd(fillResults2.makerFeePaid);\n totalFillResults.takerFeePaid = fillResults1.takerFeePaid.safeAdd(fillResults2.takerFeePaid);\n totalFillResults.protocolFeePaid = fillResults1.protocolFeePaid.safeAdd(fillResults2.protocolFeePaid);\n\n return totalFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the fill strategy that only\n /// awards profit denominated in the left maker asset.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate fill results for maker and taker assets: at least one order will be fully filled.\n // The maximum amount the left maker can buy is `leftTakerAssetAmountRemaining`\n // The maximum amount the right maker can sell is `rightMakerAssetAmountRemaining`\n // We have two distinct cases for calculating the fill results:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // If the left maker can buy exactly what the right maker can sell, then both orders are fully filled.\n // Case 2.\n // If the left maker cannot buy more than the right maker can sell, then only the left order is fully filled.\n // Case 3.\n // If the left maker can buy exactly as much as the right maker can sell, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (leftTakerAssetAmountRemaining < rightMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round up to ensure the maker's exchange rate does not exceed the price specified by the order.\n // We favor the maker when the exchange rate must be rounded.\n matchedFillResults.right.takerAssetFilledAmount = LibMath.safeGetPartialAmountCeil(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetAmountRemaining // matchedFillResults.right.makerAssetFilledAmount\n );\n } else {\n // leftTakerAssetAmountRemaining == rightMakerAssetAmountRemaining\n // Case 3: Both orders are fully filled. Technically, this could be captured by the above cases, but\n // this calculation will be more precise since it does not include rounding.\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n return matchedFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the maximal fill order matching\n /// strategy.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResultsWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // If a maker asset is greater than the opposite taker asset, than there will be a spread denominated in that maker asset.\n bool doesLeftMakerAssetProfitExist = leftMakerAssetAmountRemaining > rightTakerAssetAmountRemaining;\n bool doesRightMakerAssetProfitExist = rightMakerAssetAmountRemaining > leftTakerAssetAmountRemaining;\n\n // Calculate the maximum fill results for the maker and taker assets. At least one of the orders will be fully filled.\n //\n // The maximum that the left maker can possibly buy is the amount that the right order can sell.\n // The maximum that the right maker can possibly buy is the amount that the left order can sell.\n //\n // If the left order is fully filled, profit will be paid out in the left maker asset. If the right order is fully filled,\n // the profit will be out in the right maker asset.\n //\n // There are three cases to consider:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // Case 2.\n // If the right maker can buy more than the left maker can sell, then only the right order is fully filled.\n // Case 3.\n // If the right maker can sell the max of what the left maker can buy and the left maker can sell the max of\n // what the right maker can buy, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled with the profit paid in the left makerAsset\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (rightTakerAssetAmountRemaining > leftMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled with the profit paid in the right makerAsset.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round down to ensure the right maker's exchange rate does not exceed the price specified by the order.\n // We favor the right maker when the exchange rate must be rounded and the profit is being paid in the\n // right maker asset.\n matchedFillResults.right.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n leftMakerAssetAmountRemaining\n );\n matchedFillResults.right.takerAssetFilledAmount = leftMakerAssetAmountRemaining;\n } else {\n // Case 3: The right and left orders are fully filled\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker in the left order's maker asset if the left spread will be part of the profit.\n if (doesLeftMakerAssetProfitExist) {\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n }\n\n // Calculate amount given to taker in the right order's maker asset if the right spread will be part of the profit.\n if (doesRightMakerAssetProfitExist) {\n matchedFillResults.profitInRightMakerAsset = matchedFillResults.right.makerAssetFilledAmount.safeSub(\n matchedFillResults.left.takerAssetFilledAmount\n );\n }\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order. Both orders will be fully filled in this\n /// case.\n /// @param leftMakerAssetAmountRemaining The amount of the left maker asset that is remaining to be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left taker asset that is remaining to be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteFillBoth(\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate the fully filled results for both orders.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order.\n /// @param leftOrder The left order that is being maximally filled. All of the information about fill amounts\n /// can be derived from this order and the right asset remaining fields.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteRightFill(\n LibOrder.Order memory leftOrder,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = rightMakerAssetAmountRemaining;\n // Round down to ensure the left maker's exchange rate does not exceed the price specified by the order.\n // We favor the left maker when the exchange rate must be rounded and the profit is being paid in the\n // left maker asset.\n matchedFillResults.left.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n rightMakerAssetAmountRemaining\n );\n\n return matchedFillResults;\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
"id": 54,
"content": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": {
"id": 55,
"content": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibMath.sol": {
"id": 40,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n using LibSafeMath for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": {
"id": 41,
"content": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol": {
"id": 38,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibExchangeRichErrors {\n\n enum AssetProxyDispatchErrorCodes {\n INVALID_ASSET_DATA_LENGTH,\n UNKNOWN_ASSET_PROXY\n }\n\n enum BatchMatchOrdersErrorCodes {\n ZERO_LEFT_ORDERS,\n ZERO_RIGHT_ORDERS,\n INVALID_LENGTH_LEFT_SIGNATURES,\n INVALID_LENGTH_RIGHT_SIGNATURES\n }\n\n enum ExchangeContextErrorCodes {\n INVALID_MAKER,\n INVALID_TAKER,\n INVALID_SENDER\n }\n\n enum FillErrorCodes {\n INVALID_TAKER_AMOUNT,\n TAKER_OVERPAY,\n OVERFILL,\n INVALID_FILL_PRICE\n }\n\n enum SignatureErrorCodes {\n BAD_ORDER_SIGNATURE,\n BAD_TRANSACTION_SIGNATURE,\n INVALID_LENGTH,\n UNSUPPORTED,\n ILLEGAL,\n INAPPROPRIATE_SIGNATURE_TYPE,\n INVALID_SIGNER\n }\n\n enum TransactionErrorCodes {\n ALREADY_EXECUTED,\n EXPIRED\n }\n\n enum IncompleteFillErrorCode {\n INCOMPLETE_MARKET_BUY_ORDERS,\n INCOMPLETE_MARKET_SELL_ORDERS,\n INCOMPLETE_FILL_ORDER\n }\n\n // bytes4(keccak256(\"SignatureError(uint8,bytes32,address,bytes)\"))\n bytes4 internal constant SIGNATURE_ERROR_SELECTOR =\n 0x7e5a2318;\n\n // bytes4(keccak256(\"SignatureValidatorNotApprovedError(address,address)\"))\n bytes4 internal constant SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR =\n 0xa15c0d06;\n\n // bytes4(keccak256(\"EIP1271SignatureError(address,bytes,bytes,bytes)\"))\n bytes4 internal constant EIP1271_SIGNATURE_ERROR_SELECTOR =\n 0x5bd0428d;\n\n // bytes4(keccak256(\"SignatureWalletError(bytes32,address,bytes,bytes)\"))\n bytes4 internal constant SIGNATURE_WALLET_ERROR_SELECTOR =\n 0x1b8388f7;\n\n // bytes4(keccak256(\"OrderStatusError(bytes32,uint8)\"))\n bytes4 internal constant ORDER_STATUS_ERROR_SELECTOR =\n 0xfdb6ca8d;\n\n // bytes4(keccak256(\"ExchangeInvalidContextError(uint8,bytes32,address)\"))\n bytes4 internal constant EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xe53c76c8;\n\n // bytes4(keccak256(\"FillError(uint8,bytes32)\"))\n bytes4 internal constant FILL_ERROR_SELECTOR =\n 0xe94a7ed0;\n\n // bytes4(keccak256(\"OrderEpochError(address,address,uint256)\"))\n bytes4 internal constant ORDER_EPOCH_ERROR_SELECTOR =\n 0x4ad31275;\n\n // bytes4(keccak256(\"AssetProxyExistsError(bytes4,address)\"))\n bytes4 internal constant ASSET_PROXY_EXISTS_ERROR_SELECTOR =\n 0x11c7b720;\n\n // bytes4(keccak256(\"AssetProxyDispatchError(uint8,bytes32,bytes)\"))\n bytes4 internal constant ASSET_PROXY_DISPATCH_ERROR_SELECTOR =\n 0x488219a6;\n\n // bytes4(keccak256(\"AssetProxyTransferError(bytes32,bytes,bytes)\"))\n bytes4 internal constant ASSET_PROXY_TRANSFER_ERROR_SELECTOR =\n 0x4678472b;\n\n // bytes4(keccak256(\"NegativeSpreadError(bytes32,bytes32)\"))\n bytes4 internal constant NEGATIVE_SPREAD_ERROR_SELECTOR =\n 0xb6555d6f;\n\n // bytes4(keccak256(\"TransactionError(uint8,bytes32)\"))\n bytes4 internal constant TRANSACTION_ERROR_SELECTOR =\n 0xf5985184;\n\n // bytes4(keccak256(\"TransactionExecutionError(bytes32,bytes)\"))\n bytes4 internal constant TRANSACTION_EXECUTION_ERROR_SELECTOR =\n 0x20d11f61;\n \n // bytes4(keccak256(\"TransactionGasPriceError(bytes32,uint256,uint256)\"))\n bytes4 internal constant TRANSACTION_GAS_PRICE_ERROR_SELECTOR =\n 0xa26dac09;\n\n // bytes4(keccak256(\"TransactionInvalidContextError(bytes32,address)\"))\n bytes4 internal constant TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xdec4aedf;\n\n // bytes4(keccak256(\"IncompleteFillError(uint8,uint256,uint256)\"))\n bytes4 internal constant INCOMPLETE_FILL_ERROR_SELECTOR =\n 0x18e4b141;\n\n // bytes4(keccak256(\"BatchMatchOrdersError(uint8)\"))\n bytes4 internal constant BATCH_MATCH_ORDERS_ERROR_SELECTOR =\n 0xd4092f4f;\n\n // bytes4(keccak256(\"PayProtocolFeeError(bytes32,uint256,address,address,bytes)\"))\n bytes4 internal constant PAY_PROTOCOL_FEE_ERROR_SELECTOR =\n 0x87cb1e75;\n\n // solhint-disable func-name-mixedcase\n function SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureValidatorNotApprovedErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR;\n }\n\n function EIP1271SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EIP1271_SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureWalletErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_WALLET_ERROR_SELECTOR;\n }\n\n function OrderStatusErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_STATUS_ERROR_SELECTOR;\n }\n\n function ExchangeInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function FillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return FILL_ERROR_SELECTOR;\n }\n\n function OrderEpochErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_EPOCH_ERROR_SELECTOR;\n }\n\n function AssetProxyExistsErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_EXISTS_ERROR_SELECTOR;\n }\n\n function AssetProxyDispatchErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_DISPATCH_ERROR_SELECTOR;\n }\n\n function AssetProxyTransferErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_TRANSFER_ERROR_SELECTOR;\n }\n\n function NegativeSpreadErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return NEGATIVE_SPREAD_ERROR_SELECTOR;\n }\n\n function TransactionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_ERROR_SELECTOR;\n }\n\n function TransactionExecutionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_EXECUTION_ERROR_SELECTOR;\n }\n\n function IncompleteFillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return INCOMPLETE_FILL_ERROR_SELECTOR;\n }\n\n function BatchMatchOrdersErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return BATCH_MATCH_ORDERS_ERROR_SELECTOR;\n }\n\n function TransactionGasPriceErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_GAS_PRICE_ERROR_SELECTOR;\n }\n\n function TransactionInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function PayProtocolFeeErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return PAY_PROTOCOL_FEE_ERROR_SELECTOR;\n }\n \n function BatchMatchOrdersError(\n BatchMatchOrdersErrorCodes errorCode\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n BATCH_MATCH_ORDERS_ERROR_SELECTOR,\n errorCode\n );\n }\n\n function SignatureError(\n SignatureErrorCodes errorCode,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_ERROR_SELECTOR,\n errorCode,\n hash,\n signerAddress,\n signature\n );\n }\n\n function SignatureValidatorNotApprovedError(\n address signerAddress,\n address validatorAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR,\n signerAddress,\n validatorAddress\n );\n }\n\n function EIP1271SignatureError(\n address verifyingContractAddress,\n bytes memory data,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EIP1271_SIGNATURE_ERROR_SELECTOR,\n verifyingContractAddress,\n data,\n signature,\n errorData\n );\n }\n\n function SignatureWalletError(\n bytes32 hash,\n address walletAddress,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_WALLET_ERROR_SELECTOR,\n hash,\n walletAddress,\n signature,\n errorData\n );\n }\n\n function OrderStatusError(\n bytes32 orderHash,\n LibOrder.OrderStatus orderStatus\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_STATUS_ERROR_SELECTOR,\n orderHash,\n orderStatus\n );\n }\n\n function ExchangeInvalidContextError(\n ExchangeContextErrorCodes errorCode,\n bytes32 orderHash,\n address contextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR,\n errorCode,\n orderHash,\n contextAddress\n );\n }\n\n function FillError(\n FillErrorCodes errorCode,\n bytes32 orderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n FILL_ERROR_SELECTOR,\n errorCode,\n orderHash\n );\n }\n\n function OrderEpochError(\n address makerAddress,\n address orderSenderAddress,\n uint256 currentEpoch\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_EPOCH_ERROR_SELECTOR,\n makerAddress,\n orderSenderAddress,\n currentEpoch\n );\n }\n\n function AssetProxyExistsError(\n bytes4 assetProxyId,\n address assetProxyAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_EXISTS_ERROR_SELECTOR,\n assetProxyId,\n assetProxyAddress\n );\n }\n\n function AssetProxyDispatchError(\n AssetProxyDispatchErrorCodes errorCode,\n bytes32 orderHash,\n bytes memory assetData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_DISPATCH_ERROR_SELECTOR,\n errorCode,\n orderHash,\n assetData\n );\n }\n\n function AssetProxyTransferError(\n bytes32 orderHash,\n bytes memory assetData,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_TRANSFER_ERROR_SELECTOR,\n orderHash,\n assetData,\n errorData\n );\n }\n\n function NegativeSpreadError(\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n NEGATIVE_SPREAD_ERROR_SELECTOR,\n leftOrderHash,\n rightOrderHash\n );\n }\n\n function TransactionError(\n TransactionErrorCodes errorCode,\n bytes32 transactionHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_ERROR_SELECTOR,\n errorCode,\n transactionHash\n );\n }\n\n function TransactionExecutionError(\n bytes32 transactionHash,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_EXECUTION_ERROR_SELECTOR,\n transactionHash,\n errorData\n );\n }\n\n function TransactionGasPriceError(\n bytes32 transactionHash,\n uint256 actualGasPrice,\n uint256 requiredGasPrice\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_GAS_PRICE_ERROR_SELECTOR,\n transactionHash,\n actualGasPrice,\n requiredGasPrice\n );\n }\n\n function TransactionInvalidContextError(\n bytes32 transactionHash,\n address currentContextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR,\n transactionHash,\n currentContextAddress\n );\n }\n\n function IncompleteFillError(\n IncompleteFillErrorCode errorCode,\n uint256 expectedAssetFillAmount,\n uint256 actualAssetFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INCOMPLETE_FILL_ERROR_SELECTOR,\n errorCode,\n expectedAssetFillAmount,\n actualAssetFillAmount\n );\n }\n\n function PayProtocolFeeError(\n bytes32 orderHash,\n uint256 protocolFee,\n address makerAddress,\n address takerAddress,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n PAY_PROTOCOL_FEE_ERROR_SELECTOR,\n orderHash,\n protocolFee,\n makerAddress,\n takerAddress,\n errorData\n );\n }\n}\n"
},
"./interfaces/IMatchOrders.sol": {
"id": 15,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrdersWithMaximalFill(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults);\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n function matchOrdersWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n"
},
"./MixinExchangeCore.sol": {
"id": 2,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/Refundable.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IExchangeCore.sol\";\nimport \"./MixinAssetProxyDispatcher.sol\";\nimport \"./MixinProtocolFees.sol\";\nimport \"./MixinSignatureValidator.sol\";\n\n\ncontract MixinExchangeCore is\n IExchangeCore,\n Refundable,\n LibEIP712ExchangeDomain,\n MixinAssetProxyDispatcher,\n MixinProtocolFees,\n MixinSignatureValidator\n{\n using LibOrder for LibOrder.Order;\n using LibSafeMath for uint256;\n using LibBytes for bytes;\n\n /// @dev Mapping of orderHash => amount of takerAsset already bought by maker\n /// @param 0 Order hash.\n /// @return 0 The amount of taker asset filled.\n mapping (bytes32 => uint256) public filled;\n\n /// @dev Mapping of orderHash => cancelled\n /// @param 0 Order hash.\n /// @return 0 Whether the order was cancelled.\n mapping (bytes32 => bool) public cancelled;\n\n /// @dev Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n /// Orders with specified senderAddress and with a salt less than their epoch are considered cancelled\n /// @param 0 Address of the order's maker.\n /// @param 1 Address of the order's sender.\n /// @return 0 Minimum valid order epoch.\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n payable\n refundFinalBalanceNoReentry\n {\n address makerAddress = _getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address orderSenderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1;\n uint256 oldOrderEpoch = orderEpoch[makerAddress][orderSenderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n if (newOrderEpoch <= oldOrderEpoch) {\n LibRichErrors.rrevert(LibExchangeRichErrors.OrderEpochError(\n makerAddress,\n orderSenderAddress,\n oldOrderEpoch\n ));\n }\n\n // Update orderEpoch\n orderEpoch[makerAddress][orderSenderAddress] = newOrderEpoch;\n emit CancelUpTo(\n makerAddress,\n orderSenderAddress,\n newOrderEpoch\n );\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.FillResults memory fillResults)\n {\n fillResults = _fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public\n payable\n refundFinalBalanceNoReentry\n {\n _cancelOrder(order);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return orderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo)\n {\n // Compute the order hash and fetch the amount of takerAsset that has already been filled\n (orderInfo.orderHash, orderInfo.orderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(order);\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = LibOrder.OrderStatus.INVALID_MAKER_ASSET_AMOUNT;\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = LibOrder.OrderStatus.INVALID_TAKER_ASSET_AMOUNT;\n return orderInfo;\n }\n\n // Validate order availability\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = LibOrder.OrderStatus.FULLY_FILLED;\n return orderInfo;\n }\n\n // Validate order expiration\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = LibOrder.OrderStatus.EXPIRED;\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = LibOrder.OrderStatus.CANCELLED;\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = LibOrder.OrderStatus.CANCELLED;\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = LibOrder.OrderStatus.FILLABLE;\n return orderInfo;\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function _fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (LibFillResults.FillResults memory fillResults)\n {\n // Fetch order info\n LibOrder.OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = _getCurrentContextAddress();\n\n // Assert that the order is fillable by taker\n _assertFillableOrder(\n order,\n orderInfo,\n takerAddress,\n signature\n );\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = order.takerAssetAmount.safeSub(orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = LibSafeMath.min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Compute proportional fill amounts\n fillResults = LibFillResults.calculateFillResults(\n order,\n takerAssetFilledAmount,\n protocolFeeMultiplier,\n tx.gasprice\n );\n\n bytes32 orderHash = orderInfo.orderHash;\n\n // Update exchange internal state\n _updateFilledState(\n order,\n takerAddress,\n orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n\n // Settle order\n _settleOrder(\n orderHash,\n order,\n takerAddress,\n fillResults\n );\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function _cancelOrder(LibOrder.Order memory order)\n internal\n {\n // Fetch current order status\n LibOrder.OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n _assertValidCancel(order, orderInfo);\n\n // Noop if order is already unfillable\n if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE) {\n return;\n }\n\n // Perform cancel\n _updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n function _updateFilledState(\n LibOrder.Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n LibFillResults.FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = orderTakerAssetFilledAmount.safeAdd(fillResults.takerAssetFilledAmount);\n\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n order.makerAssetData,\n order.takerAssetData,\n order.makerFeeAssetData,\n order.takerFeeAssetData,\n orderHash,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n fillResults.protocolFeePaid\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function _updateCancelledState(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n order.makerAssetData,\n order.takerAssetData,\n msg.sender,\n orderHash\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param signature Proof that the orders was created by its maker.\n function _assertFillableOrder(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo,\n address takerAddress,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE) {\n LibRichErrors.rrevert(LibExchangeRichErrors.OrderStatusError(\n orderInfo.orderHash,\n LibOrder.OrderStatus(orderInfo.orderStatus)\n ));\n }\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n if (order.senderAddress != msg.sender) {\n LibRichErrors.rrevert(LibExchangeRichErrors.ExchangeInvalidContextError(\n LibExchangeRichErrors.ExchangeContextErrorCodes.INVALID_SENDER,\n orderInfo.orderHash,\n msg.sender\n ));\n }\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n if (order.takerAddress != takerAddress) {\n LibRichErrors.rrevert(LibExchangeRichErrors.ExchangeInvalidContextError(\n LibExchangeRichErrors.ExchangeContextErrorCodes.INVALID_TAKER,\n orderInfo.orderHash,\n takerAddress\n ));\n }\n }\n\n // Validate signature\n if (!_isValidOrderWithHashSignature(\n order,\n orderInfo.orderHash,\n signature\n )\n ) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.BAD_ORDER_SIGNATURE,\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ));\n }\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function _assertValidCancel(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n if (order.senderAddress != msg.sender) {\n LibRichErrors.rrevert(LibExchangeRichErrors.ExchangeInvalidContextError(\n LibExchangeRichErrors.ExchangeContextErrorCodes.INVALID_SENDER,\n orderInfo.orderHash,\n msg.sender\n ));\n }\n }\n\n // Validate transaction signed by maker\n address makerAddress = _getCurrentContextAddress();\n if (order.makerAddress != makerAddress) {\n LibRichErrors.rrevert(LibExchangeRichErrors.ExchangeInvalidContextError(\n LibExchangeRichErrors.ExchangeContextErrorCodes.INVALID_MAKER,\n orderInfo.orderHash,\n makerAddress\n ));\n }\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param orderHash The order hash.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function _settleOrder(\n bytes32 orderHash,\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n internal\n {\n // Transfer taker -> maker\n _dispatchTransferFrom(\n orderHash,\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n\n // Transfer maker -> taker\n _dispatchTransferFrom(\n orderHash,\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n\n // Transfer taker fee -> feeRecipient\n _dispatchTransferFrom(\n orderHash,\n order.takerFeeAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n\n // Transfer maker fee -> feeRecipient\n _dispatchTransferFrom(\n orderHash,\n order.makerFeeAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n\n // Pay protocol fee\n bool didPayProtocolFee = _paySingleProtocolFee(\n orderHash,\n fillResults.protocolFeePaid,\n order.makerAddress,\n takerAddress\n );\n\n // Protocol fees are not paid if the protocolFeeCollector contract is not set\n if (!didPayProtocolFee) {\n fillResults.protocolFeePaid = 0;\n }\n }\n\n /// @dev Gets the order's hash and amount of takerAsset that has already been filled.\n /// @param order Order struct containing order specifications.\n /// @return The typed data hash and amount filled of the order.\n function _getOrderHashAndFilledAmount(LibOrder.Order memory order)\n internal\n view\n returns (bytes32 orderHash, uint256 orderTakerAssetFilledAmount)\n {\n orderHash = order.getTypedDataHash(EIP712_EXCHANGE_DOMAIN_HASH);\n orderTakerAssetFilledAmount = filled[orderHash];\n return (orderHash, orderTakerAssetFilledAmount);\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/Refundable.sol": {
"id": 58,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./ReentrancyGuard.sol\";\n\n\ncontract Refundable is\n ReentrancyGuard\n{\n\n // This bool is used by the refund modifier to allow for lazily evaluated refunds.\n bool internal _shouldNotRefund;\n\n modifier refundFinalBalance {\n _;\n _refundNonZeroBalanceIfEnabled();\n }\n\n modifier refundFinalBalanceNoReentry {\n _lockMutexOrThrowIfAlreadyLocked();\n _;\n _refundNonZeroBalanceIfEnabled();\n _unlockMutex();\n }\n\n modifier disableRefundUntilEnd {\n if (_areRefundsDisabled()) {\n _;\n } else {\n _disableRefund();\n _;\n _enableAndRefundNonZeroBalance();\n }\n }\n\n function _refundNonZeroBalanceIfEnabled()\n internal\n {\n if (!_areRefundsDisabled()) {\n _refundNonZeroBalance();\n }\n }\n\n function _refundNonZeroBalance()\n internal\n {\n uint256 balance = address(this).balance;\n if (balance > 0) {\n msg.sender.transfer(balance);\n }\n }\n\n function _disableRefund()\n internal\n {\n _shouldNotRefund = true;\n }\n\n function _enableAndRefundNonZeroBalance()\n internal\n {\n _shouldNotRefund = false;\n _refundNonZeroBalance();\n }\n\n function _areRefundsDisabled()\n internal\n view\n returns (bool)\n {\n return _shouldNotRefund;\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/ReentrancyGuard.sol": {
"id": 57,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibReentrancyGuardRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract ReentrancyGuard {\n\n // Locked state of mutex.\n bool private _locked = false;\n\n /// @dev Functions with this modifer cannot be reentered. The mutex will be locked\n /// before function execution and unlocked after.\n modifier nonReentrant() {\n _lockMutexOrThrowIfAlreadyLocked();\n _;\n _unlockMutex();\n }\n\n function _lockMutexOrThrowIfAlreadyLocked()\n internal\n {\n // Ensure mutex is unlocked.\n if (_locked) {\n LibRichErrors.rrevert(\n LibReentrancyGuardRichErrors.IllegalReentrancyError()\n );\n }\n // Lock mutex.\n _locked = true;\n }\n\n function _unlockMutex()\n internal\n {\n // Unlock mutex.\n _locked = false;\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibReentrancyGuardRichErrors.sol": {
"id": 52,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibReentrancyGuardRichErrors {\n\n // bytes4(keccak256(\"IllegalReentrancyError()\"))\n bytes internal constant ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES =\n hex\"0c3b823f\";\n\n // solhint-disable func-name-mixedcase\n function IllegalReentrancyError()\n internal\n pure\n returns (bytes memory)\n {\n return ILLEGAL_REENTRANCY_ERROR_SELECTOR_BYTES;\n }\n}\n"
},
"./interfaces/IExchangeCore.sol": {
"id": 14,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress, // Address that created the order.\n address indexed feeRecipientAddress, // Address that received fees.\n bytes makerAssetData, // Encoded data specific to makerAsset.\n bytes takerAssetData, // Encoded data specific to takerAsset.\n bytes makerFeeAssetData, // Encoded data specific to makerFeeAsset.\n bytes takerFeeAssetData, // Encoded data specific to takerFeeAsset.\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getTypedDataHash).\n address takerAddress, // Address that filled the order.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker.\n uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.\n uint256 makerFeePaid, // Amount of makerFeeAssetData paid to feeRecipient by maker.\n uint256 takerFeePaid, // Amount of takerFeeAssetData paid to feeRecipient by taker.\n uint256 protocolFeePaid // Amount of eth or weth paid to the staking contract.\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress, // Address that created the order.\n address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled.\n bytes makerAssetData, // Encoded data specific to makerAsset.\n bytes takerAssetData, // Encoded data specific to takerAsset.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n bytes32 indexed orderHash // EIP712 hash of order (see LibOrder.getTypedDataHash).\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress, // Orders cancelled must have been created by this address.\n address indexed orderSenderAddress, // Orders cancelled must have a `senderAddress` equal to this address.\n uint256 orderEpoch // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n );\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n payable;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public\n payable;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n"
},
"./MixinAssetProxyDispatcher.sol": {
"id": 1,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/Ownable.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IAssetProxy.sol\";\nimport \"./interfaces/IAssetProxyDispatcher.sol\";\n\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n IAssetProxyDispatcher\n{\n using LibBytes for bytes;\n\n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => address) internal _assetProxies;\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external\n onlyOwner\n {\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = IAssetProxy(assetProxy).getProxyId();\n address currentAssetProxy = _assetProxies[assetProxyId];\n if (currentAssetProxy != address(0)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.AssetProxyExistsError(\n assetProxyId,\n currentAssetProxy\n ));\n }\n\n // Add asset proxy and log registration.\n _assetProxies[assetProxyId] = assetProxy;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return assetProxy The asset proxy address registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address assetProxy)\n {\n return _assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param orderHash Hash of the order associated with this transfer.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function _dispatchTransferFrom(\n bytes32 orderHash,\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n\n // Ensure assetData is padded to 32 bytes (excluding the id) and is at least 4 bytes long\n if (assetData.length % 32 != 4) {\n LibRichErrors.rrevert(LibExchangeRichErrors.AssetProxyDispatchError(\n LibExchangeRichErrors.AssetProxyDispatchErrorCodes.INVALID_ASSET_DATA_LENGTH,\n orderHash,\n assetData\n ));\n }\n\n // Lookup assetProxy.\n bytes4 assetProxyId = assetData.readBytes4(0);\n address assetProxy = _assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n if (assetProxy == address(0)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.AssetProxyDispatchError(\n LibExchangeRichErrors.AssetProxyDispatchErrorCodes.UNKNOWN_ASSET_PROXY,\n orderHash,\n assetData\n ));\n }\n\n // Construct the calldata for the transferFrom call.\n bytes memory proxyCalldata = abi.encodeWithSelector(\n IAssetProxy(address(0)).transferFrom.selector,\n assetData,\n from,\n to,\n amount\n );\n\n // Call the asset proxy's transferFrom function with the constructed calldata.\n (bool didSucceed, bytes memory returnData) = assetProxy.call(proxyCalldata);\n\n // If the transaction did not succeed, revert with the returned data.\n if (!didSucceed) {\n LibRichErrors.rrevert(LibExchangeRichErrors.AssetProxyTransferError(\n orderHash,\n assetData,\n returnData\n ));\n }\n }\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/Ownable.sol": {
"id": 56,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./interfaces/IOwnable.sol\";\nimport \"./LibOwnableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract Ownable is\n IOwnable\n{\n /// @dev The owner of this contract.\n /// @return 0 The owner address.\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n _assertSenderIsOwner();\n _;\n }\n\n /// @dev Change the owner of this contract.\n /// @param newOwner New owner address.\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner == address(0)) {\n LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError());\n } else {\n owner = newOwner;\n emit OwnershipTransferred(msg.sender, newOwner);\n }\n }\n\n function _assertSenderIsOwner()\n internal\n view\n {\n if (msg.sender != owner) {\n LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError(\n msg.sender,\n owner\n ));\n }\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/interfaces/IOwnable.sol": {
"id": 59,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IOwnable {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner)\n public;\n}\n"
},
"@0x/contracts-utils/contracts/src/LibOwnableRichErrors.sol": {
"id": 51,
"content": "pragma solidity ^0.5.9;\n\n\nlibrary LibOwnableRichErrors {\n\n // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n 0x1de45ad1;\n\n // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n hex\"e69edc3e\";\n\n // solhint-disable func-name-mixedcase\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_OWNER_ERROR_SELECTOR,\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\n }\n}\n"
},
"./interfaces/IAssetProxy.sol": {
"id": 9,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxy {\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes calldata assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n"
},
"./interfaces/IAssetProxyDispatcher.sol": {
"id": 10,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IAssetProxyDispatcher {\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n"
},
"./MixinProtocolFees.sol": {
"id": 4,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/Ownable.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"@0x/contracts-staking/contracts/src/interfaces/IStaking.sol\";\nimport \"./interfaces/IProtocolFees.sol\";\n\n\ncontract MixinProtocolFees is\n IProtocolFees,\n Ownable\n{\n /// @dev The protocol fee multiplier -- the owner can update this field.\n /// @return 0 Gas multplier.\n uint256 public protocolFeeMultiplier;\n\n /// @dev The address of the registered protocolFeeCollector contract -- the owner can update this field.\n /// @return 0 Contract to forward protocol fees to.\n address public protocolFeeCollector;\n\n /// @dev Allows the owner to update the protocol fee multiplier.\n /// @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.\n function setProtocolFeeMultiplier(uint256 updatedProtocolFeeMultiplier)\n external\n onlyOwner\n {\n emit ProtocolFeeMultiplier(protocolFeeMultiplier, updatedProtocolFeeMultiplier);\n protocolFeeMultiplier = updatedProtocolFeeMultiplier;\n }\n\n /// @dev Allows the owner to update the protocolFeeCollector address.\n /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n function setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n external\n onlyOwner\n {\n _setProtocolFeeCollectorAddress(updatedProtocolFeeCollector);\n }\n\n /// @dev Sets the protocolFeeCollector contract address to 0.\n /// Only callable by owner.\n function detachProtocolFeeCollector()\n external\n onlyOwner\n {\n _setProtocolFeeCollectorAddress(address(0));\n }\n\n /// @dev Sets the protocolFeeCollector address and emits an event.\n /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n function _setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n internal\n {\n emit ProtocolFeeCollectorAddress(protocolFeeCollector, updatedProtocolFeeCollector);\n protocolFeeCollector = updatedProtocolFeeCollector;\n }\n\n /// @dev Pays a protocol fee for a single fill.\n /// @param orderHash Hash of the order being filled.\n /// @param protocolFee Value of the fee being paid (equal to protocolFeeMultiplier * tx.gasPrice).\n /// @param makerAddress Address of maker of order being filled.\n /// @param takerAddress Address filling order.\n function _paySingleProtocolFee(\n bytes32 orderHash,\n uint256 protocolFee,\n address makerAddress,\n address takerAddress\n )\n internal\n returns (bool)\n {\n address feeCollector = protocolFeeCollector;\n if (feeCollector != address(0)) {\n _payProtocolFeeToFeeCollector(\n orderHash,\n feeCollector,\n address(this).balance,\n protocolFee,\n makerAddress,\n takerAddress\n );\n return true;\n } else {\n return false;\n }\n }\n\n /// @dev Pays a protocol fee for two orders (used when settling functions in MixinMatchOrders)\n /// @param orderHash1 Hash of the first order being filled.\n /// @param orderHash2 Hash of the second order being filled.\n /// @param protocolFee Value of the fee being paid (equal to protocolFeeMultiplier * tx.gasPrice).\n /// @param makerAddress1 Address of maker of first order being filled.\n /// @param makerAddress2 Address of maker of second order being filled.\n /// @param takerAddress Address filling orders.\n function _payTwoProtocolFees(\n bytes32 orderHash1,\n bytes32 orderHash2,\n uint256 protocolFee,\n address makerAddress1,\n address makerAddress2,\n address takerAddress\n )\n internal\n returns (bool)\n {\n address feeCollector = protocolFeeCollector;\n if (feeCollector != address(0)) {\n // Since the `BALANCE` opcode costs 400 gas, we choose to calculate this value by hand rather than calling it twice.\n uint256 exchangeBalance = address(this).balance;\n\n // Pay protocol fee and attribute to first maker\n uint256 valuePaid = _payProtocolFeeToFeeCollector(\n orderHash1,\n feeCollector,\n exchangeBalance,\n protocolFee,\n makerAddress1,\n takerAddress\n );\n\n // Pay protocol fee and attribute to second maker\n _payProtocolFeeToFeeCollector(\n orderHash2,\n feeCollector,\n exchangeBalance - valuePaid,\n protocolFee,\n makerAddress2,\n takerAddress\n );\n return true;\n } else {\n return false;\n }\n }\n\n /// @dev Pays a single protocol fee.\n /// @param orderHash Hash of the order being filled.\n /// @param feeCollector Address of protocolFeeCollector contract.\n /// @param exchangeBalance Assumed ETH balance of Exchange contract (in wei).\n /// @param protocolFee Value of the fee being paid (equal to protocolFeeMultiplier * tx.gasPrice).\n /// @param makerAddress Address of maker of order being filled.\n /// @param takerAddress Address filling order.\n function _payProtocolFeeToFeeCollector(\n bytes32 orderHash,\n address feeCollector,\n uint256 exchangeBalance,\n uint256 protocolFee,\n address makerAddress,\n address takerAddress\n )\n internal\n returns (uint256 valuePaid)\n {\n // Do not send a value with the call if the exchange has an insufficient balance\n // The protocolFeeCollector contract will fallback to charging WETH\n if (exchangeBalance >= protocolFee) {\n valuePaid = protocolFee;\n }\n bytes memory payProtocolFeeData = abi.encodeWithSelector(\n IStaking(address(0)).payProtocolFee.selector,\n makerAddress,\n takerAddress,\n protocolFee\n );\n // solhint-disable-next-line avoid-call-value\n (bool didSucceed, bytes memory returnData) = feeCollector.call.value(valuePaid)(payProtocolFeeData);\n if (!didSucceed) {\n LibRichErrors.rrevert(LibExchangeRichErrors.PayProtocolFeeError(\n orderHash,\n protocolFee,\n makerAddress,\n takerAddress,\n returnData\n ));\n }\n return valuePaid;\n }\n}\n"
},
"@0x/contracts-staking/contracts/src/interfaces/IStaking.sol": {
"id": 44,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"./IStructs.sol\";\nimport \"./IZrxVault.sol\";\n\n\ninterface IStaking {\n\n /// @dev Adds a new exchange address\n /// @param addr Address of exchange contract to add\n function addExchangeAddress(address addr)\n external;\n\n /// @dev Create a new staking pool. The sender will be the operator of this pool.\n /// Note that an operator must be payable.\n /// @param operatorShare Portion of rewards owned by the operator, in ppm.\n /// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.\n /// @return poolId The unique pool id generated for this pool.\n function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)\n external\n returns (bytes32 poolId);\n\n /// @dev Decreases the operator share for the given pool (i.e. increases pool rewards for members).\n /// @param poolId Unique Id of pool.\n /// @param newOperatorShare The newly decreased percentage of any rewards owned by the operator.\n function decreaseStakingPoolOperatorShare(bytes32 poolId, uint32 newOperatorShare)\n external;\n\n /// @dev Begins a new epoch, preparing the prior one for finalization.\n /// Throws if not enough time has passed between epochs or if the\n /// previous epoch was not fully finalized.\n /// @return numPoolsToFinalize The number of unfinalized pools.\n function endEpoch()\n external\n returns (uint256);\n\n /// @dev Instantly finalizes a single pool that earned rewards in the previous\n /// epoch, crediting it rewards for members and withdrawing operator's\n /// rewards as WETH. This can be called by internal functions that need\n /// to finalize a pool immediately. Does nothing if the pool is already\n /// finalized or did not earn rewards in the previous epoch.\n /// @param poolId The pool ID to finalize.\n function finalizePool(bytes32 poolId)\n external;\n\n /// @dev Initialize storage owned by this contract.\n /// This function should not be called directly.\n /// The StakingProxy contract will call it in `attachStakingContract()`.\n function init()\n external;\n\n /// @dev Allows caller to join a staking pool as a maker.\n /// @param poolId Unique id of pool.\n function joinStakingPoolAsMaker(bytes32 poolId)\n external;\n\n /// @dev Moves stake between statuses: 'undelegated' or 'delegated'.\n /// Delegated stake can also be moved between pools.\n /// This change comes into effect next epoch.\n /// @param from status to move stake out of.\n /// @param to status to move stake into.\n /// @param amount of stake to move.\n function moveStake(\n IStructs.StakeInfo calldata from,\n IStructs.StakeInfo calldata to,\n uint256 amount\n )\n external;\n\n /// @dev Pays a protocol fee in ETH.\n /// @param makerAddress The address of the order's maker.\n /// @param payerAddress The address that is responsible for paying the protocol fee.\n /// @param protocolFee The amount of protocol fees that should be paid.\n function payProtocolFee(\n address makerAddress,\n address payerAddress,\n uint256 protocolFee\n )\n external\n payable;\n\n /// @dev Removes an existing exchange address\n /// @param addr Address of exchange contract to remove\n function removeExchangeAddress(address addr)\n external;\n\n /// @dev Set all configurable parameters at once.\n /// @param _epochDurationInSeconds Minimum seconds between epochs.\n /// @param _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @param _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @param _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @param _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function setParams(\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n )\n external;\n\n /// @dev Stake ZRX tokens. Tokens are deposited into the ZRX Vault.\n /// Unstake to retrieve the ZRX. Stake is in the 'Active' status.\n /// @param amount of ZRX to stake.\n function stake(uint256 amount)\n external;\n\n /// @dev Unstake. Tokens are withdrawn from the ZRX Vault and returned to\n /// the staker. Stake must be in the 'undelegated' status in both the\n /// current and next epoch in order to be unstaked.\n /// @param amount of ZRX to unstake.\n function unstake(uint256 amount)\n external;\n\n /// @dev Withdraws the caller's WETH rewards that have accumulated\n /// until the last epoch.\n /// @param poolId Unique id of pool.\n function withdrawDelegatorRewards(bytes32 poolId)\n external;\n\n /// @dev Computes the reward balance in ETH of a specific member of a pool.\n /// @param poolId Unique id of pool.\n /// @param member The member of the pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfDelegator(bytes32 poolId, address member)\n external\n view\n returns (uint256 reward);\n\n /// @dev Computes the reward balance in ETH of the operator of a pool.\n /// @param poolId Unique id of pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfOperator(bytes32 poolId)\n external\n view\n returns (uint256 reward);\n\n /// @dev Returns the earliest end time in seconds of this epoch.\n /// The next epoch can begin once this time is reached.\n /// Epoch period = [startTimeInSeconds..endTimeInSeconds)\n /// @return Time in seconds.\n function getCurrentEpochEarliestEndTimeInSeconds()\n external\n view\n returns (uint256);\n\n /// @dev Gets global stake for a given status.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Global stake for given status.\n function getGlobalStakeByStatus(IStructs.StakeStatus stakeStatus)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Gets an owner's stake balances by status.\n /// @param staker Owner of stake.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Owner's stake balances for given status.\n function getOwnerStakeByStatus(\n address staker,\n IStructs.StakeStatus stakeStatus\n )\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Retrieves all configurable parameter values.\n /// @return _epochDurationInSeconds Minimum seconds between epochs.\n /// @return _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @return _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @return _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @return _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function getParams()\n external\n view\n returns (\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n );\n\n /// @param staker of stake.\n /// @param poolId Unique Id of pool.\n /// @return Stake delegated to pool by staker.\n function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Returns a staking pool\n /// @param poolId Unique id of pool.\n function getStakingPool(bytes32 poolId)\n external\n view\n returns (IStructs.Pool memory);\n\n /// @dev Get stats on a staking pool in this epoch.\n /// @param poolId Pool Id to query.\n /// @return PoolStats struct for pool id.\n function getStakingPoolStatsThisEpoch(bytes32 poolId)\n external\n view\n returns (IStructs.PoolStats memory);\n\n /// @dev Returns the total stake delegated to a specific staking pool,\n /// across all members.\n /// @param poolId Unique Id of pool.\n /// @return Total stake delegated to pool.\n function getTotalStakeDelegatedToPool(bytes32 poolId)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev An overridable way to access the deployed WETH contract.\n /// Must be view to allow overrides to access state.\n /// @return wethContract The WETH contract instance.\n function getWethContract()\n external\n view\n returns (IEtherToken wethContract);\n\n /// @dev An overridable way to access the deployed zrxVault.\n /// Must be view to allow overrides to access state.\n /// @return zrxVault The zrxVault contract.\n function getZrxVault()\n external\n view\n returns (IZrxVault zrxVault);\n}\n"
},
"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol": {
"id": 36,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\n}\n"
},
"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": {
"id": 35,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address _to, uint256 _value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address _spender, uint256 _value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256);\n}\n"
},
"@0x/contracts-staking/contracts/src/interfaces/IStructs.sol": {
"id": 45,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IStructs {\n\n /// @dev Stats for a pool that earned rewards.\n /// @param feesCollected Fees collected in ETH by this pool.\n /// @param weightedStake Amount of weighted stake in the pool.\n /// @param membersStake Amount of non-operator stake in the pool.\n struct PoolStats {\n uint256 feesCollected;\n uint256 weightedStake;\n uint256 membersStake;\n }\n\n /// @dev Holds stats aggregated across a set of pools.\n /// @param rewardsAvailable Rewards (ETH) available to the epoch\n /// being finalized (the previous epoch). This is simply the balance\n /// of the contract at the end of the epoch.\n /// @param numPoolsToFinalize The number of pools that have yet to be finalized through `finalizePools()`.\n /// @param totalFeesCollected The total fees collected for the epoch being finalized.\n /// @param totalWeightedStake The total fees collected for the epoch being finalized.\n /// @param totalRewardsFinalized Amount of rewards that have been paid during finalization.\n struct AggregatedStats {\n uint256 rewardsAvailable;\n uint256 numPoolsToFinalize;\n uint256 totalFeesCollected;\n uint256 totalWeightedStake;\n uint256 totalRewardsFinalized;\n }\n\n /// @dev Encapsulates a balance for the current and next epochs.\n /// Note that these balances may be stale if the current epoch\n /// is greater than `currentEpoch`.\n /// @param currentEpoch The current epoch\n /// @param currentEpochBalance Balance in the current epoch.\n /// @param nextEpochBalance Balance in `currentEpoch+1`.\n struct StoredBalance {\n uint64 currentEpoch;\n uint96 currentEpochBalance;\n uint96 nextEpochBalance;\n }\n\n /// @dev Statuses that stake can exist in.\n /// Any stake can be (re)delegated effective at the next epoch\n /// Undelegated stake can be withdrawn if it is available in both the current and next epoch\n enum StakeStatus {\n UNDELEGATED,\n DELEGATED\n }\n\n /// @dev Info used to describe a status.\n /// @param status Status of the stake.\n /// @param poolId Unique Id of pool. This is set when status=DELEGATED.\n struct StakeInfo {\n StakeStatus status;\n bytes32 poolId;\n }\n\n /// @dev Struct to represent a fraction.\n /// @param numerator Numerator of fraction.\n /// @param denominator Denominator of fraction.\n struct Fraction {\n uint256 numerator;\n uint256 denominator;\n }\n\n /// @dev Holds the metadata for a staking pool.\n /// @param operator Operator of the pool.\n /// @param operatorShare Fraction of the total balance owned by the operator, in ppm.\n struct Pool {\n address operator;\n uint32 operatorShare;\n }\n}\n"
},
"@0x/contracts-staking/contracts/src/interfaces/IZrxVault.sol": {
"id": 46,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IZrxVault {\n\n /// @dev Emmitted whenever a StakingProxy is set in a vault.\n event StakingProxySet(address stakingProxyAddress);\n\n /// @dev Emitted when the Staking contract is put into Catastrophic Failure Mode\n /// @param sender Address of sender (`msg.sender`)\n event InCatastrophicFailureMode(address sender);\n\n /// @dev Emitted when Zrx Tokens are deposited into the vault.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens deposited.\n event Deposit(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted when Zrx Tokens are withdrawn from the vault.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens withdrawn.\n event Withdraw(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted whenever the ZRX AssetProxy is set.\n event ZrxProxySet(address zrxProxyAddress);\n\n /// @dev Sets the address of the StakingProxy contract.\n /// Note that only the contract staker can call this function.\n /// @param _stakingProxyAddress Address of Staking proxy contract.\n function setStakingProxy(address _stakingProxyAddress)\n external;\n\n /// @dev Vault enters into Catastrophic Failure Mode.\n /// *** WARNING - ONCE IN CATOSTROPHIC FAILURE MODE, YOU CAN NEVER GO BACK! ***\n /// Note that only the contract staker can call this function.\n function enterCatastrophicFailure()\n external;\n\n /// @dev Sets the Zrx proxy.\n /// Note that only the contract staker can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param zrxProxyAddress Address of the 0x Zrx Proxy.\n function setZrxProxy(address zrxProxyAddress)\n external;\n\n /// @dev Deposit an `amount` of Zrx Tokens from `staker` into the vault.\n /// Note that only the Staking contract can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens to deposit.\n function depositFrom(address staker, uint256 amount)\n external;\n\n /// @dev Withdraw an `amount` of Zrx Tokens to `staker` from the vault.\n /// Note that only the Staking contract can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens to withdraw.\n function withdrawFrom(address staker, uint256 amount)\n external;\n\n /// @dev Withdraw ALL Zrx Tokens to `staker` from the vault.\n /// Note that this can only be called when *in* Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n function withdrawAllFrom(address staker)\n external\n returns (uint256);\n\n /// @dev Returns the balance in Zrx Tokens of the `staker`\n /// @return Balance in Zrx.\n function balanceOf(address staker)\n external\n view\n returns (uint256);\n\n /// @dev Returns the entire balance of Zrx tokens in the vault.\n function balanceOfZrxVault()\n external\n view\n returns (uint256);\n}\n"
},
"./interfaces/IProtocolFees.sol": {
"id": 16,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IProtocolFees {\n\n // Logs updates to the protocol fee multiplier.\n event ProtocolFeeMultiplier(uint256 oldProtocolFeeMultiplier, uint256 updatedProtocolFeeMultiplier);\n\n // Logs updates to the protocolFeeCollector address.\n event ProtocolFeeCollectorAddress(address oldProtocolFeeCollector, address updatedProtocolFeeCollector);\n\n /// @dev Allows the owner to update the protocol fee multiplier.\n /// @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.\n function setProtocolFeeMultiplier(uint256 updatedProtocolFeeMultiplier)\n external;\n\n /// @dev Allows the owner to update the protocolFeeCollector address.\n /// @param updatedProtocolFeeCollector The updated protocolFeeCollector contract address.\n function setProtocolFeeCollectorAddress(address updatedProtocolFeeCollector)\n external;\n\n /// @dev Returns the protocolFeeMultiplier\n function protocolFeeMultiplier()\n external\n view\n returns (uint256);\n\n /// @dev Returns the protocolFeeCollector address\n function protocolFeeCollector()\n external\n view\n returns (address);\n}\n"
},
"./MixinSignatureValidator.sol": {
"id": 5,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibEIP1271.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IEIP1271Wallet.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./interfaces/IEIP1271Data.sol\";\nimport \"./MixinTransactions.sol\";\n\n\ncontract MixinSignatureValidator is\n LibEIP712ExchangeDomain,\n LibEIP1271,\n ISignatureValidator,\n MixinTransactions\n{\n using LibBytes for bytes;\n using LibOrder for LibOrder.Order;\n using LibZeroExTransaction for LibZeroExTransaction.ZeroExTransaction;\n\n // Magic bytes to be returned by `Wallet` signature type validators.\n // bytes4(keccak256(\"isValidWalletSignature(bytes32,address,bytes)\"))\n bytes4 private constant LEGACY_WALLET_MAGIC_VALUE = 0xb0671381;\n\n /// @dev Mapping of hash => signer => signed\n /// @param 0 Order hash.\n /// @param 1 Signer address.\n /// @return 0 Whether the hash is presigned.\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n /// @dev Mapping of signer => validator => approved\n /// @param 0 Signer address.\n /// @param 1 Signature validator address.\n /// @return 0 Whether the validator is allowed to validate on behalf of the signer.\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param hash Any 32-byte hash.\n function preSign(bytes32 hash)\n external\n payable\n refundFinalBalanceNoReentry\n {\n address signerAddress = _getCurrentContextAddress();\n preSigned[hash][signerAddress] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf\n /// using the `Validator` signature type.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n payable\n refundFinalBalanceNoReentry\n {\n address signerAddress = _getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32-byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid `true` if the signature is valid for the given hash and signer.\n function isValidHashSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n SignatureType signatureType = _readValidSignatureType(\n hash,\n signerAddress,\n signature\n );\n // Only hash-compatible signature types can be handled by this\n // function.\n if (\n signatureType == SignatureType.Validator ||\n signatureType == SignatureType.EIP1271Wallet\n ) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INAPPROPRIATE_SIGNATURE_TYPE,\n hash,\n signerAddress,\n signature\n ));\n }\n isValid = _validateHashSignatureTypes(\n signatureType,\n hash,\n signerAddress,\n signature\n );\n return isValid;\n }\n\n /// @dev Verifies that a signature for an order is valid.\n /// @param order The order.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid `true` if the signature is valid for the given order and signer.\n function isValidOrderSignature(\n LibOrder.Order memory order,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n bytes32 orderHash = order.getTypedDataHash(EIP712_EXCHANGE_DOMAIN_HASH);\n isValid = _isValidOrderWithHashSignature(\n order,\n orderHash,\n signature\n );\n return isValid;\n }\n\n /// @dev Verifies that a signature for a transaction is valid.\n /// @param transaction The transaction.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid `true` if the signature is valid for the given transaction and signer.\n function isValidTransactionSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n bytes32 transactionHash = transaction.getTypedDataHash(EIP712_EXCHANGE_DOMAIN_HASH);\n isValid = _isValidTransactionWithHashSignature(\n transaction,\n transactionHash,\n signature\n );\n return isValid;\n }\n\n /// @dev Verifies that an order, with provided order hash, has been signed\n /// by the given signer.\n /// @param order The order.\n /// @param orderHash The hash of the order.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given order and signer.\n function _isValidOrderWithHashSignature(\n LibOrder.Order memory order,\n bytes32 orderHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid)\n {\n address signerAddress = order.makerAddress;\n SignatureType signatureType = _readValidSignatureType(\n orderHash,\n signerAddress,\n signature\n );\n if (signatureType == SignatureType.Validator) {\n // The entire order is verified by a validator contract.\n isValid = _validateBytesWithValidator(\n _encodeEIP1271OrderWithHash(order, orderHash),\n orderHash,\n signerAddress,\n signature\n );\n } else if (signatureType == SignatureType.EIP1271Wallet) {\n // The entire order is verified by a wallet contract.\n isValid = _validateBytesWithWallet(\n _encodeEIP1271OrderWithHash(order, orderHash),\n signerAddress,\n signature\n );\n } else {\n // Otherwise, it's one of the hash-only signature types.\n isValid = _validateHashSignatureTypes(\n signatureType,\n orderHash,\n signerAddress,\n signature\n );\n }\n return isValid;\n }\n\n /// @dev Verifies that a transaction, with provided order hash, has been signed\n /// by the given signer.\n /// @param transaction The transaction.\n /// @param transactionHash The hash of the transaction.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given transaction and signer.\n function _isValidTransactionWithHashSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes32 transactionHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid)\n {\n address signerAddress = transaction.signerAddress;\n SignatureType signatureType = _readValidSignatureType(\n transactionHash,\n signerAddress,\n signature\n );\n if (signatureType == SignatureType.Validator) {\n // The entire transaction is verified by a validator contract.\n isValid = _validateBytesWithValidator(\n _encodeEIP1271TransactionWithHash(transaction, transactionHash),\n transactionHash,\n signerAddress,\n signature\n );\n } else if (signatureType == SignatureType.EIP1271Wallet) {\n // The entire transaction is verified by a wallet contract.\n isValid = _validateBytesWithWallet(\n _encodeEIP1271TransactionWithHash(transaction, transactionHash),\n signerAddress,\n signature\n );\n } else {\n // Otherwise, it's one of the hash-only signature types.\n isValid = _validateHashSignatureTypes(\n signatureType,\n transactionHash,\n signerAddress,\n signature\n );\n }\n return isValid;\n }\n\n /// Validates a hash-only signature type\n /// (anything but `Validator` and `EIP1271Wallet`).\n function _validateHashSignatureTypes(\n SignatureType signatureType,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n private\n view\n returns (bool isValid)\n {\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n if (signatureType == SignatureType.Invalid) {\n if (signature.length != 1) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n hash,\n signerAddress,\n signature\n ));\n }\n isValid = false;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n if (signature.length != 66) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n hash,\n signerAddress,\n signature\n ));\n }\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n address recovered = ecrecover(\n hash,\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n if (signature.length != 66) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n hash,\n signerAddress,\n signature\n ));\n }\n uint8 v = uint8(signature[0]);\n bytes32 r = signature.readBytes32(1);\n bytes32 s = signature.readBytes32(33);\n address recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n\n // Signature verified by wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = _validateHashWithWallet(\n hash,\n signerAddress,\n signature\n );\n\n // Otherwise, signatureType == SignatureType.PreSigned\n } else {\n assert(signatureType == SignatureType.PreSigned);\n // Signer signed hash previously using the preSign function.\n isValid = preSigned[hash][signerAddress];\n }\n return isValid;\n }\n\n /// @dev Reads the `SignatureType` from a signature with minimal validation.\n function _readSignatureType(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n private\n pure\n returns (SignatureType)\n {\n if (signature.length == 0) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n hash,\n signerAddress,\n signature\n ));\n }\n return SignatureType(uint8(signature[signature.length - 1]));\n }\n\n /// @dev Reads the `SignatureType` from the end of a signature and validates it.\n function _readValidSignatureType(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n private\n pure\n returns (SignatureType signatureType)\n {\n // Read the signatureType from the signature\n signatureType = _readSignatureType(\n hash,\n signerAddress,\n signature\n );\n\n // Disallow address zero because ecrecover() returns zero on failure.\n if (signerAddress == address(0)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_SIGNER,\n hash,\n signerAddress,\n signature\n ));\n }\n\n // Ensure signature is supported\n if (uint8(signatureType) >= uint8(SignatureType.NSignatureTypes)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.UNSUPPORTED,\n hash,\n signerAddress,\n signature\n ));\n }\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.ILLEGAL,\n hash,\n signerAddress,\n signature\n ));\n }\n\n return signatureType;\n }\n\n /// @dev ABI encodes an order and hash with a selector to be passed into\n /// an EIP1271 compliant `isValidSignature` function.\n function _encodeEIP1271OrderWithHash(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n private\n pure\n returns (bytes memory encoded)\n {\n return abi.encodeWithSelector(\n IEIP1271Data(address(0)).OrderWithHash.selector,\n order,\n orderHash\n );\n }\n\n /// @dev ABI encodes a transaction and hash with a selector to be passed into\n /// an EIP1271 compliant `isValidSignature` function.\n function _encodeEIP1271TransactionWithHash(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes32 transactionHash\n )\n private\n pure\n returns (bytes memory encoded)\n {\n return abi.encodeWithSelector(\n IEIP1271Data(address(0)).ZeroExTransactionWithHash.selector,\n transaction,\n transactionHash\n );\n }\n\n /// @dev Verifies a hash and signature using logic defined by Wallet contract.\n /// @param hash Any 32 byte hash.\n /// @param walletAddress Address that should have signed the given hash\n /// and defines its own signature verification method.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the signature is validated by the Wallet.\n function _validateHashWithWallet(\n bytes32 hash,\n address walletAddress,\n bytes memory signature\n )\n private\n view\n returns (bool)\n {\n // Backup length of signature\n uint256 signatureLength = signature.length;\n // Temporarily remove signatureType byte from end of signature\n signature.writeLength(signatureLength - 1);\n // Encode the call data.\n bytes memory callData = abi.encodeWithSelector(\n IWallet(address(0)).isValidSignature.selector,\n hash,\n signature\n );\n // Restore the original signature length\n signature.writeLength(signatureLength);\n // Static call the verification function.\n (bool didSucceed, bytes memory returnData) = walletAddress.staticcall(callData);\n // Return the validity of the signature if the call was successful\n if (didSucceed && returnData.length == 32) {\n return returnData.readBytes4(0) == LEGACY_WALLET_MAGIC_VALUE;\n }\n // Revert if the call was unsuccessful\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureWalletError(\n hash,\n walletAddress,\n signature,\n returnData\n ));\n }\n\n /// @dev Verifies arbitrary data and a signature via an EIP1271 Wallet\n /// contract, where the wallet address is also the signer address.\n /// @param data Arbitrary signed data.\n /// @param walletAddress Contract that will verify the data and signature.\n /// @param signature Proof that the data has been signed by signer.\n /// @return isValid True if the signature is validated by the Wallet.\n function _validateBytesWithWallet(\n bytes memory data,\n address walletAddress,\n bytes memory signature\n )\n private\n view\n returns (bool isValid)\n {\n isValid = _staticCallEIP1271WalletWithReducedSignatureLength(\n walletAddress,\n data,\n signature,\n 1 // The last byte of the signature (signatureType) is removed before making the staticcall\n );\n return isValid;\n }\n\n /// @dev Verifies arbitrary data and a signature via an EIP1271 contract\n /// whose address is encoded in the signature.\n /// @param data Arbitrary signed data.\n /// @param hash The hash associated with the data.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the data has been signed by signer.\n /// @return isValid True if the signature is validated by the validator contract.\n function _validateBytesWithValidator(\n bytes memory data,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n private\n view\n returns (bool isValid)\n {\n uint256 signatureLength = signature.length;\n if (signatureLength < 21) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.INVALID_LENGTH,\n hash,\n signerAddress,\n signature\n ));\n }\n // The validator address is appended to the signature before the signatureType.\n // Read the validator address from the signature.\n address validatorAddress = signature.readAddress(signatureLength - 21);\n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureValidatorNotApprovedError(\n signerAddress,\n validatorAddress\n ));\n }\n isValid = _staticCallEIP1271WalletWithReducedSignatureLength(\n validatorAddress,\n data,\n signature,\n 21 // The last 21 bytes of the signature (validatorAddress + signatureType) are removed before making the staticcall\n );\n return isValid;\n }\n\n /// @dev Performs a staticcall to an EIP1271 compiant `isValidSignature` function and validates the output.\n /// @param verifyingContractAddress Address of EIP1271Wallet or Validator contract.\n /// @param data Arbitrary signed data.\n /// @param signature Proof that the hash has been signed by signer. Bytes will be temporarily be popped\n /// off of the signature before calling `isValidSignature`.\n /// @param ignoredSignatureBytesLen The amount of bytes that will be temporarily popped off the the signature.\n /// @return The validity of the signature.\n function _staticCallEIP1271WalletWithReducedSignatureLength(\n address verifyingContractAddress,\n bytes memory data,\n bytes memory signature,\n uint256 ignoredSignatureBytesLen\n )\n private\n view\n returns (bool)\n {\n // Backup length of the signature\n uint256 signatureLength = signature.length;\n // Temporarily remove bytes from signature end\n signature.writeLength(signatureLength - ignoredSignatureBytesLen);\n bytes memory callData = abi.encodeWithSelector(\n IEIP1271Wallet(address(0)).isValidSignature.selector,\n data,\n signature\n );\n // Restore original signature length\n signature.writeLength(signatureLength);\n // Static call the verification function\n (bool didSucceed, bytes memory returnData) = verifyingContractAddress.staticcall(callData);\n // Return the validity of the signature if the call was successful\n if (didSucceed && returnData.length == 32) {\n return returnData.readBytes4(0) == EIP1271_MAGIC_VALUE;\n }\n // Revert if the call was unsuccessful\n LibRichErrors.rrevert(LibExchangeRichErrors.EIP1271SignatureError(\n verifyingContractAddress,\n data,\n signature,\n returnData\n ));\n }\n}\n"
},
"@0x/contracts-utils/contracts/src/LibEIP1271.sol": {
"id": 49,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract LibEIP1271 {\n\n /// @dev Magic bytes returned by EIP1271 wallets on success.\n /// @return 0 Magic bytes.\n bytes4 constant public EIP1271_MAGIC_VALUE = 0x20c13b0b;\n}\n"
},
"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol": {
"id": 43,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibZeroExTransaction {\n\n using LibZeroExTransaction for ZeroExTransaction;\n\n // Hash for the EIP712 0x transaction schema\n // keccak256(abi.encodePacked(\n // \"ZeroExTransaction(\",\n // \"uint256 salt,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 gasPrice,\",\n // \"address signerAddress,\",\n // \"bytes data\",\n // \")\"\n // ));\n bytes32 constant internal _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = 0xec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc71541508;\n\n struct ZeroExTransaction {\n uint256 salt; // Arbitrary number to ensure uniqueness of transaction hash.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which transaction expires.\n uint256 gasPrice; // gasPrice that transaction is required to be executed with.\n address signerAddress; // Address of transaction signer.\n bytes data; // AbiV2 encoded calldata.\n }\n\n /// @dev Calculates the EIP712 typed data hash of a transaction with a given domain separator.\n /// @param transaction 0x transaction structure.\n /// @return EIP712 typed data hash of the transaction.\n function getTypedDataHash(ZeroExTransaction memory transaction, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 transactionHash)\n {\n // Hash the transaction with the domain separator of the Exchange contract.\n transactionHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n transaction.getStructHash()\n );\n return transactionHash;\n }\n\n /// @dev Calculates EIP712 hash of the 0x transaction struct.\n /// @param transaction 0x transaction structure.\n /// @return EIP712 hash of the transaction struct.\n function getStructHash(ZeroExTransaction memory transaction)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes memory data = transaction.data;\n uint256 salt = transaction.salt;\n uint256 expirationTimeSeconds = transaction.expirationTimeSeconds;\n uint256 gasPrice = transaction.gasPrice;\n address signerAddress = transaction.signerAddress;\n\n // Assembly for more efficiently computing:\n // result = keccak256(abi.encodePacked(\n // schemaHash,\n // salt,\n // expirationTimeSeconds,\n // gasPrice,\n // uint256(signerAddress),\n // keccak256(data)\n // ));\n\n assembly {\n // Compute hash of data\n let dataHash := keccak256(add(data, 32), mload(data))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), expirationTimeSeconds) // expirationTimeSeconds\n mstore(add(memPtr, 96), gasPrice) // gasPrice\n mstore(add(memPtr, 128), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 160), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 192)\n }\n return result;\n }\n}\n"
},
"./interfaces/IWallet.sol": {
"id": 20,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\n\n\ncontract IWallet {\n\n /// @dev Validates a hash with the `Wallet` signature type.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return magicValue `bytes4(0xb0671381)` if the signature check succeeds.\n function isValidSignature(\n bytes32 hash,\n bytes calldata signature\n )\n external\n view\n returns (bytes4 magicValue);\n}\n"
},
"./interfaces/IEIP1271Wallet.sol": {
"id": 12,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP1271.sol\";\n\n\ncontract IEIP1271Wallet is\n LibEIP1271\n{\n /// @dev Verifies that a signature is valid.\n /// @param data Arbitrary signed data.\n /// @param signature Proof that data has been signed.\n /// @return magicValue bytes4(0x20c13b0b) if the signature check succeeds.\n function isValidSignature(\n bytes calldata data,\n bytes calldata signature\n )\n external\n view\n returns (bytes4 magicValue);\n}\n"
},
"./interfaces/ISignatureValidator.sol": {
"id": 17,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ISignatureValidator {\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Wallet, // 0x04\n Validator, // 0x05\n PreSigned, // 0x06\n EIP1271Wallet, // 0x07\n NSignatureTypes // 0x08, number of signature types. Always leave at end.\n }\n\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool isApproved // Approval or disapproval of validator contract.\n );\n\n /// @dev Approves a hash on-chain.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param hash Any 32-byte hash.\n function preSign(bytes32 hash)\n external\n payable;\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n payable;\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32-byte hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid `true` if the signature is valid for the given hash and signer.\n function isValidHashSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that a signature for an order is valid.\n /// @param order The order.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid true if the signature is valid for the given order and signer.\n function isValidOrderSignature(\n LibOrder.Order memory order,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that a signature for a transaction is valid.\n /// @param transaction The transaction.\n /// @param signature Proof that the order has been signed by signer.\n /// @return isValid true if the signature is valid for the given transaction and signer.\n function isValidTransactionSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n\n /// @dev Verifies that an order, with provided order hash, has been signed\n /// by the given signer.\n /// @param order The order.\n /// @param orderHash The hash of the order.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given order and signer.\n function _isValidOrderWithHashSignature(\n LibOrder.Order memory order,\n bytes32 orderHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n\n /// @dev Verifies that a transaction, with provided order hash, has been signed\n /// by the given signer.\n /// @param transaction The transaction.\n /// @param transactionHash The hash of the transaction.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return isValid True if the signature is valid for the given transaction and signer.\n function _isValidTransactionWithHashSignature(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes32 transactionHash,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n}\n"
},
"./interfaces/IEIP1271Data.sol": {
"id": 11,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\n// solhint-disable\ncontract IEIP1271Data {\n\n /// @dev This function's selector is used when ABI encoding the order\n /// and hash into a byte array before calling `isValidSignature`.\n /// This function serves no other purpose.\n function OrderWithHash(\n LibOrder.Order calldata order,\n bytes32 orderHash\n )\n external\n pure;\n \n /// @dev This function's selector is used when ABI encoding the transaction\n /// and hash into a byte array before calling `isValidSignature`.\n /// This function serves no other purpose.\n function ZeroExTransactionWithHash(\n LibZeroExTransaction.ZeroExTransaction calldata transaction,\n bytes32 transactionHash\n )\n external\n pure;\n}\n"
},
"./MixinTransactions.sol": {
"id": 6,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/Refundable.sol\";\nimport \"./interfaces/ITransactions.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\n\n\ncontract MixinTransactions is\n Refundable,\n LibEIP712ExchangeDomain,\n ISignatureValidator,\n ITransactions\n{\n using LibZeroExTransaction for LibZeroExTransaction.ZeroExTransaction;\n\n /// @dev Mapping of transaction hash => executed\n /// This prevents transactions from being executed more than once.\n /// @param 0 The transaction hash.\n /// @return 0 Whether the transation was executed.\n mapping (bytes32 => bool) public transactionsExecuted;\n\n /// @dev Address of current transaction signer.\n /// @return 0 The address associated with the the current transaction.\n address public currentContextAddress;\n\n /// @dev Executes an Exchange method call in the context of signer.\n /// @param transaction 0x transaction structure.\n /// @param signature Proof that transaction has been signed by signer.\n /// @return ABI encoded return data of the underlying Exchange function call.\n function executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n payable\n disableRefundUntilEnd\n returns (bytes memory)\n {\n return _executeTransaction(transaction, signature);\n }\n\n /// @dev Executes a batch of Exchange method calls in the context of signer(s).\n /// @param transactions Array of 0x transaction structures.\n /// @param signatures Array of proofs that transactions have been signed by signer(s).\n /// @return returnData Array containing ABI encoded return data for each of the underlying Exchange function calls.\n function batchExecuteTransactions(\n LibZeroExTransaction.ZeroExTransaction[] memory transactions,\n bytes[] memory signatures\n )\n public\n payable\n disableRefundUntilEnd\n returns (bytes[] memory returnData)\n {\n uint256 length = transactions.length;\n returnData = new bytes[](length);\n for (uint256 i = 0; i != length; i++) {\n returnData[i] = _executeTransaction(transactions[i], signatures[i]);\n }\n return returnData;\n }\n\n /// @dev Executes an Exchange method call in the context of signer.\n /// @param transaction 0x transaction structure.\n /// @param signature Proof that transaction has been signed by signer.\n /// @return ABI encoded return data of the underlying Exchange function call.\n function _executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n internal\n returns (bytes memory)\n {\n bytes32 transactionHash = transaction.getTypedDataHash(EIP712_EXCHANGE_DOMAIN_HASH);\n\n _assertExecutableTransaction(\n transaction,\n signature,\n transactionHash\n );\n\n // Set the current transaction signer\n address signerAddress = transaction.signerAddress;\n _setCurrentContextAddressIfRequired(signerAddress, signerAddress);\n\n // Execute transaction\n transactionsExecuted[transactionHash] = true;\n (bool didSucceed, bytes memory returnData) = address(this).delegatecall(transaction.data);\n if (!didSucceed) {\n LibRichErrors.rrevert(LibExchangeRichErrors.TransactionExecutionError(\n transactionHash,\n returnData\n ));\n }\n\n // Reset current transaction signer if it was previously updated\n _setCurrentContextAddressIfRequired(signerAddress, address(0));\n\n emit TransactionExecution(transactionHash);\n\n return returnData;\n }\n\n /// @dev Validates context for executeTransaction. Succeeds or throws.\n /// @param transaction 0x transaction structure.\n /// @param signature Proof that transaction has been signed by signer.\n /// @param transactionHash EIP712 typed data hash of 0x transaction.\n function _assertExecutableTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature,\n bytes32 transactionHash\n )\n internal\n view\n {\n // Check transaction is not expired\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= transaction.expirationTimeSeconds) {\n LibRichErrors.rrevert(LibExchangeRichErrors.TransactionError(\n LibExchangeRichErrors.TransactionErrorCodes.EXPIRED,\n transactionHash\n ));\n }\n\n // Validate that transaction is executed with the correct gasPrice\n uint256 requiredGasPrice = transaction.gasPrice;\n if (tx.gasprice != requiredGasPrice) {\n LibRichErrors.rrevert(LibExchangeRichErrors.TransactionGasPriceError(\n transactionHash,\n tx.gasprice,\n requiredGasPrice\n ));\n }\n\n // Prevent `executeTransaction` from being called when context is already set\n address currentContextAddress_ = currentContextAddress;\n if (currentContextAddress_ != address(0)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.TransactionInvalidContextError(\n transactionHash,\n currentContextAddress_\n ));\n }\n\n // Validate transaction has not been executed\n if (transactionsExecuted[transactionHash]) {\n LibRichErrors.rrevert(LibExchangeRichErrors.TransactionError(\n LibExchangeRichErrors.TransactionErrorCodes.ALREADY_EXECUTED,\n transactionHash\n ));\n }\n\n // Validate signature\n // Transaction always valid if signer is sender of transaction\n address signerAddress = transaction.signerAddress;\n if (signerAddress != msg.sender && !_isValidTransactionWithHashSignature(\n transaction,\n transactionHash,\n signature\n )\n ) {\n LibRichErrors.rrevert(LibExchangeRichErrors.SignatureError(\n LibExchangeRichErrors.SignatureErrorCodes.BAD_TRANSACTION_SIGNATURE,\n transactionHash,\n signerAddress,\n signature\n ));\n }\n }\n\n /// @dev Sets the currentContextAddress if the current context is not msg.sender.\n /// @param signerAddress Address of the transaction signer.\n /// @param contextAddress The current context address.\n function _setCurrentContextAddressIfRequired(\n address signerAddress,\n address contextAddress\n )\n internal\n {\n if (signerAddress != msg.sender) {\n currentContextAddress = contextAddress;\n }\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function _getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address currentContextAddress_ = currentContextAddress;\n address contextAddress = currentContextAddress_ == address(0) ? msg.sender : currentContextAddress_;\n return contextAddress;\n }\n}\n"
},
"./interfaces/ITransactions.sol": {
"id": 18,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol\";\n\n\ncontract ITransactions {\n\n // TransactionExecution event is emitted when a ZeroExTransaction is executed.\n event TransactionExecution(bytes32 indexed transactionHash);\n\n /// @dev Executes an Exchange method call in the context of signer.\n /// @param transaction 0x transaction containing salt, signerAddress, and data.\n /// @param signature Proof that transaction has been signed by signer.\n /// @return ABI encoded return data of the underlying Exchange function call.\n function executeTransaction(\n LibZeroExTransaction.ZeroExTransaction memory transaction,\n bytes memory signature\n )\n public\n payable\n returns (bytes memory);\n\n /// @dev Executes a batch of Exchange method calls in the context of signer(s).\n /// @param transactions Array of 0x transactions containing salt, signerAddress, and data.\n /// @param signatures Array of proofs that transactions have been signed by signer(s).\n /// @return Array containing ABI encoded return data for each of the underlying Exchange function calls.\n function batchExecuteTransactions(\n LibZeroExTransaction.ZeroExTransaction[] memory transactions,\n bytes[] memory signatures\n )\n public\n payable\n returns (bytes[] memory);\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function _getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n"
},
"./MixinWrapperFunctions.sol": {
"id": 8,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IExchangeCore.sol\";\nimport \"./interfaces/IWrapperFunctions.sol\";\nimport \"./MixinExchangeCore.sol\";\n\n\ncontract MixinWrapperFunctions is\n IWrapperFunctions,\n MixinExchangeCore\n{\n using LibSafeMath for uint256;\n\n /// @dev Fills the input order. Reverts if exact `takerAssetFillAmount` not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return fillResults Amounts filled and fees paid.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.FillResults memory fillResults)\n {\n fillResults = _fillOrKillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n return fillResults;\n }\n\n /// @dev Executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return fillResults Array of amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.FillResults[] memory fillResults)\n {\n uint256 ordersLength = orders.length;\n fillResults = new LibFillResults.FillResults[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n fillResults[i] = _fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n return fillResults;\n }\n\n /// @dev Executes multiple calls of fillOrKillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return fillResults Array of amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.FillResults[] memory fillResults)\n {\n uint256 ordersLength = orders.length;\n fillResults = new LibFillResults.FillResults[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n fillResults[i] = _fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n return fillResults;\n }\n\n /// @dev Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return fillResults Array of amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n disableRefundUntilEnd\n returns (LibFillResults.FillResults[] memory fillResults)\n {\n uint256 ordersLength = orders.length;\n fillResults = new LibFillResults.FillResults[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n fillResults[i] = _fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n return fillResults;\n }\n\n /// @dev Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return fillResults Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n disableRefundUntilEnd\n returns (LibFillResults.FillResults memory fillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = takerAssetFillAmount.safeSub(fillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n LibFillResults.FillResults memory singleFillResults = _fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n fillResults = LibFillResults.addFillResults(fillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (fillResults.takerAssetFilledAmount >= takerAssetFillAmount) {\n break;\n }\n }\n return fillResults;\n }\n\n /// @dev Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return fillResults Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n disableRefundUntilEnd\n returns (LibFillResults.FillResults memory fillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = makerAssetFillAmount.safeSub(fillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = LibMath.getPartialAmountCeil(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n LibFillResults.FillResults memory singleFillResults = _fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n fillResults = LibFillResults.addFillResults(fillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (fillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return fillResults;\n }\n\n /// @dev Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Minimum amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return fillResults Amounts filled and fees paid by makers and taker.\n function marketSellOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults)\n {\n fillResults = marketSellOrdersNoThrow(orders, takerAssetFillAmount, signatures);\n if (fillResults.takerAssetFilledAmount < takerAssetFillAmount) {\n LibRichErrors.rrevert(LibExchangeRichErrors.IncompleteFillError(\n LibExchangeRichErrors.IncompleteFillErrorCode.INCOMPLETE_MARKET_SELL_ORDERS,\n takerAssetFillAmount,\n fillResults.takerAssetFilledAmount\n ));\n }\n }\n\n /// @dev Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Minimum amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return fillResults Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults)\n {\n fillResults = marketBuyOrdersNoThrow(orders, makerAssetFillAmount, signatures);\n if (fillResults.makerAssetFilledAmount < makerAssetFillAmount) {\n LibRichErrors.rrevert(LibExchangeRichErrors.IncompleteFillError(\n LibExchangeRichErrors.IncompleteFillErrorCode.INCOMPLETE_MARKET_BUY_ORDERS,\n makerAssetFillAmount,\n fillResults.makerAssetFilledAmount\n ));\n }\n }\n\n /// @dev Executes multiple calls of cancelOrder.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n payable\n refundFinalBalanceNoReentry\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n _cancelOrder(orders[i]);\n }\n }\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param fillResults ignature Proof that order has been created by maker.\n function _fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (LibFillResults.FillResults memory fillResults)\n {\n fillResults = _fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n if (fillResults.takerAssetFilledAmount != takerAssetFillAmount) {\n LibRichErrors.rrevert(LibExchangeRichErrors.IncompleteFillError(\n LibExchangeRichErrors.IncompleteFillErrorCode.INCOMPLETE_FILL_ORDER,\n takerAssetFillAmount,\n fillResults.takerAssetFilledAmount\n ));\n }\n return fillResults;\n }\n\n /// @dev Fills the input order.\n /// Returns a null FillResults instance if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function _fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (LibFillResults.FillResults memory fillResults)\n {\n // ABI encode calldata for `fillOrder`\n bytes memory fillOrderCalldata = abi.encodeWithSelector(\n IExchangeCore(address(0)).fillOrder.selector,\n order,\n takerAssetFillAmount,\n signature\n );\n\n (bool didSucceed, bytes memory returnData) = address(this).delegatecall(fillOrderCalldata);\n if (didSucceed) {\n assert(returnData.length == 160);\n fillResults = abi.decode(returnData, (LibFillResults.FillResults));\n }\n // fillResults values will be 0 by default if call was unsuccessful\n return fillResults;\n }\n}\n"
},
"./interfaces/IWrapperFunctions.sol": {
"id": 21,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrKillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Array of amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults[] memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// If any fill reverts, the error is caught and ignored.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.\n /// NOTE: This function does not enforce that the takerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Minimum amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.\n /// NOTE: This function does not enforce that the makerAsset is the same for each order.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Minimum amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersFillOrKill(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n payable\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Executes multiple calls of cancelOrder.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n payable;\n}\n"
},
"./MixinTransferSimulator.sol": {
"id": 7,
"content": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinAssetProxyDispatcher.sol\";\n\n\ncontract MixinTransferSimulator is\n MixinAssetProxyDispatcher\n{\n /// @dev This function may be used to simulate any amount of transfers\n /// As they would occur through the Exchange contract. Note that this function\n /// will always revert, even if all transfers are successful. However, it may\n /// be used with eth_call or with a try/catch pattern in order to simulate\n /// the results of the transfers.\n /// @param assetData Array of asset details, each encoded per the AssetProxy contract specification.\n /// @param fromAddresses Array containing the `from` addresses that correspond with each transfer.\n /// @param toAddresses Array containing the `to` addresses that correspond with each transfer.\n /// @param amounts Array containing the amounts that correspond to each transfer.\n /// @return This function does not return a value. However, it will always revert with\n /// `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful.\n function simulateDispatchTransferFromCalls(\n bytes[] memory assetData,\n address[] memory fromAddresses,\n address[] memory toAddresses,\n uint256[] memory amounts\n )\n public\n {\n uint256 length = assetData.length;\n for (uint256 i = 0; i != length; i++) {\n _dispatchTransferFrom(\n // The index is passed in as `orderHash` so that a failed transfer can be quickly identified when catching the error\n bytes32(i),\n assetData[i],\n fromAddresses[i],\n toAddresses[i],\n amounts[i]\n );\n }\n revert(\"TRANSFERS_SUCCESSFUL\");\n }\n}\n"
}
},
"sourceCodes": {
"./Exchange.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol\";\nimport \"./MixinMatchOrders.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinTransferSimulator.sol\";\n\n\n// solhint-disable no-empty-blocks\n// MixinAssetProxyDispatcher, MixinExchangeCore, MixinSignatureValidator,\n// and MixinTransactions are all inherited via the other Mixins that are\n// used.\n/// @dev The 0x Exchange contract.\ncontract Exchange is\n LibEIP712ExchangeDomain,\n MixinMatchOrders,\n MixinWrapperFunctions,\n MixinTransferSimulator\n{\n /// @dev Mixins are instantiated in the order they are inherited\n /// @param chainId Chain ID of the network this contract is deployed on.\n constructor (uint256 chainId)\n public\n LibEIP712ExchangeDomain(chainId, address(0))\n {}\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibEIP712ExchangeDomain.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\ncontract LibEIP712ExchangeDomain {\n\n // EIP712 Exchange Domain Name value\n string constant internal _EIP712_EXCHANGE_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Exchange Domain Version value\n string constant internal _EIP712_EXCHANGE_DOMAIN_VERSION = \"3.0.0\";\n\n // solhint-disable var-name-mixedcase\n /// @dev Hash of the EIP712 Domain Separator data\n /// @return 0 Domain hash.\n bytes32 public EIP712_EXCHANGE_DOMAIN_HASH;\n // solhint-enable var-name-mixedcase\n\n /// @param chainId Chain ID of the network this contract is deployed on.\n /// @param verifyingContractAddressIfExists Address of the verifying contract (null if the address of this contract)\n constructor (\n uint256 chainId,\n address verifyingContractAddressIfExists\n )\n public\n {\n address verifyingContractAddress = verifyingContractAddressIfExists == address(0) ? address(this) : verifyingContractAddressIfExists;\n EIP712_EXCHANGE_DOMAIN_HASH = LibEIP712.hashEIP712Domain(\n _EIP712_EXCHANGE_DOMAIN_NAME,\n _EIP712_EXCHANGE_DOMAIN_VERSION,\n chainId,\n verifyingContractAddress\n );\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibEIP712.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibEIP712 {\n\n // Hash of the EIP712 Domain Separator Schema\n // keccak256(abi.encodePacked(\n // \"EIP712Domain(\",\n // \"string name,\",\n // \"string version,\",\n // \"uint256 chainId,\",\n // \"address verifyingContract\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev Calculates a EIP712 domain separator.\n /// @param name The EIP712 domain name.\n /// @param version The EIP712 domain version.\n /// @param verifyingContract The EIP712 verifying contract.\n /// @return EIP712 domain separator.\n function hashEIP712Domain(\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // _EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n // keccak256(bytes(name)),\n // keccak256(bytes(version)),\n // chainId,\n // uint256(verifyingContract)\n // ))\n\n assembly {\n // Calculate hashes of dynamic data\n let nameHash := keccak256(add(name, 32), mload(name))\n let versionHash := keccak256(add(version, 32), mload(version))\n\n // Load free memory pointer\n let memPtr := mload(64)\n\n // Store params in memory\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), nameHash)\n mstore(add(memPtr, 64), versionHash)\n mstore(add(memPtr, 96), chainId)\n mstore(add(memPtr, 128), verifyingContract)\n\n // Compute hash\n result := keccak256(memPtr, 160)\n }\n return result;\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct with a given domain hash.\n /// @param eip712DomainHash Hash of the domain domain separator data, computed\n /// with getDomainHash().\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to the given EIP712 Domain.\n function hashEIP712Message(bytes32 eip712DomainHash, bytes32 hashStruct)\n internal\n pure\n returns (bytes32 result)\n {\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
"./MixinMatchOrders.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol\";\nimport \"./interfaces/IMatchOrders.sol\";\nimport \"./MixinExchangeCore.sol\";\n\n\ncontract MixinMatchOrders is\n MixinExchangeCore,\n IMatchOrders\n{\n using LibBytes for bytes;\n using LibSafeMath for uint256;\n using LibOrder for LibOrder.Order;\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n return _batchMatchOrders(\n leftOrders,\n rightOrders,\n leftSignatures,\n rightSignatures,\n false\n );\n }\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function batchMatchOrdersWithMaximalFill(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n return _batchMatchOrders(\n leftOrders,\n rightOrders,\n leftSignatures,\n rightSignatures,\n true\n );\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n return _matchOrders(\n leftOrder,\n rightOrder,\n leftSignature,\n rightSignature,\n false\n );\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is maximally filled at their respective price point, and\n /// the matcher receives a profit denominated in either the left maker asset,\n /// right maker asset, or a combination of both.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled by maker and taker of matched orders.\n function matchOrdersWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n payable\n refundFinalBalanceNoReentry\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n return _matchOrders(\n leftOrder,\n rightOrder,\n leftSignature,\n rightSignature,\n true\n );\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderHash First matched order hash.\n /// @param rightOrderHash Second matched order hash.\n function _assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n if (leftOrder.makerAssetAmount.safeMul(rightOrder.makerAssetAmount) <\n leftOrder.takerAssetAmount.safeMul(rightOrder.takerAssetAmount)) {\n LibRichErrors.rrevert(LibExchangeRichErrors.NegativeSpreadError(\n leftOrderHash,\n rightOrderHash\n ));\n }\n }\n\n /// @dev Match complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point, and\n /// the matcher receives a profit denominated in the left maker asset.\n /// This is the reentrant version of `batchMatchOrders` and `batchMatchOrdersWithMaximalFill`.\n /// @param leftOrders Set of orders with the same maker / taker asset.\n /// @param rightOrders Set of orders to match against `leftOrders`\n /// @param leftSignatures Proof that left orders were created by the left makers.\n /// @param rightSignatures Proof that right orders were created by the right makers.\n /// @param shouldMaximallyFillOrders A value that indicates whether or not the order matching\n /// should be done with maximal fill.\n /// @return batchMatchedFillResults Amounts filled and profit generated.\n function _batchMatchOrders(\n LibOrder.Order[] memory leftOrders,\n LibOrder.Order[] memory rightOrders,\n bytes[] memory leftSignatures,\n bytes[] memory rightSignatures,\n bool shouldMaximallyFillOrders\n )\n internal\n returns (LibFillResults.BatchMatchedFillResults memory batchMatchedFillResults)\n {\n // Ensure that the left and right orders have nonzero lengths.\n if (leftOrders.length == 0) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.ZERO_LEFT_ORDERS\n ));\n }\n if (rightOrders.length == 0) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.ZERO_RIGHT_ORDERS\n ));\n }\n\n // Ensure that the left and right arrays are compatible.\n if (leftOrders.length != leftSignatures.length) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.INVALID_LENGTH_LEFT_SIGNATURES\n ));\n }\n if (rightOrders.length != rightSignatures.length) {\n LibRichErrors.rrevert(LibExchangeRichErrors.BatchMatchOrdersError(\n LibExchangeRichErrors.BatchMatchOrdersErrorCodes.INVALID_LENGTH_RIGHT_SIGNATURES\n ));\n }\n\n batchMatchedFillResults.left = new LibFillResults.FillResults[](leftOrders.length);\n batchMatchedFillResults.right = new LibFillResults.FillResults[](rightOrders.length);\n\n // Set up initial indices.\n uint256 leftIdx = 0;\n uint256 rightIdx = 0;\n\n // Keep local variables for orders, order filled amounts, and signatures for efficiency.\n LibOrder.Order memory leftOrder = leftOrders[0];\n LibOrder.Order memory rightOrder = rightOrders[0];\n (, uint256 leftOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(leftOrder);\n (, uint256 rightOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(rightOrder);\n LibFillResults.FillResults memory leftFillResults;\n LibFillResults.FillResults memory rightFillResults;\n\n // Loop infinitely (until broken inside of the loop), but keep a counter of how\n // many orders have been matched.\n for (;;) {\n // Match the two orders that are pointed to by the left and right indices\n LibFillResults.MatchedFillResults memory matchResults = _matchOrders(\n leftOrder,\n rightOrder,\n leftSignatures[leftIdx],\n rightSignatures[rightIdx],\n shouldMaximallyFillOrders\n );\n\n // Update the order filled amounts with the updated takerAssetFilledAmount\n leftOrderTakerAssetFilledAmount = leftOrderTakerAssetFilledAmount.safeAdd(matchResults.left.takerAssetFilledAmount);\n rightOrderTakerAssetFilledAmount = rightOrderTakerAssetFilledAmount.safeAdd(matchResults.right.takerAssetFilledAmount);\n\n // Aggregate the new fill results with the previous fill results for the current orders.\n leftFillResults = LibFillResults.addFillResults(\n leftFillResults,\n matchResults.left\n );\n rightFillResults = LibFillResults.addFillResults(\n rightFillResults,\n matchResults.right\n );\n\n // Update the profit in the left and right maker assets using the profits from\n // the match.\n batchMatchedFillResults.profitInLeftMakerAsset = batchMatchedFillResults.profitInLeftMakerAsset.safeAdd(\n matchResults.profitInLeftMakerAsset\n );\n batchMatchedFillResults.profitInRightMakerAsset = batchMatchedFillResults.profitInRightMakerAsset.safeAdd(\n matchResults.profitInRightMakerAsset\n );\n\n // If the leftOrder is filled, update the leftIdx, leftOrder, and leftSignature,\n // or break out of the loop if there are no more leftOrders to match.\n if (leftOrderTakerAssetFilledAmount >= leftOrder.takerAssetAmount) {\n // Update the batched fill results once the leftIdx is updated.\n batchMatchedFillResults.left[leftIdx++] = leftFillResults;\n // Clear the intermediate fill results value.\n leftFillResults = LibFillResults.FillResults(0, 0, 0, 0, 0);\n\n // If all of the left orders have been filled, break out of the loop.\n // Otherwise, update the current right order.\n if (leftIdx == leftOrders.length) {\n // Update the right batched fill results\n batchMatchedFillResults.right[rightIdx] = rightFillResults;\n break;\n } else {\n leftOrder = leftOrders[leftIdx];\n (, leftOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(leftOrder);\n }\n }\n\n // If the rightOrder is filled, update the rightIdx, rightOrder, and rightSignature,\n // or break out of the loop if there are no more rightOrders to match.\n if (rightOrderTakerAssetFilledAmount >= rightOrder.takerAssetAmount) {\n // Update the batched fill results once the rightIdx is updated.\n batchMatchedFillResults.right[rightIdx++] = rightFillResults;\n // Clear the intermediate fill results value.\n rightFillResults = LibFillResults.FillResults(0, 0, 0, 0, 0);\n\n // If all of the right orders have been filled, break out of the loop.\n // Otherwise, update the current right order.\n if (rightIdx == rightOrders.length) {\n // Update the left batched fill results\n batchMatchedFillResults.left[leftIdx] = leftFillResults;\n break;\n } else {\n rightOrder = rightOrders[rightIdx];\n (, rightOrderTakerAssetFilledAmount) = _getOrderHashAndFilledAmount(rightOrder);\n }\n }\n }\n\n // Return the fill results from the batch match\n return batchMatchedFillResults;\n }\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders). This\n /// function is needed to allow for reentrant order matching (used by `batchMatchOrders` and\n /// `batchMatchOrdersWithMaximalFill`).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @param shouldMaximallyFillOrders Indicates whether or not the maximal fill matching strategy should be used\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function _matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature,\n bool shouldMaximallyFillOrders\n )\n internal\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData\n // by pointing these values to the same location in memory. This is cheaper than checking equality.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = _getCurrentContextAddress();\n\n // Either our context is valid or we revert\n _assertFillableOrder(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n leftSignature\n );\n _assertFillableOrder(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n rightSignature\n );\n _assertValidMatch(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderHash,\n rightOrderInfo.orderHash\n );\n\n // Compute proportional fill amounts\n matchedFillResults = LibFillResults.calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount,\n protocolFeeMultiplier,\n tx.gasprice,\n shouldMaximallyFillOrders\n );\n\n // Update exchange state\n _updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n _updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n\n // Settle matched orders. Succeeds or throws.\n _settleMatchedOrders(\n leftOrderInfo.orderHash,\n rightOrderInfo.orderHash,\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrderHash First matched order hash.\n /// @param rightOrderHash Second matched order hash.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function _settleMatchedOrders(\n bytes32 leftOrderHash,\n bytes32 rightOrderHash,\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n internal\n {\n address leftMakerAddress = leftOrder.makerAddress;\n address rightMakerAddress = rightOrder.makerAddress;\n address leftFeeRecipientAddress = leftOrder.feeRecipientAddress;\n address rightFeeRecipientAddress = rightOrder.feeRecipientAddress;\n\n // Right maker asset -> left maker\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerAssetData,\n rightMakerAddress,\n leftMakerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n\n // Left maker asset -> right maker\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerAssetData,\n leftMakerAddress,\n rightMakerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Right maker fee -> right fee recipient\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerFeeAssetData,\n rightMakerAddress,\n rightFeeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Left maker fee -> left fee recipient\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerFeeAssetData,\n leftMakerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n\n // Settle taker profits.\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.makerAssetData,\n leftMakerAddress,\n takerAddress,\n matchedFillResults.profitInLeftMakerAsset\n );\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.makerAssetData,\n rightMakerAddress,\n takerAddress,\n matchedFillResults.profitInRightMakerAsset\n );\n\n // Pay protocol fees for each maker\n bool didPayProtocolFees = _payTwoProtocolFees(\n leftOrderHash,\n rightOrderHash,\n matchedFillResults.left.protocolFeePaid,\n leftMakerAddress,\n rightMakerAddress,\n takerAddress\n );\n\n // Protocol fees are not paid if the protocolFeeCollector contract is not set\n if (!didPayProtocolFees) {\n matchedFillResults.left.protocolFeePaid = 0;\n matchedFillResults.right.protocolFeePaid = 0;\n }\n\n // Settle taker fees.\n if (\n leftFeeRecipientAddress == rightFeeRecipientAddress &&\n leftOrder.takerFeeAssetData.equals(rightOrder.takerFeeAssetData)\n ) {\n // Fee recipients and taker fee assets are identical, so we can\n // transfer them in one go.\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.takerFeeAssetData,\n takerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.takerFeePaid.safeAdd(matchedFillResults.right.takerFeePaid)\n );\n } else {\n // Right taker fee -> right fee recipient\n _dispatchTransferFrom(\n rightOrderHash,\n rightOrder.takerFeeAssetData,\n takerAddress,\n rightFeeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n\n // Left taker fee -> left fee recipient\n _dispatchTransferFrom(\n leftOrderHash,\n leftOrder.takerFeeAssetData,\n takerAddress,\n leftFeeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n }\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length\n );\n return result;\n }\n\n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Ensure that the from and to positions are valid positions for a slice within\n // the byte array that is being used.\n if (from > to) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n from,\n to\n ));\n }\n if (to > b.length) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n to,\n b.length\n ));\n }\n\n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n if (b.length == 0) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n b.length,\n 0\n ));\n }\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n if (b.length < index + 20) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n b.length,\n index + 20 // 20 is length of address\n ));\n }\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n\n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n if (b.length < index + 32) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n b.length,\n index + 32\n ));\n }\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n result = uint256(readBytes32(b, index));\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n if (b.length < index + 4) {\n LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n b.length,\n index + 4\n ));\n }\n\n // Arrays are prefixed by a 32 byte length field\n index += 32;\n\n // Read the bytes4 from array memory\n assembly {\n result := mload(add(b, index))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Writes a new length to a byte array.\n /// Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n /// Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n /// @param b Bytes array to write new length to.\n /// @param length New length of byte array.\n function writeLength(bytes memory b, uint256 length)\n internal\n pure\n {\n assembly {\n mstore(b, length)\n }\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n enum InvalidByteOperationErrorCodes {\n FromLessThanOrEqualsToRequired,\n ToLessThanOrEqualsLengthRequired,\n LengthGreaterThanZeroRequired,\n LengthGreaterThanOrEqualsFourRequired,\n LengthGreaterThanOrEqualsTwentyRequired,\n LengthGreaterThanOrEqualsThirtyTwoRequired,\n LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n DestinationLengthGreaterThanOrEqualSourceLengthRequired\n }\n\n // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n 0x28006595;\n\n // solhint-disable func-name-mixedcase\n function InvalidByteOperationError(\n InvalidByteOperationErrorCodes errorCode,\n uint256 offset,\n uint256 required\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n errorCode,\n offset,\n required\n );\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR =\n 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(\n string memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibEIP712.sol\";\n\n\nlibrary LibOrder {\n\n using LibOrder for Order;\n\n // Hash for the EIP712 Order Schema:\n // keccak256(abi.encodePacked(\n // \"Order(\",\n // \"address makerAddress,\",\n // \"address takerAddress,\",\n // \"address feeRecipientAddress,\",\n // \"address senderAddress,\",\n // \"uint256 makerAssetAmount,\",\n // \"uint256 takerAssetAmount,\",\n // \"uint256 makerFee,\",\n // \"uint256 takerFee,\",\n // \"uint256 expirationTimeSeconds,\",\n // \"uint256 salt,\",\n // \"bytes makerAssetData,\",\n // \"bytes takerAssetData,\",\n // \"bytes makerFeeAssetData,\",\n // \"bytes takerFeeAssetData\",\n // \")\"\n // ))\n bytes32 constant internal _EIP712_ORDER_SCHEMA_HASH =\n 0xf80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a7534;\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's status is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n /// @dev Canonical order structure.\n struct Order {\n address makerAddress; // Address that created the order.\n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.\n address feeRecipientAddress; // Address that will recieve fees when order is filled.\n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.\n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.\n uint256 makerFee; // Fee paid to feeRecipient by maker when order is filled.\n uint256 takerFee; // Fee paid to feeRecipient by taker when order is filled.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.\n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.\n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The leading bytes4 references the id of the asset proxy.\n bytes makerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerFeeAsset. The leading bytes4 references the id of the asset proxy.\n bytes takerFeeAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerFeeAsset. The leading bytes4 references the id of the asset proxy.\n }\n // solhint-enable max-line-length\n\n /// @dev Order information returned by `getOrderInfo()`.\n struct OrderInfo {\n OrderStatus orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 typed data hash of the order (see LibOrder.getTypedDataHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates the EIP712 typed data hash of an order with a given domain separator.\n /// @param order The order structure.\n /// @return EIP712 typed data hash of the order.\n function getTypedDataHash(Order memory order, bytes32 eip712ExchangeDomainHash)\n internal\n pure\n returns (bytes32 orderHash)\n {\n orderHash = LibEIP712.hashEIP712Message(\n eip712ExchangeDomainHash,\n order.getStructHash()\n );\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order struct.\n /// @param order The order structure.\n /// @return EIP712 hash of the order struct.\n function getStructHash(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = _EIP712_ORDER_SCHEMA_HASH;\n bytes memory makerAssetData = order.makerAssetData;\n bytes memory takerAssetData = order.takerAssetData;\n bytes memory makerFeeAssetData = order.makerFeeAssetData;\n bytes memory takerFeeAssetData = order.takerFeeAssetData;\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // uint256(order.makerAddress),\n // uint256(order.takerAddress),\n // uint256(order.feeRecipientAddress),\n // uint256(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData),\n // keccak256(order.makerFeeAssetData),\n // keccak256(order.takerFeeAssetData)\n // ));\n\n assembly {\n // Assert order offset (this is an internal error that should never be triggered)\n if lt(order, 32) {\n invalid()\n }\n\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n let pos4 := add(order, 384)\n let pos5 := add(order, 416)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n let temp4 := mload(pos4)\n let temp5 := mload(pos5)\n\n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, keccak256(add(makerAssetData, 32), mload(makerAssetData))) // store hash of makerAssetData\n mstore(pos3, keccak256(add(takerAssetData, 32), mload(takerAssetData))) // store hash of takerAssetData\n mstore(pos4, keccak256(add(makerFeeAssetData, 32), mload(makerFeeAssetData))) // store hash of makerFeeAssetData\n mstore(pos5, keccak256(add(takerFeeAssetData, 32), mload(takerFeeAssetData))) // store hash of takerFeeAssetData\n result := keccak256(pos1, 480)\n\n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n mstore(pos4, temp4)\n mstore(pos5, temp5)\n }\n return result;\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./LibMath.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibFillResults {\n\n using LibSafeMath for uint256;\n\n struct BatchMatchedFillResults {\n FillResults[] left; // Fill results for left orders\n FillResults[] right; // Fill results for right orders\n uint256 profitInLeftMakerAsset; // Profit taken from left makers\n uint256 profitInRightMakerAsset; // Profit taken from right makers\n }\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of fees paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of fees paid by taker to feeRecipients(s).\n uint256 protocolFeePaid; // Total amount of fees paid by taker to the staking contract.\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 profitInLeftMakerAsset; // Profit taken from the left maker\n uint256 profitInRightMakerAsset; // Profit taken from the right maker\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill.\n fillResults.protocolFeePaid = gasPrice.safeMul(protocolFeeMultiplier);\n\n return fillResults;\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param protocolFeeMultiplier The current protocol fee of the exchange contract.\n /// @param gasPrice The gasprice of the transaction. This is provided so that the function call can continue\n /// to be pure rather than view.\n /// @param shouldMaximallyFillOrders A value that indicates whether or not this calculation should use\n /// the maximal fill order matching strategy.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount,\n uint256 protocolFeeMultiplier,\n uint256 gasPrice,\n bool shouldMaximallyFillOrders\n )\n internal\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Derive maker asset amounts for left & right orders, given store taker assert amounts\n uint256 leftTakerAssetAmountRemaining = leftOrder.takerAssetAmount.safeSub(leftOrderTakerAssetFilledAmount);\n uint256 leftMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n leftTakerAssetAmountRemaining\n );\n uint256 rightTakerAssetAmountRemaining = rightOrder.takerAssetAmount.safeSub(rightOrderTakerAssetFilledAmount);\n uint256 rightMakerAssetAmountRemaining = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetAmountRemaining\n );\n\n // Maximally fill the orders and pay out profits to the matcher in one or both of the maker assets.\n if (shouldMaximallyFillOrders) {\n matchedFillResults = _calculateMatchedFillResultsWithMaximalFill(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else {\n matchedFillResults = _calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Compute fees for left order\n matchedFillResults.left.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.makerAssetFilledAmount,\n leftOrder.makerAssetAmount,\n leftOrder.makerFee\n );\n matchedFillResults.left.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.left.takerAssetFilledAmount,\n leftOrder.takerAssetAmount,\n leftOrder.takerFee\n );\n\n // Compute fees for right order\n matchedFillResults.right.makerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.makerAssetFilledAmount,\n rightOrder.makerAssetAmount,\n rightOrder.makerFee\n );\n matchedFillResults.right.takerFeePaid = LibMath.safeGetPartialAmountFloor(\n matchedFillResults.right.takerAssetFilledAmount,\n rightOrder.takerAssetAmount,\n rightOrder.takerFee\n );\n\n // Compute the protocol fee that should be paid for a single fill. In this\n // case this should be made the protocol fee for both the left and right orders.\n uint256 protocolFee = gasPrice.safeMul(protocolFeeMultiplier);\n matchedFillResults.left.protocolFeePaid = protocolFee;\n matchedFillResults.right.protocolFeePaid = protocolFee;\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// @param fillResults1 The first FillResults.\n /// @param fillResults2 The second FillResults.\n /// @return The sum of both fill results.\n function addFillResults(\n FillResults memory fillResults1,\n FillResults memory fillResults2\n )\n internal\n pure\n returns (FillResults memory totalFillResults)\n {\n totalFillResults.makerAssetFilledAmount = fillResults1.makerAssetFilledAmount.safeAdd(fillResults2.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = fillResults1.takerAssetFilledAmount.safeAdd(fillResults2.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = fillResults1.makerFeePaid.safeAdd(fillResults2.makerFeePaid);\n totalFillResults.takerFeePaid = fillResults1.takerFeePaid.safeAdd(fillResults2.takerFeePaid);\n totalFillResults.protocolFeePaid = fillResults1.protocolFeePaid.safeAdd(fillResults2.protocolFeePaid);\n\n return totalFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the fill strategy that only\n /// awards profit denominated in the left maker asset.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate fill results for maker and taker assets: at least one order will be fully filled.\n // The maximum amount the left maker can buy is `leftTakerAssetAmountRemaining`\n // The maximum amount the right maker can sell is `rightMakerAssetAmountRemaining`\n // We have two distinct cases for calculating the fill results:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // If the left maker can buy exactly what the right maker can sell, then both orders are fully filled.\n // Case 2.\n // If the left maker cannot buy more than the right maker can sell, then only the left order is fully filled.\n // Case 3.\n // If the left maker can buy exactly as much as the right maker can sell, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (leftTakerAssetAmountRemaining < rightMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round up to ensure the maker's exchange rate does not exceed the price specified by the order.\n // We favor the maker when the exchange rate must be rounded.\n matchedFillResults.right.takerAssetFilledAmount = LibMath.safeGetPartialAmountCeil(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetAmountRemaining // matchedFillResults.right.makerAssetFilledAmount\n );\n } else {\n // leftTakerAssetAmountRemaining == rightMakerAssetAmountRemaining\n // Case 3: Both orders are fully filled. Technically, this could be captured by the above cases, but\n // this calculation will be more precise since it does not include rounding.\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n return matchedFillResults;\n }\n\n /// @dev Calculates part of the matched fill results for a given situation using the maximal fill order matching\n /// strategy.\n /// @param leftOrder The left order in the order matching situation.\n /// @param rightOrder The right order in the order matching situation.\n /// @param leftMakerAssetAmountRemaining The amount of the left order maker asset that can still be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left order taker asset that can still be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right order maker asset that can still be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right order taker asset that can still be filled.\n /// @return MatchFillResults struct that does not include fees paid.\n function _calculateMatchedFillResultsWithMaximalFill(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // If a maker asset is greater than the opposite taker asset, than there will be a spread denominated in that maker asset.\n bool doesLeftMakerAssetProfitExist = leftMakerAssetAmountRemaining > rightTakerAssetAmountRemaining;\n bool doesRightMakerAssetProfitExist = rightMakerAssetAmountRemaining > leftTakerAssetAmountRemaining;\n\n // Calculate the maximum fill results for the maker and taker assets. At least one of the orders will be fully filled.\n //\n // The maximum that the left maker can possibly buy is the amount that the right order can sell.\n // The maximum that the right maker can possibly buy is the amount that the left order can sell.\n //\n // If the left order is fully filled, profit will be paid out in the left maker asset. If the right order is fully filled,\n // the profit will be out in the right maker asset.\n //\n // There are three cases to consider:\n // Case 1.\n // If the left maker can buy more than the right maker can sell, then only the right order is fully filled.\n // Case 2.\n // If the right maker can buy more than the left maker can sell, then only the right order is fully filled.\n // Case 3.\n // If the right maker can sell the max of what the left maker can buy and the left maker can sell the max of\n // what the right maker can buy, then both orders are fully filled.\n if (leftTakerAssetAmountRemaining > rightMakerAssetAmountRemaining) {\n // Case 1: Right order is fully filled with the profit paid in the left makerAsset\n matchedFillResults = _calculateCompleteRightFill(\n leftOrder,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n } else if (rightTakerAssetAmountRemaining > leftMakerAssetAmountRemaining) {\n // Case 2: Left order is fully filled with the profit paid in the right makerAsset.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n // Round down to ensure the right maker's exchange rate does not exceed the price specified by the order.\n // We favor the right maker when the exchange rate must be rounded and the profit is being paid in the\n // right maker asset.\n matchedFillResults.right.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n leftMakerAssetAmountRemaining\n );\n matchedFillResults.right.takerAssetFilledAmount = leftMakerAssetAmountRemaining;\n } else {\n // Case 3: The right and left orders are fully filled\n matchedFillResults = _calculateCompleteFillBoth(\n leftMakerAssetAmountRemaining,\n leftTakerAssetAmountRemaining,\n rightMakerAssetAmountRemaining,\n rightTakerAssetAmountRemaining\n );\n }\n\n // Calculate amount given to taker in the left order's maker asset if the left spread will be part of the profit.\n if (doesLeftMakerAssetProfitExist) {\n matchedFillResults.profitInLeftMakerAsset = matchedFillResults.left.makerAssetFilledAmount.safeSub(\n matchedFillResults.right.takerAssetFilledAmount\n );\n }\n\n // Calculate amount given to taker in the right order's maker asset if the right spread will be part of the profit.\n if (doesRightMakerAssetProfitExist) {\n matchedFillResults.profitInRightMakerAsset = matchedFillResults.right.makerAssetFilledAmount.safeSub(\n matchedFillResults.left.takerAssetFilledAmount\n );\n }\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order. Both orders will be fully filled in this\n /// case.\n /// @param leftMakerAssetAmountRemaining The amount of the left maker asset that is remaining to be filled.\n /// @param leftTakerAssetAmountRemaining The amount of the left taker asset that is remaining to be filled.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteFillBoth(\n uint256 leftMakerAssetAmountRemaining,\n uint256 leftTakerAssetAmountRemaining,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n // Calculate the fully filled results for both orders.\n matchedFillResults.left.makerAssetFilledAmount = leftMakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = leftTakerAssetAmountRemaining;\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n return matchedFillResults;\n }\n\n /// @dev Calculates the fill results for the maker and taker in the order matching and writes the results\n /// to the fillResults that are being collected on the order.\n /// @param leftOrder The left order that is being maximally filled. All of the information about fill amounts\n /// can be derived from this order and the right asset remaining fields.\n /// @param rightMakerAssetAmountRemaining The amount of the right maker asset that is remaining to be filled.\n /// @param rightTakerAssetAmountRemaining The amount of the right taker asset that is remaining to be filled.\n /// @return MatchFillResults struct that does not include fees paid or spreads taken.\n function _calculateCompleteRightFill(\n LibOrder.Order memory leftOrder,\n uint256 rightMakerAssetAmountRemaining,\n uint256 rightTakerAssetAmountRemaining\n )\n private\n pure\n returns (MatchedFillResults memory matchedFillResults)\n {\n matchedFillResults.right.makerAssetFilledAmount = rightMakerAssetAmountRemaining;\n matchedFillResults.right.takerAssetFilledAmount = rightTakerAssetAmountRemaining;\n matchedFillResults.left.takerAssetFilledAmount = rightMakerAssetAmountRemaining;\n // Round down to ensure the left maker's exchange rate does not exceed the price specified by the order.\n // We favor the left maker when the exchange rate must be rounded and the profit is being paid in the\n // left maker asset.\n matchedFillResults.left.makerAssetFilledAmount = LibMath.safeGetPartialAmountFloor(\n leftOrder.makerAssetAmount,\n leftOrder.takerAssetAmount,\n rightMakerAssetAmountRemaining\n );\n\n return matchedFillResults;\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n using LibSafeMath for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibOrder.sol\";\n\n\nlibrary LibExchangeRichErrors {\n\n enum AssetProxyDispatchErrorCodes {\n INVALID_ASSET_DATA_LENGTH,\n UNKNOWN_ASSET_PROXY\n }\n\n enum BatchMatchOrdersErrorCodes {\n ZERO_LEFT_ORDERS,\n ZERO_RIGHT_ORDERS,\n INVALID_LENGTH_LEFT_SIGNATURES,\n INVALID_LENGTH_RIGHT_SIGNATURES\n }\n\n enum ExchangeContextErrorCodes {\n INVALID_MAKER,\n INVALID_TAKER,\n INVALID_SENDER\n }\n\n enum FillErrorCodes {\n INVALID_TAKER_AMOUNT,\n TAKER_OVERPAY,\n OVERFILL,\n INVALID_FILL_PRICE\n }\n\n enum SignatureErrorCodes {\n BAD_ORDER_SIGNATURE,\n BAD_TRANSACTION_SIGNATURE,\n INVALID_LENGTH,\n UNSUPPORTED,\n ILLEGAL,\n INAPPROPRIATE_SIGNATURE_TYPE,\n INVALID_SIGNER\n }\n\n enum TransactionErrorCodes {\n ALREADY_EXECUTED,\n EXPIRED\n }\n\n enum IncompleteFillErrorCode {\n INCOMPLETE_MARKET_BUY_ORDERS,\n INCOMPLETE_MARKET_SELL_ORDERS,\n INCOMPLETE_FILL_ORDER\n }\n\n // bytes4(keccak256(\"SignatureError(uint8,bytes32,address,bytes)\"))\n bytes4 internal constant SIGNATURE_ERROR_SELECTOR =\n 0x7e5a2318;\n\n // bytes4(keccak256(\"SignatureValidatorNotApprovedError(address,address)\"))\n bytes4 internal constant SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR =\n 0xa15c0d06;\n\n // bytes4(keccak256(\"EIP1271SignatureError(address,bytes,bytes,bytes)\"))\n bytes4 internal constant EIP1271_SIGNATURE_ERROR_SELECTOR =\n 0x5bd0428d;\n\n // bytes4(keccak256(\"SignatureWalletError(bytes32,address,bytes,bytes)\"))\n bytes4 internal constant SIGNATURE_WALLET_ERROR_SELECTOR =\n 0x1b8388f7;\n\n // bytes4(keccak256(\"OrderStatusError(bytes32,uint8)\"))\n bytes4 internal constant ORDER_STATUS_ERROR_SELECTOR =\n 0xfdb6ca8d;\n\n // bytes4(keccak256(\"ExchangeInvalidContextError(uint8,bytes32,address)\"))\n bytes4 internal constant EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xe53c76c8;\n\n // bytes4(keccak256(\"FillError(uint8,bytes32)\"))\n bytes4 internal constant FILL_ERROR_SELECTOR =\n 0xe94a7ed0;\n\n // bytes4(keccak256(\"OrderEpochError(address,address,uint256)\"))\n bytes4 internal constant ORDER_EPOCH_ERROR_SELECTOR =\n 0x4ad31275;\n\n // bytes4(keccak256(\"AssetProxyExistsError(bytes4,address)\"))\n bytes4 internal constant ASSET_PROXY_EXISTS_ERROR_SELECTOR =\n 0x11c7b720;\n\n // bytes4(keccak256(\"AssetProxyDispatchError(uint8,bytes32,bytes)\"))\n bytes4 internal constant ASSET_PROXY_DISPATCH_ERROR_SELECTOR =\n 0x488219a6;\n\n // bytes4(keccak256(\"AssetProxyTransferError(bytes32,bytes,bytes)\"))\n bytes4 internal constant ASSET_PROXY_TRANSFER_ERROR_SELECTOR =\n 0x4678472b;\n\n // bytes4(keccak256(\"NegativeSpreadError(bytes32,bytes32)\"))\n bytes4 internal constant NEGATIVE_SPREAD_ERROR_SELECTOR =\n 0xb6555d6f;\n\n // bytes4(keccak256(\"TransactionError(uint8,bytes32)\"))\n bytes4 internal constant TRANSACTION_ERROR_SELECTOR =\n 0xf5985184;\n\n // bytes4(keccak256(\"TransactionExecutionError(bytes32,bytes)\"))\n bytes4 internal constant TRANSACTION_EXECUTION_ERROR_SELECTOR =\n 0x20d11f61;\n \n // bytes4(keccak256(\"TransactionGasPriceError(bytes32,uint256,uint256)\"))\n bytes4 internal constant TRANSACTION_GAS_PRICE_ERROR_SELECTOR =\n 0xa26dac09;\n\n // bytes4(keccak256(\"TransactionInvalidContextError(bytes32,address)\"))\n bytes4 internal constant TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR =\n 0xdec4aedf;\n\n // bytes4(keccak256(\"IncompleteFillError(uint8,uint256,uint256)\"))\n bytes4 internal constant INCOMPLETE_FILL_ERROR_SELECTOR =\n 0x18e4b141;\n\n // bytes4(keccak256(\"BatchMatchOrdersError(uint8)\"))\n bytes4 internal constant BATCH_MATCH_ORDERS_ERROR_SELECTOR =\n 0xd4092f4f;\n\n // bytes4(keccak256(\"PayProtocolFeeError(bytes32,uint256,address,address,bytes)\"))\n bytes4 internal constant PAY_PROTOCOL_FEE_ERROR_SELECTOR =\n 0x87cb1e75;\n\n // solhint-disable func-name-mixedcase\n function SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureValidatorNotApprovedErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR;\n }\n\n function EIP1271SignatureErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EIP1271_SIGNATURE_ERROR_SELECTOR;\n }\n\n function SignatureWalletErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return SIGNATURE_WALLET_ERROR_SELECTOR;\n }\n\n function OrderStatusErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_STATUS_ERROR_SELECTOR;\n }\n\n function ExchangeInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function FillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return FILL_ERROR_SELECTOR;\n }\n\n function OrderEpochErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ORDER_EPOCH_ERROR_SELECTOR;\n }\n\n function AssetProxyExistsErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_EXISTS_ERROR_SELECTOR;\n }\n\n function AssetProxyDispatchErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_DISPATCH_ERROR_SELECTOR;\n }\n\n function AssetProxyTransferErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return ASSET_PROXY_TRANSFER_ERROR_SELECTOR;\n }\n\n function NegativeSpreadErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return NEGATIVE_SPREAD_ERROR_SELECTOR;\n }\n\n function TransactionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_ERROR_SELECTOR;\n }\n\n function TransactionExecutionErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_EXECUTION_ERROR_SELECTOR;\n }\n\n function IncompleteFillErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return INCOMPLETE_FILL_ERROR_SELECTOR;\n }\n\n function BatchMatchOrdersErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return BATCH_MATCH_ORDERS_ERROR_SELECTOR;\n }\n\n function TransactionGasPriceErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_GAS_PRICE_ERROR_SELECTOR;\n }\n\n function TransactionInvalidContextErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR;\n }\n\n function PayProtocolFeeErrorSelector()\n internal\n pure\n returns (bytes4)\n {\n return PAY_PROTOCOL_FEE_ERROR_SELECTOR;\n }\n \n function BatchMatchOrdersError(\n BatchMatchOrdersErrorCodes errorCode\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n BATCH_MATCH_ORDERS_ERROR_SELECTOR,\n errorCode\n );\n }\n\n function SignatureError(\n SignatureErrorCodes errorCode,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_ERROR_SELECTOR,\n errorCode,\n hash,\n signerAddress,\n signature\n );\n }\n\n function SignatureValidatorNotApprovedError(\n address signerAddress,\n address validatorAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_VALIDATOR_NOT_APPROVED_ERROR_SELECTOR,\n signerAddress,\n validatorAddress\n );\n }\n\n function EIP1271SignatureError(\n address verifyingContractAddress,\n bytes memory data,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EIP1271_SIGNATURE_ERROR_SELECTOR,\n verifyingContractAddress,\n data,\n signature,\n errorData\n );\n }\n\n function SignatureWalletError(\n bytes32 hash,\n address walletAddress,\n bytes memory signature,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNATURE_WALLET_ERROR_SELECTOR,\n hash,\n walletAddress,\n signature,\n errorData\n );\n }\n\n function OrderStatusError(\n bytes32 orderHash,\n LibOrder.OrderStatus orderStatus\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_STATUS_ERROR_SELECTOR,\n orderHash,\n orderStatus\n );\n }\n\n function ExchangeInvalidContextError(\n ExchangeContextErrorCodes errorCode,\n bytes32 orderHash,\n address contextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EXCHANGE_INVALID_CONTEXT_ERROR_SELECTOR,\n errorCode,\n orderHash,\n contextAddress\n );\n }\n\n function FillError(\n FillErrorCodes errorCode,\n bytes32 orderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n FILL_ERROR_SELECTOR,\n errorCode,\n orderHash\n );\n }\n\n function OrderEpochError(\n address makerAddress,\n address orderSenderAddress,\n uint256 currentEpoch\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ORDER_EPOCH_ERROR_SELECTOR,\n makerAddress,\n orderSenderAddress,\n currentEpoch\n );\n }\n\n function AssetProxyExistsError(\n bytes4 assetProxyId,\n address assetProxyAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_EXISTS_ERROR_SELECTOR,\n assetProxyId,\n assetProxyAddress\n );\n }\n\n function AssetProxyDispatchError(\n AssetProxyDispatchErrorCodes errorCode,\n bytes32 orderHash,\n bytes memory assetData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_DISPATCH_ERROR_SELECTOR,\n errorCode,\n orderHash,\n assetData\n );\n }\n\n function AssetProxyTransferError(\n bytes32 orderHash,\n bytes memory assetData,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ASSET_PROXY_TRANSFER_ERROR_SELECTOR,\n orderHash,\n assetData,\n errorData\n );\n }\n\n function NegativeSpreadError(\n bytes32 leftOrderHash,\n bytes32 rightOrderHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n NEGATIVE_SPREAD_ERROR_SELECTOR,\n leftOrderHash,\n rightOrderHash\n );\n }\n\n function TransactionError(\n TransactionErrorCodes errorCode,\n bytes32 transactionHash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_ERROR_SELECTOR,\n errorCode,\n transactionHash\n );\n }\n\n function TransactionExecutionError(\n bytes32 transactionHash,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_EXECUTION_ERROR_SELECTOR,\n transactionHash,\n errorData\n );\n }\n\n function TransactionGasPriceError(\n bytes32 transactionHash,\n uint256 actualGasPrice,\n uint256 requiredGasPrice\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_GAS_PRICE_ERROR_SELECTOR,\n transactionHash,\n actualGasPrice,\n requiredGasPrice\n );\n }\n\n function TransactionInvalidContextError(\n bytes32 transactionHash,\n address currentContextAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TRANSACTION_INVALID_CONTEXT_ERROR_SELECTOR,\n transactionHash,\n currentContextAddress\n );\n }\n\n function IncompleteFillError(\n IncompleteFillErrorCode errorCode,\n uint256 expectedAssetFillAmount,\n uint256 actualAssetFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INCOMPLETE_FILL_ERROR_SELECTOR,\n errorCode,\n expectedAssetFillAmount,\n actualAssetFillAmount\n );\n }\n\n function PayProtocolFeeError(\n bytes32 orderHash,\n uint256 protocolFee,\n address makerAddress,\n address takerAddress,\n byt
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment