Commit b3c3a7e4 authored by XFT-dev's avatar XFT-dev
Browse files

added hardhat support

parent 6edd2b9c

Too many changes to show.

To preserve performance only 126 of 126+ files are displayed.
<br/>
<p align="center">
<a href="https://chain.link/" target="_blank" color="#0d2990">
<img src="https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/docs/logo-chainlink-blue.svg" width="225" alt="Chainlink logo">
</a>
</p>
<br/>
[![npm](https://img.shields.io/npm/v/@chainlink/contracts?style=flat-square)](https://www.npmjs.com/package/@chainlink/contracts)
[![GitHub license](https://img.shields.io/github/license/smartcontractkit/chainlink?style=flat-square)](https://github.com/smartcontractkit/chainlink/blob/master/LICENSE)
[![npm downloads](https://img.shields.io/npm/dt/@chainlink/contracts?style=flat-square)](https://npmjs.com/package/@chainlink/contracts)
## ⚠️ Migration Notice
This package stores all of chainlink's smart contracts, previously known as the `evm/` directory. The previous package was called `chainlink`, now it is `@chainlink/contracts`.
## Installation
```sh
# via Yarn
$ yarn add @chainlink/contracts
# via npm
$ npm install @chainlink/contracts --save
```
## Directory Structure
This package makes use of `@chainlink/belt` to output artifacts along with ethers.js and truffle contract abstractions from the smart contracts stored within `src`. The resulting structure of the package when published looks like:
```sh
contracts
├── abi # abi output from src/
│ ├── v0.4
│ ├── v0.5
│ ├── v0.6
│ ├── v0.7
│ └── v0.8
├── ethers # ethers contract abstractions codegenned from abis
│ ├── v0.4
│ ├── v0.5
│ ├── v0.6
│ ├── v0.7
│ └── v0.8
├── src # the contracts themselves, in .sol form
│ ├── v0.4
│ ├── v0.5
│ ├── v0.6
│ ├── v0.7
│ └── v0.8
└── truffle # truffle contract abstractions codegenned from abis
├── v0.4
├── v0.5
├── v0.6
├── v0.7
└── v0.8
```
## Usage
These smart contracts can be imported as a dependency in various ways described below.
### Solidity
The solidity smart contracts themselves can simply be imported via the `src` directory of `@chainlink/contracts`. If you wanted to consume the v0.4.x version of our Oracle smart contract, you could do the following:
```solidity
import "@chainlink/contracts/src/v0.4/Chainlinked.sol";
```
### Artifacts
JSON artifacts generated by [sol-compiler](https://sol-compiler.com/) are available under the `abi` directory. If you wanted to consume the v0.4.x version of our Oracle JSON artifact with Javascript, you could do the following:
```js
const OracleV4Json = require('@chainlink/contracts/abi/v0.4/Oracle.json')
```
### Ethers
This library ships with [ethers.js](https://github.com/ethers-io/ethers.js/) contract abstractions generated by [typechain](https://github.com/ethereum-ts/TypeChain). To use these, make sure you have ethers.js installed as a dependency:
```sh
# via Yarn
$ yarn add ethers@^4.0.44
# via npm
$ npm install ethers@^4.0.44 --save
```
If you wanted to consume the v0.4.x version of our Oracle with JavaScript, you could do the following:
```ts
import { OracleFactory } from '@chainlink/contracts/ethers/v0.4/OracleFactory'
```
This gives a fully typed (if using TypeScript) version of a ethers.js contract factory. See the [ethers.js](https://docs.ethers.io/ethers.js/html/api-contract.html) documentation on usage.
### Truffle
This library ships with [@truffle/contract](https://github.com/trufflesuite/truffle/tree/master/packages/contract#readme) abstractions of each of our smart contracts. To use these, make sure you have @truffle/contract as a dependency.
```sh
# via Yarn
$ yarn add @truffle/contract@^4.1.8
# via npm
$ npm install @truffle/contract@^4.1.8 --save
```
If you wanted to consume the v0.4.x version of our Oracle with JavaScript, you could do the following:
```js
const { Oracle } = require('@chainlink/contracts/truffle/v0.4/Oracle')
```
For usage, see the [@truffle/contract](https://github.com/trufflesuite/truffle/tree/master/packages/contract#readme) documentation.
For ease of use with testing, if the environment variable `NODE_ENV` is set, the imported truffle contract abstraction will automatically set its provider to `web3.currentProvider`, avoiding the need to perform a `setProvider` call before using it during your truffle tests.
```sh
NODE_ENV=true yarn truffle test
```
## Development
Note: Contracts in `src/v0.7/dev` are under active development and not yet stable.
Please use them for testing and development only.
```bash
# Clone Chainlink repository
$ git clone https://github.com/smartcontractkit/chainlink.git
# Continuing via Yarn
$ yarn install
$ yarn setup:contracts
# Continuing via npm
$ npm install
$ npm run setup:contracts
```
## Testing
After completing the above [Development](#Development) commands, run tests with:
```sh
# From this directory, `evm-contracts` via Yarn
$ yarn test
# via npm
$ npm run test
# From project root
$ yarn wsrun @chainlink/contracts test
```
## Contributing
Contributions are welcome! Please refer to
[Chainlink's contributing guidelines](./docs/CONTRIBUTING.md) for detailed
contribution information.
Thank you!
## License
[MIT](https://choosealicense.com/licenses/mit/)
{
"schemaVersion": "2.0.0",
"contractName": "Aggregator",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "authorizedRequesters",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "jobIds",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "minimumResponses",
"outputs": [
{
"name": "",
"type": "uint128"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "oracles",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_recipient",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "transferLINK",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRound",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_clRequestId",
"type": "bytes32"
},
{
"name": "_response",
"type": "int256"
}
],
"name": "chainlinkCallback",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_paymentAmount",
"type": "uint128"
},
{
"name": "_minimumResponses",
"type": "uint128"
},
{
"name": "_oracles",
"type": "address[]"
},
{
"name": "_jobIds",
"type": "bytes32[]"
}
],
"name": "updateRequestDetails",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "destroy",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_roundId",
"type": "uint256"
}
],
"name": "getAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_roundId",
"type": "uint256"
}
],
"name": "getTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "paymentAmount",
"outputs": [
{
"name": "",
"type": "uint128"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "requestRateUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requester",
"type": "address"
},
{
"name": "_allowed",
"type": "bool"
}
],
"name": "setAuthorization",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_paymentAmount",
"type": "uint128"
},
{
"name": "_minimumResponses",
"type": "uint128"
},
{
"name": "_oracles",
"type": "address[]"
},
{
"name": "_jobIds",
"type": "bytes32[]"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "response",
"type": "int256"
},
{
"indexed": true,
"name": "answerId",
"type": "uint256"
},
{
"indexed": true,
"name": "sender",
"type": "address"
}
],
"name": "ResponseReceived",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
}
],
"name": "OwnershipRenounced",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "current",
"type": "int256"
},
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": false,
"name": "timestamp",
"type": "uint256"
}
],
"name": "AnswerUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": true,
"name": "startedBy",
"type": "address"
},
{
"indexed": false,
"name": "startedAt",
"type": "uint256"
}
],
"name": "NewRound",
"type": "event"
}
],
"devdoc": {
"methods": {
"cancelRequest(bytes32,uint256,uint256)": {
"params": {
"_expiration": "is the time when the request expires",
"_payment": "is the amount of LINK paid to the oracle for the request",
"_requestId": "is the identifier for the chainlink request being cancelled"
}
},
"chainlinkCallback(bytes32,int256)": {
"details": "This function can only be called by the oracle that received the request.",
"params": {
"_clRequestId": "The Chainlink request ID associated with the answer",
"_response": "The answer provided by the Chainlink node"
}
},
"getAnswer(uint256)": {
"params": {
"_roundId": "the answer number to retrieve the answer for"
}
},
"getTimestamp(uint256)": {
"params": {
"_roundId": "the answer number to retrieve the updated timestamp for"
}
},
"renounceOwnership()": {
"details": "Allows the current owner to relinquish control of the contract."
},
"requestRateUpdate()": {
"details": "This example does not include request parameters. Reference any documentation associated with the Job IDs used to determine the required parameters per-request."
},
"setAuthorization(address,bool)": {
"params": {
"_allowed": "boolean that determines whether the requester is permissioned or not",
"_requester": "the address whose permissions are being set"
}
},
"transferLINK(address,uint256)": {
"details": "The contract will need to have a LINK balance in order to create requests.",
"params": {
"_amount": "The amount of LINK to send from the contract",
"_recipient": "The address to receive the LINK tokens"
}
},
"transferOwnership(address)": {
"details": "Allows the current owner to transfer control of the contract to a newOwner.",
"params": {
"_newOwner": "The address to transfer ownership to."
}
},
"updateRequestDetails(uint128,uint128,address[],bytes32[])": {
"details": "Arrays are validated to be equal length.",
"params": {
"_jobIds": "An array of Job IDs",
"_minimumResponses": "the minimum number of responses before an answer will be calculated",
"_oracles": "An array of oracle addresses",
"_paymentAmount": "the amount of LINK to be sent to each oracle for each request"
}
}
},
"title": "An example Chainlink contract with aggregation"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405260016004556001600d553480156200001b57600080fd5b50604051620024b6380380620024b683398101604090815281516020830151918301516060840151608085015160068054600160a060020a03191633179055929491929082019101620000778564010000000062000099810204565b6200008e84848484640100000000620000bb810204565b5050505050620003ee565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600654600160a060020a03163314620000d357600080fd5b826001608060020a03168282601c8251111515156200015357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b8151831115620001ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b80518251146200028157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546001608060020a0388811670010000000000000000000000000000000002818b166001608060020a031990931692909217161790558351620002cf90600b906020870190620002ef565b508451620002e590600c90602088019062000341565b5050505050505050565b8280548282559060005260206000209081019282156200032f579160200282015b828111156200032f578251825560209092019160019091019062000310565b506200033d929150620003a7565b5090565b82805482825590600052602060002090810192821562000399579160200282015b82811115620003995782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000362565b506200033d929150620003c7565b620003c491905b808211156200033d5760008155600101620003ae565b90565b620003c491905b808211156200033d578054600160a060020a0319168155600101620003ce565b6120b880620003fe6000396000f3006080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166333bfcdd881146101165780633ea478aa146101365780634162cc881461017857806350d25bcd146101a257806354bcd7ff146101b75780635b69a7d8146101f15780635cd9b90b14610232578063668a0f02146102635780636a9705b414610278578063715018a61461029357806378a66674146102a85780638205bf6a1461035557806383197ef01461036a5780638da5cb5b1461037f578063b5ab58dc14610394578063b633620c146103ac578063c35905c6146103c4578063daa6d556146103d9578063eecea000146103ee578063f2fde38b14610421575b600080fd5b34801561012257600080fd5b5061013460043560243560443561044f565b005b34801561014257600080fd5b5061016473ffffffffffffffffffffffffffffffffffffffff60043516610628565b604080519115158252519081900360200190f35b34801561018457600080fd5b5061019060043561063d565b60408051918252519081900360200190f35b3480156101ae57600080fd5b5061019061065c565b3480156101c357600080fd5b506101cc610672565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101fd57600080fd5b5061020960043561069e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561023e57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff600435166024356106d3565b34801561026f57600080fd5b50610190610845565b34801561028457600080fd5b5061013460043560243561084b565b34801561029f57600080fd5b506101346108ce565b3480156102b457600080fd5b5060408051602060046044358181013583810280860185019096528085526101349583356fffffffffffffffffffffffffffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506109619650505050505050565b34801561036157600080fd5b50610190610bc4565b34801561037657600080fd5b50610134610bd9565b34801561038b57600080fd5b50610209610cd0565b3480156103a057600080fd5b50610190600435610cec565b3480156103b857600080fd5b50610190600435610cfe565b3480156103d057600080fd5b506101cc610d10565b3480156103e557600080fd5b50610134610d28565b3480156103fa57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff600435166024351515610f9b565b34801561042d57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff60043516611015565b336000908152600e602052604081205460ff1680610484575060065473ffffffffffffffffffffffffffffffffffffffff1633145b151561051757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b506000838152600f602052604090205460095481106105bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f74206d6f6469667920616e20696e2d70726f677265737320616e7360448201527f7765720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000848152600f60209081526040808320839055838352601082528220600190810180549182018155835290822001556105f681611045565b61062284847f6a9705b400000000000000000000000000000000000000000000000000000000856110ac565b50505050565b600e6020526000908152604090205460ff1681565b600b80548290811061064b57fe5b600091825260209091200154905081565b6009546000908152601160205260409020545b90565b600a5470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b600c8054829081106106ac57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60065460009073ffffffffffffffffffffffffffffffffffffffff1633146106fa57600080fd5b6107026111e7565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156107a757600080fd5b505af11580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b5051151561084057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4c494e4b207472616e73666572206661696c6564000000000000000000000000604482015290519081900360640190fd5b505050565b60095490565b600061085683611203565b506000828152600f602090815260408083208054908490558084526010835281842060019081018054918201815585529284209092018490555190913391839185917fb51168059c83c860caf5b830c5d2e64c2172c6fb2fe9f25447d9838e18d93b609190a46108c58161131c565b61084081611045565b60065473ffffffffffffffffffffffffffffffffffffffff1633146108f257600080fd5b60065460405173ffffffffffffffffffffffffffffffffffffffff909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60065473ffffffffffffffffffffffffffffffffffffffff16331461098557600080fd5b826fffffffffffffffffffffffffffffffff168282601c825111151515610a0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b8151831115610aa357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b8051825114610b3957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546fffffffffffffffffffffffffffffffff88811670010000000000000000000000000000000002818b167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217161790558351610ba690600b906020870190611ef8565b508451610bba90600c906020880190611f45565b5050505050505050565b60095460009081526012602052604090205490565b60065460009073ffffffffffffffffffffffffffffffffffffffff163314610c0057600080fd5b610c086111e7565b600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051929350610cb59273ffffffffffffffffffffffffffffffffffffffff928316928516916370a082319160248083019260209291908290030181600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50516106d3565b60065473ffffffffffffffffffffffffffffffffffffffff16ff5b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60009081526011602052604090205490565b60009081526012602052604090205490565b600a546fffffffffffffffffffffffffffffffff1681565b610d30611fcb565b336000908152600e60205260408120548190819060ff1680610d69575060065473ffffffffffffffffffffffffffffffffffffffff1633145b1515610dfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b5050600a546fffffffffffffffffffffffffffffffff1660005b600c54811015610ec057610e67600b82815481101515610e3257fe5b906000526020600020015430636a9705b47c010000000000000000000000000000000000000000000000000000000002611578565b9350610ea4600c82815481101515610e7b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685846115a3565b600d546000828152600f60205260409020559250600101610e16565b600a54600d8054600090815260106020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff70010000000000000000000000000000000097889004811691909117909155600c5485548552938290208054948216909602931692909217909355905481514281529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a3600d54610f9290600163ffffffff61190516565b600d5550505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610fbf57600080fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60065473ffffffffffffffffffffffffffffffffffffffff16331461103957600080fd5b61104281611918565b50565b60008181526010602052604090208054600190910154829170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1614156110a8576000828152601060205260408120818155906106226001830182612000565b5050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b1580156111c857600080fd5b505af11580156111dc573d6000803e3d6000fd5b505050505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146112bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b60008181526010602052604081208054600190910154829182918291829187916fffffffffffffffffffffffffffffffff161161156f578680600954111515610bba57600088815260106020526040902060010154965061138487600263ffffffff6119c816565b95506002870615156114965760008881526010602090815260409182902060010180548351818402810184019094528084526113f593928301828280156113ea57602002820191906000526020600020905b8154815260200190600101908083116113d6575b5050505050876119dd565b600089815260106020908152604091829020600101805483518184028101840190945280845293975061147193909183018282801561145357602002820191906000526020600020905b81548152602001906001019080831161143f575b505050505061146c60018961190590919063ffffffff16565b6119dd565b92506002611485858563ffffffff611bd116565b81151561148e57fe5b05945061150a565b60008881526010602090815260409182902060010180548351818402810184019094528084526115079392830182828015611453576020028201919060005260206000209081548152602001906001019080831161143f57505050505061146c60018961190590919063ffffffff16565b94505b6007859055600988905542600881905560008981526012602090815260408083208490556011825291829020889055815192835290518a9288927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f92918290030190a3505b50505050505050565b611580611fcb565b611588611fcb565b61159a8186868663ffffffff611c9516565b95945050505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061165757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161161a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea0858461174887611cf7565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117e85781810151838201526020016117d0565b50505050905090810190601f1680156118155780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d602081101561186057600080fd5b505115156118f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b8181018281101561191257fe5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116151561193a57600080fd5b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081838115156119d557fe5b049392505050565b600060606000806060806000806000808b98508a97508851965086604051908082528060200260200182016040528015611a21578160200160208202803883390190505b50955086604051908082528060200260200182016040528015611a4e578160200160208202803883390190505b5094505b88611a6488600263ffffffff6119c816565b81518110611a6e57fe5b9060200190602002015191506000935060009250600090505b86811015611b4757818982815181101515611a9e57fe5b906020019060200201511215611ae9578881815181101515611abc57fe5b906020019060200201518685815181101515611ad457fe5b60209081029091010152600190930192611b3f565b818982815181101515611af857fe5b906020019060200201511315611b3f578881815181101515611b1657fe5b906020019060200201518584815181101515611b2e57fe5b602090810290910101526001909201915b600101611a87565b838811611b6557839650611b5b8987611ea9565b9099509550611bbd565b611b75878463ffffffff611eac16565b881115611bb557611b9c611b8f888563ffffffff611eac16565b899063ffffffff611eac16565b9750829650611bab8986611ea9565b9099509450611bbd565b819950611bc2565b611a52565b50505050505050505092915050565b6000828201818312801590611be65750838112155b80611bfb5750600083128015611bfb57508381125b1515611c8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b9392505050565b611c9d611fcb565b611cad8560800151610100611ebe565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611dec578181015183820152602001611dd4565b50505050905090810190601f168015611e195780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b91565b600082821115611eb857fe5b50900390565b611ec661201e565b6020820615611edb5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b828054828255906000526020600020908101928215611f35579160200282015b82811115611f355782518255602090920191600190910190611f18565b50611f41929150612036565b5090565b828054828255906000526020600020908101928215611fbf579160200282015b82811115611fbf57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611f65565b50611f41929150612050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ffb61201e565b905290565b50805460008255906000526020600020908101906110429190612036565b60408051808201909152606081526000602082015290565b61066f91905b80821115611f41576000815560010161203c565b61066f91905b80821115611f415780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001016120565600a165627a7a72305820b8d0ff52827a6c6d3ffa2f0c18fceef9c38e46dca6450be014545386d69d70d60029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x1 PUSH1 0xD SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x24B6 CODESIZE SUB DUP1 PUSH3 0x24B6 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x80 DUP6 ADD MLOAD PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE SWAP3 SWAP5 SWAP2 SWAP3 SWAP1 DUP3 ADD SWAP2 ADD PUSH3 0x77 DUP6 PUSH5 0x100000000 PUSH3 0x99 DUP2 MUL DIV JUMP JUMPDEST PUSH3 0x8E DUP5 DUP5 DUP5 DUP5 PUSH5 0x100000000 PUSH3 0xBB DUP2 MUL DIV JUMP JUMPDEST POP POP POP POP POP PUSH3 0x3EE JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x80 PUSH1 0x2 EXP SUB AND DUP3 DUP3 PUSH1 0x1C DUP3 MLOAD GT ISZERO ISZERO ISZERO PUSH3 0x153 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F742068617665206D6F7265207468616E203435206F7261636C6573 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP4 GT ISZERO PUSH3 0x1EA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742068617665206174206C65617374206173206D616E79206F7261636C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x657320617320726573706F6E7365730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP3 MLOAD EQ PUSH3 0x281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D75737420686176652065786163746C79206173206D616E79206F7261636C65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x73206173206A6F62204944730000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH1 0x1 PUSH1 0x80 PUSH1 0x2 EXP SUB DUP9 DUP2 AND PUSH17 0x100000000000000000000000000000000 MUL DUP2 DUP12 AND PUSH1 0x1 PUSH1 0x80 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE DUP4 MLOAD PUSH3 0x2CF SWAP1 PUSH1 0xB SWAP1 PUSH1 0x20 DUP8 ADD SWAP1 PUSH3 0x2EF JUMP JUMPDEST POP DUP5 MLOAD PUSH3 0x2E5 SWAP1 PUSH1 0xC SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x341 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x32F JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x32F JUMPI DUP3 MLOAD DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x310 JUMP JUMPDEST POP PUSH3 0x33D SWAP3 SWAP2 POP PUSH3 0x3A7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x399 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x399 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x362 JUMP JUMPDEST POP PUSH3 0x33D SWAP3 SWAP2 POP PUSH3 0x3C7 JUMP JUMPDEST PUSH3 0x3C4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x33D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH3 0x3C4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x33D JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3CE JUMP JUMPDEST PUSH2 0x20B8 DUP1 PUSH3 0x3FE PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x111 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x33BFCDD8 DUP2 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x3EA478AA EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0x50D25BCD EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x54BCD7FF EQ PUSH2 0x1B7 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x5CD9B90B EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0x668A0F02 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x6A9705B4 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x293 JUMPI DUP1 PUSH4 0x78A66674 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x8205BF6A EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x83197EF0 EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0xB5AB58DC EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0xB633620C EQ PUSH2 0x3AC JUMPI DUP1 PUSH4 0xC35905C6 EQ PUSH2 0x3C4 JUMPI DUP1 PUSH4 0xDAA6D556 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0xEECEA000 EQ PUSH2 0x3EE JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x421 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x44F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x628 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x184 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0x63D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0x65C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CC PUSH2 0x672 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x209 PUSH1 0x4 CALLDATALOAD PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x6D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0x845 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x284 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x84B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0x8CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD DUP4 DUP2 MUL DUP1 DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP1 DUP6 MSTORE PUSH2 0x134 SWAP6 DUP4 CALLDATALOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP7 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP7 CALLDATASIZE SWAP7 SWAP6 PUSH1 0x64 SWAP6 SWAP3 SWAP5 SWAP4 ADD SWAP3 DUP3 SWAP2 DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD DUP8 CALLDATALOAD DUP10 ADD DUP1 CALLDATALOAD PUSH1 0x20 DUP2 DUP2 MUL DUP5 DUP2 ADD DUP3 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 SWAP11 SWAP10 DUP10 ADD SWAP9 SWAP3 SWAP8 POP SWAP1 DUP3 ADD SWAP6 POP SWAP4 POP DUP4 SWAP3 POP DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x961 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x361 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0xBC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0xBD9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x209 PUSH2 0xCD0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0xCEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0xCFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CC PUSH2 0xD10 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0xD28 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xF9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x1015 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH2 0x484 JUMPI POP PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST ISZERO ISZERO PUSH2 0x517 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206164647265737320666F72206372 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656174696E672072657175657374730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x9 SLOAD DUP2 LT PUSH2 0x5BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F74206D6F6469667920616E20696E2D70726F677265737320616E73 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7765720000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP4 SWAP1 SSTORE DUP4 DUP4 MSTORE PUSH1 0x10 DUP3 MSTORE DUP3 KECCAK256 PUSH1 0x1 SWAP1 DUP2 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE SWAP1 DUP3 KECCAK256 ADD SSTORE PUSH2 0x5F6 DUP2 PUSH2 0x1045 JUMP JUMPDEST PUSH2 0x622 DUP5 DUP5 PUSH32 0x6A9705B400000000000000000000000000000000000000000000000000000000 DUP6 PUSH2 0x10AC JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0xB DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x64B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x11 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6AC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x702 PUSH2 0x11E7 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x840 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C494E4B207472616E73666572206661696C6564000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x856 DUP4 PUSH2 0x1203 JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 DUP5 SWAP1 SSTORE DUP1 DUP5 MSTORE PUSH1 0x10 DUP4 MSTORE DUP2 DUP5 KECCAK256 PUSH1 0x1 SWAP1 DUP2 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP6 MSTORE SWAP3 DUP5 KECCAK256 SWAP1 SWAP3 ADD DUP5 SWAP1 SSTORE MLOAD SWAP1 SWAP2 CALLER SWAP2 DUP4 SWAP2 DUP6 SWAP2 PUSH32 0xB51168059C83C860CAF5B830C5D2E64C2172C6FB2FE9F25447D9838E18D93B60 SWAP2 SWAP1 LOG4 PUSH2 0x8C5 DUP2 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x840 DUP2 PUSH2 0x1045 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP3 PUSH1 0x1C DUP3 MLOAD GT ISZERO ISZERO ISZERO PUSH2 0xA0D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F742068617665206D6F7265207468616E203435206F7261636C6573 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP4 GT ISZERO PUSH2 0xAA3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742068617665206174206C65617374206173206D616E79206F7261636C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x657320617320726573706F6E7365730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP3 MLOAD EQ PUSH2 0xB39 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D75737420686176652065786163746C79206173206D616E79206F7261636C65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x73206173206A6F62204944730000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH17 0x100000000000000000000000000000000 MUL DUP2 DUP12 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE DUP4 MLOAD PUSH2 0xBA6 SWAP1 PUSH1 0xB SWAP1 PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x1EF8 JUMP JUMPDEST POP DUP5 MLOAD PUSH2 0xBBA SWAP1 PUSH1 0xC SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH2 0x1F45 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC08 PUSH2 0x11E7 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH2 0xCB5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND SWAP3 DUP6 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC98 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xCAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x6D3 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SELFDESTRUCT JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x11 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0xD30 PUSH2 0x1FCB JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0xFF AND DUP1 PUSH2 0xD69 JUMPI POP PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST ISZERO ISZERO PUSH2 0xDFC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206164647265737320666F72206372 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656174696E672072657175657374730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0xA SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 JUMPDEST PUSH1 0xC SLOAD DUP2 LT ISZERO PUSH2 0xEC0 JUMPI PUSH2 0xE67 PUSH1 0xB DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE32 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD ADDRESS PUSH4 0x6A9705B4 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x1578 JUMP JUMPDEST SWAP4 POP PUSH2 0xEA4 PUSH1 0xC DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE7B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP5 PUSH2 0x15A3 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE SWAP3 POP PUSH1 0x1 ADD PUSH2 0xE16 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH17 0x100000000000000000000000000000000 SWAP8 DUP9 SWAP1 DIV DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0xC SLOAD DUP6 SLOAD DUP6 MSTORE SWAP4 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP5 DUP3 AND SWAP1 SWAP7 MUL SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 MLOAD TIMESTAMP DUP2 MSTORE SWAP2 MLOAD CALLER SWAP4 SWAP2 SWAP3 PUSH32 0x109FC6F55CF40689F02FBAAD7AF7FE7BBAC8A3D2186600AFC7D3E10CAC60271 SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG3 PUSH1 0xD SLOAD PUSH2 0xF92 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1905 AND JUMP JUMPDEST PUSH1 0xD SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1039 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1042 DUP2 PUSH2 0x1918 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 SWAP2 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x10A8 JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 DUP2 SSTORE SWAP1 PUSH2 0x622 PUSH1 0x1 DUP4 ADD DUP3 PUSH2 0x2000 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11DC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x12BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP8 SWAP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT PUSH2 0x156F JUMPI DUP7 DUP1 PUSH1 0x9 SLOAD GT ISZERO ISZERO PUSH2 0xBBA JUMPI PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD SWAP7 POP PUSH2 0x1384 DUP8 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x19C8 AND JUMP JUMPDEST SWAP6 POP PUSH1 0x2 DUP8 MOD ISZERO ISZERO PUSH2 0x1496 JUMPI PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH2 0x13F5 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x13EA JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x13D6 JUMPI JUMPDEST POP POP POP POP POP DUP8 PUSH2 0x19DD JUMP JUMPDEST PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE SWAP4 SWAP8 POP PUSH2 0x1471 SWAP4 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1453 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x143F JUMPI JUMPDEST POP POP POP POP POP PUSH2 0x146C PUSH1 0x1 DUP10 PUSH2 0x1905 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x19DD JUMP JUMPDEST SWAP3 POP PUSH1 0x2 PUSH2 0x1485 DUP6 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST DUP2 ISZERO ISZERO PUSH2 0x148E JUMPI INVALID JUMPDEST SDIV SWAP5 POP PUSH2 0x150A JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH2 0x1507 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1453 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x143F JUMPI POP POP POP POP POP PUSH2 0x146C PUSH1 0x1 DUP10 PUSH2 0x1905 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x7 DUP6 SWAP1 SSTORE PUSH1 0x9 DUP9 SWAP1 SSTORE TIMESTAMP PUSH1 0x8 DUP2 SWAP1 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE PUSH1 0x11 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE DUP2 MLOAD SWAP3 DUP4 MSTORE SWAP1 MLOAD DUP11 SWAP3 DUP9 SWAP3 PUSH32 0x559884FD3A460DB3073B7FC896CC77986F16E378210DED43186175BF646FC5F SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1580 PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x1588 PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x159A DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C95 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1657 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x161A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1748 DUP8 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17E8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17D0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1815 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x184A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x18F5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1912 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x193A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x19D5 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP12 SWAP9 POP DUP11 SWAP8 POP DUP9 MLOAD SWAP7 POP DUP7 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A21 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP DUP7 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A4E JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP5 POP JUMPDEST DUP9 PUSH2 0x1A64 DUP9 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x19C8 AND JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x1A6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP2 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1B47 JUMPI DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A9E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SLT ISZERO PUSH2 0x1AE9 JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1ABC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD4 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1B3F JUMP JUMPDEST DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SGT ISZERO PUSH2 0x1B3F JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B16 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B2E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST PUSH1 0x1 ADD PUSH2 0x1A87 JUMP JUMPDEST DUP4 DUP9 GT PUSH2 0x1B65 JUMPI DUP4 SWAP7 POP PUSH2 0x1B5B DUP10 DUP8 PUSH2 0x1EA9 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP6 POP PUSH2 0x1BBD JUMP JUMPDEST PUSH2 0x1B75 DUP8 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST DUP9 GT ISZERO PUSH2 0x1BB5 JUMPI PUSH2 0x1B9C PUSH2 0x1B8F DUP9 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST DUP10 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST SWAP8 POP DUP3 SWAP7 POP PUSH2 0x1BAB DUP10 DUP7 PUSH2 0x1EA9 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP5 POP PUSH2 0x1BBD JUMP JUMPDEST DUP2 SWAP10 POP PUSH2 0x1BC2 JUMP JUMPDEST PUSH2 0x1A52 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x1BE6 JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x1BFB JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x1BFB JUMPI POP DUP4 DUP2 SLT JUMPDEST ISZERO ISZERO PUSH2 0x1C8E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1C9D PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x1CAD DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1EBE JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DEC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DD4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1E19 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1EB8 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1EC6 PUSH2 0x201E JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1EDB JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1F35 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1F35 JUMPI DUP3 MLOAD DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1F18 JUMP JUMPDEST POP PUSH2 0x1F41 SWAP3 SWAP2 POP PUSH2 0x2036 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1FBF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1FBF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1F65 JUMP JUMPDEST POP PUSH2 0x1F41 SWAP3 SWAP2 POP PUSH2 0x2050 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1FFB PUSH2 0x201E JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1042 SWAP2 SWAP1 PUSH2 0x2036 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x66F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1F41 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x203C JUMP JUMPDEST PUSH2 0x66F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1F41 JUMPI DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2056 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb8 0xd0 SELFDESTRUCT MSTORE DUP3 PUSH27 0x6C6D3FFA2F0C18FCEEF9C38E46DCA6450BE014545386D69D70D600 0x29 ",
"sourceMap": "453:12760:0:-;;;1121:1:2;1094:28;;1080:1:0;1048:33;;2021:273;8:9:-1;5:2;;;30:1;27;20:12;5:2;2021:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:5:38;:18;;-1:-1:-1;;;;;;567:18:38;575:10;567:18;;;2021:273:0;;;;;;;;;2185:24;2021:273;2185:17;;;;:24;:::i;:::-;2215:74;2236:14;2252:17;2271:8;2281:7;2215:20;;;;:74;:::i;:::-;2021:273;;;;;453:12760;;4751:94:2;4808:4;:32;;-1:-1:-1;;;;;;4808:32:2;-1:-1:-1;;;;;4808:32:2;;;;;;;;;;4751:94::o;4410:367:0:-;719:5:38;;-1:-1:-1;;;;;719:5:38;705:10;:19;697:28;;;;;;4608:17:0;-1:-1:-1;;;;;12540:414:0;4627:8;4637:7;1396:2;12672:8;:15;:35;;12664:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12758:15;;:36;-1:-1:-1;12758:36:0;12750:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12879:14;;12860:15;;:33;12852:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4654:13;:30;;-1:-1:-1;;;;;4690:36:0;;;;;4654:30;;;-1:-1:-1;;;;;;4654:30:0;;;;;;;4690:36;;;;4732:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;4754:18:0;;;;:7;;:18;;;;;:::i;:::-;;731:1:38;;;4410:367:0;;;;:::o;453:12760::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;453:12760:0;;;-1:-1:-1;453:12760:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;453:12760:0;-1:-1:-1;;;;;453:12760:0;;;;;;;;;;;-1:-1:-1;453:12760:0;;;;;;;-1:-1:-1;453:12760:0;;;-1:-1:-1;453:12760:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;453:12760:0;;;;;;;;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166333bfcdd881146101165780633ea478aa146101365780634162cc881461017857806350d25bcd146101a257806354bcd7ff146101b75780635b69a7d8146101f15780635cd9b90b14610232578063668a0f02146102635780636a9705b414610278578063715018a61461029357806378a66674146102a85780638205bf6a1461035557806383197ef01461036a5780638da5cb5b1461037f578063b5ab58dc14610394578063b633620c146103ac578063c35905c6146103c4578063daa6d556146103d9578063eecea000146103ee578063f2fde38b14610421575b600080fd5b34801561012257600080fd5b5061013460043560243560443561044f565b005b34801561014257600080fd5b5061016473ffffffffffffffffffffffffffffffffffffffff60043516610628565b604080519115158252519081900360200190f35b34801561018457600080fd5b5061019060043561063d565b60408051918252519081900360200190f35b3480156101ae57600080fd5b5061019061065c565b3480156101c357600080fd5b506101cc610672565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101fd57600080fd5b5061020960043561069e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561023e57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff600435166024356106d3565b34801561026f57600080fd5b50610190610845565b34801561028457600080fd5b5061013460043560243561084b565b34801561029f57600080fd5b506101346108ce565b3480156102b457600080fd5b5060408051602060046044358181013583810280860185019096528085526101349583356fffffffffffffffffffffffffffffffff9081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506109619650505050505050565b34801561036157600080fd5b50610190610bc4565b34801561037657600080fd5b50610134610bd9565b34801561038b57600080fd5b50610209610cd0565b3480156103a057600080fd5b50610190600435610cec565b3480156103b857600080fd5b50610190600435610cfe565b3480156103d057600080fd5b506101cc610d10565b3480156103e557600080fd5b50610134610d28565b3480156103fa57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff600435166024351515610f9b565b34801561042d57600080fd5b5061013473ffffffffffffffffffffffffffffffffffffffff60043516611015565b336000908152600e602052604081205460ff1680610484575060065473ffffffffffffffffffffffffffffffffffffffff1633145b151561051757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b506000838152600f602052604090205460095481106105bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f43616e6e6f74206d6f6469667920616e20696e2d70726f677265737320616e7360448201527f7765720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000848152600f60209081526040808320839055838352601082528220600190810180549182018155835290822001556105f681611045565b61062284847f6a9705b400000000000000000000000000000000000000000000000000000000856110ac565b50505050565b600e6020526000908152604090205460ff1681565b600b80548290811061064b57fe5b600091825260209091200154905081565b6009546000908152601160205260409020545b90565b600a5470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b600c8054829081106106ac57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60065460009073ffffffffffffffffffffffffffffffffffffffff1633146106fa57600080fd5b6107026111e7565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156107a757600080fd5b505af11580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b5051151561084057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4c494e4b207472616e73666572206661696c6564000000000000000000000000604482015290519081900360640190fd5b505050565b60095490565b600061085683611203565b506000828152600f602090815260408083208054908490558084526010835281842060019081018054918201815585529284209092018490555190913391839185917fb51168059c83c860caf5b830c5d2e64c2172c6fb2fe9f25447d9838e18d93b609190a46108c58161131c565b61084081611045565b60065473ffffffffffffffffffffffffffffffffffffffff1633146108f257600080fd5b60065460405173ffffffffffffffffffffffffffffffffffffffff909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60065473ffffffffffffffffffffffffffffffffffffffff16331461098557600080fd5b826fffffffffffffffffffffffffffffffff168282601c825111151515610a0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b8151831115610aa357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b8051825114610b3957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546fffffffffffffffffffffffffffffffff88811670010000000000000000000000000000000002818b167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217161790558351610ba690600b906020870190611ef8565b508451610bba90600c906020880190611f45565b5050505050505050565b60095460009081526012602052604090205490565b60065460009073ffffffffffffffffffffffffffffffffffffffff163314610c0057600080fd5b610c086111e7565b600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051929350610cb59273ffffffffffffffffffffffffffffffffffffffff928316928516916370a082319160248083019260209291908290030181600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50516106d3565b60065473ffffffffffffffffffffffffffffffffffffffff16ff5b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60009081526011602052604090205490565b60009081526012602052604090205490565b600a546fffffffffffffffffffffffffffffffff1681565b610d30611fcb565b336000908152600e60205260408120548190819060ff1680610d69575060065473ffffffffffffffffffffffffffffffffffffffff1633145b1515610dfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b5050600a546fffffffffffffffffffffffffffffffff1660005b600c54811015610ec057610e67600b82815481101515610e3257fe5b906000526020600020015430636a9705b47c010000000000000000000000000000000000000000000000000000000002611578565b9350610ea4600c82815481101515610e7b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685846115a3565b600d546000828152600f60205260409020559250600101610e16565b600a54600d8054600090815260106020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff70010000000000000000000000000000000097889004811691909117909155600c5485548552938290208054948216909602931692909217909355905481514281529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a3600d54610f9290600163ffffffff61190516565b600d5550505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610fbf57600080fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60065473ffffffffffffffffffffffffffffffffffffffff16331461103957600080fd5b61104281611918565b50565b60008181526010602052604090208054600190910154829170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1614156110a8576000828152601060205260408120818155906106226001830182612000565b5050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b1580156111c857600080fd5b505af11580156111dc573d6000803e3d6000fd5b505050505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146112bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b60008181526010602052604081208054600190910154829182918291829187916fffffffffffffffffffffffffffffffff161161156f578680600954111515610bba57600088815260106020526040902060010154965061138487600263ffffffff6119c816565b95506002870615156114965760008881526010602090815260409182902060010180548351818402810184019094528084526113f593928301828280156113ea57602002820191906000526020600020905b8154815260200190600101908083116113d6575b5050505050876119dd565b600089815260106020908152604091829020600101805483518184028101840190945280845293975061147193909183018282801561145357602002820191906000526020600020905b81548152602001906001019080831161143f575b505050505061146c60018961190590919063ffffffff16565b6119dd565b92506002611485858563ffffffff611bd116565b81151561148e57fe5b05945061150a565b60008881526010602090815260409182902060010180548351818402810184019094528084526115079392830182828015611453576020028201919060005260206000209081548152602001906001019080831161143f57505050505061146c60018961190590919063ffffffff16565b94505b6007859055600988905542600881905560008981526012602090815260408083208490556011825291829020889055815192835290518a9288927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f92918290030190a3505b50505050505050565b611580611fcb565b611588611fcb565b61159a8186868663ffffffff611c9516565b95945050505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061165757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161161a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea0858461174887611cf7565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117e85781810151838201526020016117d0565b50505050905090810190601f1680156118155780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d602081101561186057600080fd5b505115156118f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b8181018281101561191257fe5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8116151561193a57600080fd5b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081838115156119d557fe5b049392505050565b600060606000806060806000806000808b98508a97508851965086604051908082528060200260200182016040528015611a21578160200160208202803883390190505b50955086604051908082528060200260200182016040528015611a4e578160200160208202803883390190505b5094505b88611a6488600263ffffffff6119c816565b81518110611a6e57fe5b9060200190602002015191506000935060009250600090505b86811015611b4757818982815181101515611a9e57fe5b906020019060200201511215611ae9578881815181101515611abc57fe5b906020019060200201518685815181101515611ad457fe5b60209081029091010152600190930192611b3f565b818982815181101515611af857fe5b906020019060200201511315611b3f578881815181101515611b1657fe5b906020019060200201518584815181101515611b2e57fe5b602090810290910101526001909201915b600101611a87565b838811611b6557839650611b5b8987611ea9565b9099509550611bbd565b611b75878463ffffffff611eac16565b881115611bb557611b9c611b8f888563ffffffff611eac16565b899063ffffffff611eac16565b9750829650611bab8986611ea9565b9099509450611bbd565b819950611bc2565b611a52565b50505050505050505092915050565b6000828201818312801590611be65750838112155b80611bfb5750600083128015611bfb57508381125b1515611c8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b9392505050565b611c9d611fcb565b611cad8560800151610100611ebe565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611dec578181015183820152602001611dd4565b50505050905090810190601f168015611e195780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b91565b600082821115611eb857fe5b50900390565b611ec661201e565b6020820615611edb5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b828054828255906000526020600020908101928215611f35579160200282015b82811115611f355782518255602090920191600190910190611f18565b50611f41929150612036565b5090565b828054828255906000526020600020908101928215611fbf579160200282015b82811115611fbf57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611f65565b50611f41929150612050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ffb61201e565b905290565b50805460008255906000526020600020908101906110429190612036565b60408051808201909152606081526000602082015290565b61066f91905b80821115611f41576000815560010161203c565b61066f91905b80821115611f415780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001016120565600a165627a7a72305820b8d0ff52827a6c6d3ffa2f0c18fceef9c38e46dca6450be014545386d69d70d60029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x111 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x33BFCDD8 DUP2 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x3EA478AA EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0x50D25BCD EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x54BCD7FF EQ PUSH2 0x1B7 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x5CD9B90B EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0x668A0F02 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x6A9705B4 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x293 JUMPI DUP1 PUSH4 0x78A66674 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x8205BF6A EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x83197EF0 EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0xB5AB58DC EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0xB633620C EQ PUSH2 0x3AC JUMPI DUP1 PUSH4 0xC35905C6 EQ PUSH2 0x3C4 JUMPI DUP1 PUSH4 0xDAA6D556 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0xEECEA000 EQ PUSH2 0x3EE JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x421 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x44F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x164 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x628 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x184 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0x63D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0x65C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CC PUSH2 0x672 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x209 PUSH1 0x4 CALLDATALOAD PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x6D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0x845 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x284 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x84B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0x8CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD DUP4 DUP2 MUL DUP1 DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP1 DUP6 MSTORE PUSH2 0x134 SWAP6 DUP4 CALLDATALOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP7 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP7 CALLDATASIZE SWAP7 SWAP6 PUSH1 0x64 SWAP6 SWAP3 SWAP5 SWAP4 ADD SWAP3 DUP3 SWAP2 DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD DUP8 CALLDATALOAD DUP10 ADD DUP1 CALLDATALOAD PUSH1 0x20 DUP2 DUP2 MUL DUP5 DUP2 ADD DUP3 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 SWAP11 SWAP10 DUP10 ADD SWAP9 SWAP3 SWAP8 POP SWAP1 DUP3 ADD SWAP6 POP SWAP4 POP DUP4 SWAP3 POP DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x961 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x361 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH2 0xBC4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0xBD9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x209 PUSH2 0xCD0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0xCEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x190 PUSH1 0x4 CALLDATALOAD PUSH2 0xCFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CC PUSH2 0xD10 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH2 0xD28 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xF9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x134 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x1015 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH2 0x484 JUMPI POP PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST ISZERO ISZERO PUSH2 0x517 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206164647265737320666F72206372 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656174696E672072657175657374730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x9 SLOAD DUP2 LT PUSH2 0x5BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F74206D6F6469667920616E20696E2D70726F677265737320616E73 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7765720000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP4 SWAP1 SSTORE DUP4 DUP4 MSTORE PUSH1 0x10 DUP3 MSTORE DUP3 KECCAK256 PUSH1 0x1 SWAP1 DUP2 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE SWAP1 DUP3 KECCAK256 ADD SSTORE PUSH2 0x5F6 DUP2 PUSH2 0x1045 JUMP JUMPDEST PUSH2 0x622 DUP5 DUP5 PUSH32 0x6A9705B400000000000000000000000000000000000000000000000000000000 DUP6 PUSH2 0x10AC JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0xB DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x64B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x11 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6AC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x702 PUSH2 0x11E7 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x840 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C494E4B207472616E73666572206661696C6564000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x856 DUP4 PUSH2 0x1203 JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 DUP5 SWAP1 SSTORE DUP1 DUP5 MSTORE PUSH1 0x10 DUP4 MSTORE DUP2 DUP5 KECCAK256 PUSH1 0x1 SWAP1 DUP2 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP6 MSTORE SWAP3 DUP5 KECCAK256 SWAP1 SWAP3 ADD DUP5 SWAP1 SSTORE MLOAD SWAP1 SWAP2 CALLER SWAP2 DUP4 SWAP2 DUP6 SWAP2 PUSH32 0xB51168059C83C860CAF5B830C5D2E64C2172C6FB2FE9F25447D9838E18D93B60 SWAP2 SWAP1 LOG4 PUSH2 0x8C5 DUP2 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x840 DUP2 PUSH2 0x1045 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 DUP3 PUSH1 0x1C DUP3 MLOAD GT ISZERO ISZERO ISZERO PUSH2 0xA0D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x63616E6E6F742068617665206D6F7265207468616E203435206F7261636C6573 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP4 GT ISZERO PUSH2 0xAA3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D7573742068617665206174206C65617374206173206D616E79206F7261636C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x657320617320726573706F6E7365730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP3 MLOAD EQ PUSH2 0xB39 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6D75737420686176652065786163746C79206173206D616E79206F7261636C65 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x73206173206A6F62204944730000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH17 0x100000000000000000000000000000000 MUL DUP2 DUP12 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE DUP4 MLOAD PUSH2 0xBA6 SWAP1 PUSH1 0xB SWAP1 PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x1EF8 JUMP JUMPDEST POP DUP5 MLOAD PUSH2 0xBBA SWAP1 PUSH1 0xC SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH2 0x1F45 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC08 PUSH2 0x11E7 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH2 0xCB5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND SWAP3 DUP6 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC98 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xCAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x6D3 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SELFDESTRUCT JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x11 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0xD30 PUSH2 0x1FCB JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0xFF AND DUP1 PUSH2 0xD69 JUMPI POP PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ JUMPDEST ISZERO ISZERO PUSH2 0xDFC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206164647265737320666F72206372 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x656174696E672072657175657374730000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0xA SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 JUMPDEST PUSH1 0xC SLOAD DUP2 LT ISZERO PUSH2 0xEC0 JUMPI PUSH2 0xE67 PUSH1 0xB DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE32 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD ADDRESS PUSH4 0x6A9705B4 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x1578 JUMP JUMPDEST SWAP4 POP PUSH2 0xEA4 PUSH1 0xC DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE7B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 DUP5 PUSH2 0x15A3 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE SWAP3 POP PUSH1 0x1 ADD PUSH2 0xE16 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH17 0x100000000000000000000000000000000 SWAP8 DUP9 SWAP1 DIV DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0xC SLOAD DUP6 SLOAD DUP6 MSTORE SWAP4 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP5 DUP3 AND SWAP1 SWAP7 MUL SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 MLOAD TIMESTAMP DUP2 MSTORE SWAP2 MLOAD CALLER SWAP4 SWAP2 SWAP3 PUSH32 0x109FC6F55CF40689F02FBAAD7AF7FE7BBAC8A3D2186600AFC7D3E10CAC60271 SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG3 PUSH1 0xD SLOAD PUSH2 0xF92 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1905 AND JUMP JUMPDEST PUSH1 0xD SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1039 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1042 DUP2 PUSH2 0x1918 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 SWAP2 PUSH17 0x100000000000000000000000000000000 SWAP1 DIV PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x10A8 JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 DUP2 SSTORE SWAP1 PUSH2 0x622 PUSH1 0x1 DUP4 ADD DUP3 PUSH2 0x2000 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x11C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11DC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x12BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP8 SWAP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT PUSH2 0x156F JUMPI DUP7 DUP1 PUSH1 0x9 SLOAD GT ISZERO ISZERO PUSH2 0xBBA JUMPI PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD SWAP7 POP PUSH2 0x1384 DUP8 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x19C8 AND JUMP JUMPDEST SWAP6 POP PUSH1 0x2 DUP8 MOD ISZERO ISZERO PUSH2 0x1496 JUMPI PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH2 0x13F5 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x13EA JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x13D6 JUMPI JUMPDEST POP POP POP POP POP DUP8 PUSH2 0x19DD JUMP JUMPDEST PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE SWAP4 SWAP8 POP PUSH2 0x1471 SWAP4 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1453 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x143F JUMPI JUMPDEST POP POP POP POP POP PUSH2 0x146C PUSH1 0x1 DUP10 PUSH2 0x1905 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x19DD JUMP JUMPDEST SWAP3 POP PUSH1 0x2 PUSH2 0x1485 DUP6 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1BD1 AND JUMP JUMPDEST DUP2 ISZERO ISZERO PUSH2 0x148E JUMPI INVALID JUMPDEST SDIV SWAP5 POP PUSH2 0x150A JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH2 0x1507 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1453 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x143F JUMPI POP POP POP POP POP PUSH2 0x146C PUSH1 0x1 DUP10 PUSH2 0x1905 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x7 DUP6 SWAP1 SSTORE PUSH1 0x9 DUP9 SWAP1 SSTORE TIMESTAMP PUSH1 0x8 DUP2 SWAP1 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x12 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE PUSH1 0x11 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE DUP2 MLOAD SWAP3 DUP4 MSTORE SWAP1 MLOAD DUP11 SWAP3 DUP9 SWAP3 PUSH32 0x559884FD3A460DB3073B7FC896CC77986F16E378210DED43186175BF646FC5F SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1580 PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x1588 PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x159A DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C95 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1657 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x161A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1748 DUP8 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17E8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17D0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1815 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x184A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x18F5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1912 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x193A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x19D5 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP12 SWAP9 POP DUP11 SWAP8 POP DUP9 MLOAD SWAP7 POP DUP7 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A21 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP6 POP DUP7 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A4E JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP5 POP JUMPDEST DUP9 PUSH2 0x1A64 DUP9 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x19C8 AND JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x1A6E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP2 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1B47 JUMPI DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A9E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SLT ISZERO PUSH2 0x1AE9 JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1ABC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD4 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1B3F JUMP JUMPDEST DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SGT ISZERO PUSH2 0x1B3F JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B16 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B2E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST PUSH1 0x1 ADD PUSH2 0x1A87 JUMP JUMPDEST DUP4 DUP9 GT PUSH2 0x1B65 JUMPI DUP4 SWAP7 POP PUSH2 0x1B5B DUP10 DUP8 PUSH2 0x1EA9 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP6 POP PUSH2 0x1BBD JUMP JUMPDEST PUSH2 0x1B75 DUP8 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST DUP9 GT ISZERO PUSH2 0x1BB5 JUMPI PUSH2 0x1B9C PUSH2 0x1B8F DUP9 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST DUP10 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1EAC AND JUMP JUMPDEST SWAP8 POP DUP3 SWAP7 POP PUSH2 0x1BAB DUP10 DUP7 PUSH2 0x1EA9 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP5 POP PUSH2 0x1BBD JUMP JUMPDEST DUP2 SWAP10 POP PUSH2 0x1BC2 JUMP JUMPDEST PUSH2 0x1A52 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x1BE6 JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x1BFB JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x1BFB JUMPI POP DUP4 DUP2 SLT JUMPDEST ISZERO ISZERO PUSH2 0x1C8E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1C9D PUSH2 0x1FCB JUMP JUMPDEST PUSH2 0x1CAD DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1EBE JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DEC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1DD4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1E19 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1EB8 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1EC6 PUSH2 0x201E JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1EDB JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1F35 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1F35 JUMPI DUP3 MLOAD DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1F18 JUMP JUMPDEST POP PUSH2 0x1F41 SWAP3 SWAP2 POP PUSH2 0x2036 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x1FBF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1FBF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1F65 JUMP JUMPDEST POP PUSH2 0x1F41 SWAP3 SWAP2 POP PUSH2 0x2050 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1FFB PUSH2 0x201E JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1042 SWAP2 SWAP1 PUSH2 0x2036 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x66F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1F41 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x203C JUMP JUMPDEST PUSH2 0x66F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1F41 JUMPI DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2056 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb8 0xd0 SELFDESTRUCT MSTORE DUP3 PUSH27 0x6C6D3FFA2F0C18FCEEF9C38E46DCA6450BE014545386D69D70D600 0x29 ",
"sourceMap": "453:12760:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6228:523;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6228:523:0;;;;;;;;;;;1085:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1085:52:0;;;;;;;;;;;;;;;;;;;;;;;;;992:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;992:23:0;;;;;;;;;;;;;;;;;;;;;8505:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8505:124:0;;;;957:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;957:31:0;;;;;;;;;;;;;;;;;;;;;;;1019:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1019:24:0;;;;;;;;;;;;;;;;;;;;;;;;5112:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5112:251:0;;;;;;;;;9450:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9450:108:0;;;;3558:399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3558:399:0;;;;;;;1001:111:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1001:111:38;;;;4410:367:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4410:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4410:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4410:367:0;;;;-1:-1:-1;4410:367:0;-1:-1:-1;4410:367:0;;-1:-1:-1;4410:367:0;;;;;;;;;-1:-1:-1;4410:367:0;;-1:-1:-1;4410:367:0;;-1:-1:-1;;;;;;;4410:367:0;8698:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8698:131:0;;;;6907:221;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6907:221:0;;;;238:20:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;238:20:38;;;;8948:124:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8948:124:0;;;;;9230:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9230:131:0;;;;;925:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;925:28:0;;;;2565:694;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2565:694:0;;;;5646:146;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5646:146:0;;;;;;;;;;;1274:103:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1274:103:38;;;;;;;6228:523:0;13112:10;6379:16;13091:32;;;:20;:32;;;;;;;;;:55;;-1:-1:-1;13141:5:0;;;;13127:10;:19;13091:55;13083:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6398:26:0;;;;:14;:26;;;;;;6449:21;;6438:32;;6430:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6524:26;;;;:14;:26;;;;;;;;6517:33;;;6556:17;;;:7;:17;;;;:27;;;;27:10:-1;;23:18;;;45:23;;6556:35:0;;;;;;;6597:22;6564:8;6597:12;:22::i;:::-;6626:120;6656:10;6674:8;6690:31;6729:11;6626:22;:120::i;:::-;6228:523;;;;:::o;1085:52::-;;;;;;;;;;;;;;;:::o;992:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;992:23:0;:::o;8505:124::-;8602:21;;8564:6;8587:37;;;:14;:37;;;;;;8505:124;;:::o;957:31::-;;;;;;;;;:::o;1019:24::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1019:24:0;:::o;5112:251::-;719:5:38;;5206:28:0;;719:5:38;;705:10;:19;697:28;;;;;;5256:23:0;:21;:23::i;:::-;5206:74;;5294:9;:18;;;5313:10;5325:7;5294:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5294:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5294:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5294:39:0;5286:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5112:251;;;:::o;9450:108::-;9532:21;;9450:108;:::o;3558:399::-;3692:16;3646:39;3672:12;3646:25;:39::i;:::-;-1:-1:-1;3711:28:0;;;;:14;:28;;;;;;;;;;3745:35;;;;3787:17;;;:7;:17;;;;;-1:-1:-1;3787:27:0;;;27:10:-1;;23:18;;;45:23;;3787:43:0;;;;;;;;;;;3841:49;3711:28;;3879:10;;3711:28;;3820:9;;3841:49;;3711:28;3841:49;3896:28;3915:8;3896:18;:28::i;:::-;3930:22;3943:8;3930:12;:22::i;1001:111:38:-;719:5;;;;705:10;:19;697:28;;;;;;1077:5;;1058:25;;1077:5;;;;;1058:25;;1077:5;;1058:25;1089:5;:18;;;;;;1001:111::o;4410:367:0:-;719:5:38;;;;705:10;:19;697:28;;;;;;4608:17:0;12540:414;;4627:8;4637:7;1396:2;12672:8;:15;:35;;12664:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12758:15;;:36;-1:-1:-1;12758:36:0;12750:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12879:14;;12860:15;;:33;12852:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4654:13;:30;;;4690:36;;;;;4654:30;;;;;;;;;;;4690:36;;;;4732:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;4754:18:0;;;;:7;;:18;;;;;:::i;:::-;;731:1:38;;;4410:367:0;;;;:::o;8698:131::-;8802:21;;8760:7;8784:40;;;:17;:40;;;;;;8698:131;:::o;6907:221::-;719:5:38;;6963:28:0;;719:5:38;;705:10;:19;697:28;;;;;;7013:23:0;:21;:23::i;:::-;7056:5;;7063:34;;;;;;7091:4;7063:34;;;;;;6963:74;;-1:-1:-1;7043:55:0;;7056:5;;;;;7063:19;;;;;:34;;;;;;;;;;;;;;7056:5;7063:19;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;7063:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7063:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7063:34:0;7043:12;:55::i;:::-;7117:5;;;;7104:19;238:20:38;;;;;;:::o;8948:124:0:-;9020:6;9043:24;;;:14;:24;;;;;;;8948:124::o;9230:131::-;9305:7;9329:27;;;:17;:27;;;;;;;9230:131::o;925:28::-;;;;;;:::o;2565:694::-;2647:32;;:::i;:::-;13112:10;2685:17;13091:32;;;:20;:32;;;;;;2685:17;;;;13091:32;;;:55;;-1:-1:-1;13141:5:0;;;;13127:10;:19;13091:55;13083:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2732:13:0;;;;;2752:265;2773:7;:14;2769:18;;2752:265;;;2812:71;2834:6;2841:1;2834:9;;;;;;;;;;;;;;;;;;2845:4;2851:31;;;2812:21;:71::i;:::-;2802:81;;2903:58;2926:7;2934:1;2926:10;;;;;;;;;;;;;;;;;;;;;;2938:7;2947:13;2903:22;:58::i;:::-;2997:13;;2969:25;;;;:14;:25;;;;;:41;2891:70;-1:-1:-1;2789:3:0;;2752:265;;;3064:16;;3030:13;;;3022:22;;;;3064:16;3022:22;;;;;;;;:58;;;;3064:16;;;;;;;;3022:58;;;;;;;3132:7;:14;3094:13;;3086:22;;;;;;:61;;;;;;;;;;;;;;;;;3168:13;;3159:52;;3195:15;3159:52;;;;3183:10;;3168:13;;3159:52;;;;;;;;;3234:13;;:20;;3252:1;3234:20;:17;:20;:::i;:::-;3218:13;:36;-1:-1:-1;;;;2565:694:0:o;5646:146::-;719:5:38;;;;705:10;:19;697:28;;;;;;5744:32:0;;;;;;;;;:20;:32;;;;;:43;;;;;;;;;;;;;5646:146::o;1274:103:38:-;719:5;;;;705:10;:19;697:28;;;;;;1343:29;1362:9;1343:18;:29::i;:::-;1274:103;:::o;11222:133:0:-;12030:18;;;;:7;:18;;;;;:31;;11991:28;;;;:35;12030:18;;:31;;;;;11991:70;11987:92;;;11332:18;;;;:7;:18;;;;;11325:25;;;11332:18;11325:25;;;;11332:18;11325:25;:::i;11987:92::-;11222:133;;:::o;3997:417:2:-;4151:35;4215:27;;;:15;:27;;;;;;;;4249:34;;;;;;4294:30;;4215:27;;;;;4231:10;;4294:30;;4151:35;4294:30;4330:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4330:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4330:79:2;;;;3997:417;;;;;:::o;5210:110::-;5310:4;;;;5210:110;:::o;8239:164::-;8660:27;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;8239:164;;:::o;7416:1022:0:-;7563:22;11678:18;;;:7;:18;;;;;:35;;;11639:28;;;:35;7563:22;;;;;;;;7506:9;;11678:35;;-1:-1:-1;11635:96:0;;7544:9;12353;12328:21;;:34;;12324:56;;;7588:18;;;;:7;:18;;;;;:28;;:35;;-1:-1:-1;7651:21:0;7588:35;7670:1;7651:21;:18;:21;:::i;:::-;7629:43;-1:-1:-1;7729:1:0;7712:14;:18;:23;7708:460;;;7774:18;;;;:7;:18;;;;;;;;;:28;;7762:54;;;;;;;;;;;;;;;;;;;;;;7774:28;7762:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7804:11;7762;:54::i;:::-;7853:18;;;;:7;:18;;;;;;;;;:28;;7841:61;;;;;;;;;;;;;;;;;7745:71;;-1:-1:-1;7841:61:0;;7853:28;;7841:61;;7853:28;7841:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7883:18;7899:1;7883:11;:15;;:18;;;;:::i;:::-;7841:11;:61::i;:::-;7824:78;-1:-1:-1;7981:1:0;7958:20;:7;7824:78;7958:20;:11;:20;:::i;:::-;:24;;;;;;;;7938:44;;7708:460;;;8084:18;;;;:7;:18;;;;;;;;;:28;;8072:61;;;;;;;;;;;;;;;;;;;;;;8084:28;8072:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8114:18;8130:1;8114:11;:15;;:18;;;;:::i;8072:61::-;8052:81;;7708:460;8173:18;:38;;;8217:21;:33;;;8280:3;8256:21;:27;;;-1:-1:-1;8289:28:0;;;:17;:28;;;;;;;;:34;;;8329:14;:25;;;;;;:45;;;8385:48;;;;;;;8241:9;;8194:17;;8385:48;;;;;;;;;11723:1;11635:96;7416:1022;;;;;;;:::o;1725:295:2:-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;3001:476::-;3125:17;3191:4;3197:8;;3174:32;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3174:32:2;;;3164:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;;;;;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;;;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3330:60:2;3322:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;:::o;1247:128:40:-;1328:7;;;1348;;;;1341:15;;;;1247:128;;;;:::o;1512:171:38:-;1582:23;;;;;1574:32;;;;;;1638:5;;1617:38;;;;;;;1638:5;;1617:38;;1638:5;;1617:38;1661:5;:17;;;;;;;;;;;;;;;1512:171::o;674:283:40:-;734:7;950:2;945;:7;;;;;;;;;674:283;-1:-1:-1;;;674:283:40:o;9834:893:0:-;9921:6;9937:17;9965:9;9985:12;10014:18;10059;10104:13;10123;10142:12;10160:9;9957:2;9937:22;;9977:2;9965:14;;10000:1;:8;9985:23;;10048:4;10035:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10035:18:0;;10014:39;;10093:4;10080:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10080:18:0;;10059:39;;10176:547;10205:1;10207:11;:4;10216:1;10207:11;:8;:11;:::i;:::-;10205:14;;;;;;;;;;;;;;;;10197:22;;10235:1;10227:9;;10252:1;10244:9;;10270:1;10266:5;;10261:203;10277:4;10273:1;:8;10261:203;;;10309:5;10302:1;10304;10302:4;;;;;;;;;;;;;;;;;;:12;10298:158;;;10340:1;10342;10340:4;;;;;;;;;;;;;;;;;;10328:2;10331:5;10328:9;;;;;;;;;;;;;;;;;;:16;10356:7;;;;;10298:158;;;10391:5;10384:1;10386;10384:4;;;;;;;;;;;;;;;;;;:12;10380:76;;;10422:1;10424;10422:4;;;;;;;;;;;;;;;;;;10410:2;10413:5;10410:9;;;;;;;;;;;;;;;;;;:16;10438:7;;;;;10380:76;10283:3;;10261:203;;;10475:10;;;10471:246;;10504:5;10497:12;;10529:11;10534:1;10537:2;10529:4;:11::i;:::-;10519:21;;-1:-1:-1;10519:21:0;-1:-1:-1;10471:246:0;;;10564:15;:4;10573:5;10564:15;:8;:15;:::i;:::-;10559:1;:21;10555:162;;;10596:22;10602:15;:4;10611:5;10602:15;:8;:15;:::i;:::-;10596:1;;:22;:5;:22;:::i;:::-;10592:26;;10635:5;10628:12;;10660:11;10665:1;10668:2;10660:4;:11::i;:::-;10650:21;;-1:-1:-1;10650:21:0;-1:-1:-1;10555:162:0;;;10703:5;10696:12;;;;10555:162;10176:547;;;9834:893;;;;;;;;;;;;;:::o;1508:196:41:-;1564:6;1589:5;;;1609:6;;;;;;:16;;;1624:1;1619;:6;;1609:16;1608:38;;;;1635:1;1631;:5;:14;;;;;1644:1;1640;:5;1631:14;1600:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1698:1;1508:196;-1:-1:-1;;;1508:196:41:o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;1228:39;;:20;;;:39;1273:43;;:23;;;:43;1209:13;972:366::o;7481:527:2:-;7878:7;;7893:20;;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7628:6;7598:405;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;7628:6;7598:405;;;;;;;;;;;;;;7569:5;;7628:29;;:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7990:12;;7598:405;;;;;;;;;;7628:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7598:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7598:405:2;;;22:32:-1;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;7598:405:2;;;;179:29:-1;;;;160:49;;;-1:-1;7598:405:2;;-1:-1:-1;;;;;;;;;;7481:527:2;;;:::o;10917:149:0:-;11054:2;10917:149::o;1069:116:40:-;1129:7;1151:8;;;;1144:16;;;;-1:-1:-1;1173:7:40;;;1069:116::o;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;453:12760:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;453:12760:0;;;-1:-1:-1;453:12760:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;453:12760:0;;;;;;;-1:-1:-1;453:12760:0;;;-1:-1:-1;453:12760:0;:::i;:::-;;;;;;;;;-1:-1:-1;453:12760:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;453:12760:0;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
},
"methodIdentifiers": {
"authorizedRequesters(address)": "3ea478aa",
"cancelRequest(bytes32,uint256,uint256)": "33bfcdd8",
"chainlinkCallback(bytes32,int256)": "6a9705b4",
"destroy()": "83197ef0",
"getAnswer(uint256)": "b5ab58dc",
"getTimestamp(uint256)": "b633620c",
"jobIds(uint256)": "4162cc88",
"latestAnswer()": "50d25bcd",
"latestRound()": "668a0f02",
"latestTimestamp()": "8205bf6a",
"minimumResponses()": "54bcd7ff",
"oracles(uint256)": "5b69a7d8",
"owner()": "8da5cb5b",
"paymentAmount()": "c35905c6",
"renounceOwnership()": "715018a6",
"requestRateUpdate()": "daa6d556",
"setAuthorization(address,bool)": "eecea000",
"transferLINK(address,uint256)": "5cd9b90b",
"transferOwnership(address)": "f2fde38b",
"updateRequestDetails(uint128,uint128,address[],bytes32[])": "78a66674"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"authorizedRequesters\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"jobIds\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minimumResponses\",\"outputs\":[{\"name\":\"\",\"type\":\"uint128\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"oracles\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferLINK\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"latestRound\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_clRequestId\",\"type\":\"bytes32\"},{\"name\":\"_response\",\"type\":\"int256\"}],\"name\":\"chainlinkCallback\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_paymentAmount\",\"type\":\"uint128\"},{\"name\":\"_minimumResponses\",\"type\":\"uint128\"},{\"name\":\"_oracles\",\"type\":\"address[]\"},{\"name\":\"_jobIds\",\"type\":\"bytes32[]\"}],\"name\":\"updateRequestDetails\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"latestTimestamp\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"destroy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getAnswer\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paymentAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint128\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"requestRateUpdate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requester\",\"type\":\"address\"},{\"name\":\"_allowed\",\"type\":\"bool\"}],\"name\":\"setAuthorization\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_paymentAmount\",\"type\":\"uint128\"},{\"name\":\"_minimumResponses\",\"type\":\"uint128\"},{\"name\":\"_oracles\",\"type\":\"address[]\"},{\"name\":\"_jobIds\",\"type\":\"bytes32[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"response\",\"type\":\"int256\"},{\"indexed\":true,\"name\":\"answerId\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ResponseReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"}],\"name\":\"OwnershipRenounced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"current\",\"type\":\"int256\"},{\"indexed\":true,\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"AnswerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"startedBy\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"startedAt\",\"type\":\"uint256\"}],\"name\":\"NewRound\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"cancelRequest(bytes32,uint256,uint256)\":{\"params\":{\"_expiration\":\"is the time when the request expires\",\"_payment\":\"is the amount of LINK paid to the oracle for the request\",\"_requestId\":\"is the identifier for the chainlink request being cancelled\"}},\"chainlinkCallback(bytes32,int256)\":{\"details\":\"This function can only be called by the oracle that received the request.\",\"params\":{\"_clRequestId\":\"The Chainlink request ID associated with the answer\",\"_response\":\"The answer provided by the Chainlink node\"}},\"getAnswer(uint256)\":{\"params\":{\"_roundId\":\"the answer number to retrieve the answer for\"}},\"getTimestamp(uint256)\":{\"params\":{\"_roundId\":\"the answer number to retrieve the updated timestamp for\"}},\"renounceOwnership()\":{\"details\":\"Allows the current owner to relinquish control of the contract.\"},\"requestRateUpdate()\":{\"details\":\"This example does not include request parameters. Reference any documentation associated with the Job IDs used to determine the required parameters per-request.\"},\"setAuthorization(address,bool)\":{\"params\":{\"_allowed\":\"boolean that determines whether the requester is permissioned or not\",\"_requester\":\"the address whose permissions are being set\"}},\"transferLINK(address,uint256)\":{\"details\":\"The contract will need to have a LINK balance in order to create requests.\",\"params\":{\"_amount\":\"The amount of LINK to send from the contract\",\"_recipient\":\"The address to receive the LINK tokens\"}},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"_newOwner\":\"The address to transfer ownership to.\"}},\"updateRequestDetails(uint128,uint128,address[],bytes32[])\":{\"details\":\"Arrays are validated to be equal length.\",\"params\":{\"_jobIds\":\"An array of Job IDs\",\"_minimumResponses\":\"the minimum number of responses before an answer will be calculated\",\"_oracles\":\"An array of oracle addresses\",\"_paymentAmount\":\"the amount of LINK to be sent to each oracle for each request\"}}},\"title\":\"An example Chainlink contract with aggregation\"},\"userdoc\":{\"methods\":{\"cancelRequest(bytes32,uint256,uint256)\":{\"notice\":\"Cancels an outstanding Chainlink request. The oracle contract requires the request ID and additional metadata to validate the cancellation. Only old answers can be cancelled.\"},\"chainlinkCallback(bytes32,int256)\":{\"notice\":\"Receives the answer from the Chainlink node.\"},\"destroy()\":{\"notice\":\"Called by the owner to kill the contract. This transfers all LINK balance and ETH balance (if there is any) to the owner.\"},\"getAnswer(uint256)\":{\"notice\":\"get past rounds answers\"},\"getTimestamp(uint256)\":{\"notice\":\"get block timestamp when an answer was last updated\"},\"latestAnswer()\":{\"notice\":\"get the most recently reported answer\"},\"latestRound()\":{\"notice\":\"get the latest completed round where the answer was updated\"},\"latestTimestamp()\":{\"notice\":\"get the last updated at block timestamp\"},\"renounceOwnership()\":{\"notice\":\"Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore.\"},\"requestRateUpdate()\":{\"notice\":\"Creates a Chainlink request for each oracle in the oracles array.\"},\"setAuthorization(address,bool)\":{\"notice\":\"Called by the owner to permission other addresses to generate new requests to oracles.\"},\"transferLINK(address,uint256)\":{\"notice\":\"Allows the owner of the contract to withdraw any LINK balance available on the contract.\"},\"updateRequestDetails(uint128,uint128,address[],bytes32[])\":{\"notice\":\"Updates the arrays of oracles and jobIds with new values, overwriting the old values.\"}}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Aggregator.sol\":\"Aggregator\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Aggregator.sol\":{\"keccak256\":\"0x6894b629d1a332fcf970e765f36a4c6561eb0b6cc7d53973712860ed92ccc684\",\"urls\":[\"bzzr://1669ba7f4f8af6071b89d3a15842b1bc903ab5ceaaa628a4d9f4413aaed1b9aa\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/AggregatorInterface.sol\":{\"keccak256\":\"0xb21fa756e241d3fbfe7546158a7e1bb4a98f261744751c4e9dfe5f474ea46338\",\"urls\":[\"bzzr://acb860d28a70616f38d2d7d72ce5c82a2221734deefe67ace468112e92679bf7\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Ownable.sol\":{\"keccak256\":\"0x84c7090c27cf3657b73d9e26b6b316975fa0bd233b8169f254de0c3b3acfaefc\",\"urls\":[\"bzzr://b983355647976c1daa5de581a1b6a41be9c5adc17cce257b8679649db78f8a11\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074\",\"urls\":[\"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SignedSafeMath.sol\":{\"keccak256\":\"0xc4d1131c258388162b46ce765e2ceeb68122dbf586447c47f99101d65d5f75af\",\"urls\":[\"bzzr://305e6947adba7e8d4eb6b8e4bc989d874780507df4a2c1fb5cc29d139f2f4efa\"]}},\"version\":1}",
"userdoc": {
"methods": {
"cancelRequest(bytes32,uint256,uint256)": {
"notice": "Cancels an outstanding Chainlink request. The oracle contract requires the request ID and additional metadata to validate the cancellation. Only old answers can be cancelled."
},
"chainlinkCallback(bytes32,int256)": {
"notice": "Receives the answer from the Chainlink node."
},
"destroy()": {
"notice": "Called by the owner to kill the contract. This transfers all LINK balance and ETH balance (if there is any) to the owner."
},
"getAnswer(uint256)": {
"notice": "get past rounds answers"
},
"getTimestamp(uint256)": {
"notice": "get block timestamp when an answer was last updated"
},
"latestAnswer()": {
"notice": "get the most recently reported answer"
},
"latestRound()": {
"notice": "get the latest completed round where the answer was updated"
},
"latestTimestamp()": {
"notice": "get the last updated at block timestamp"
},
"renounceOwnership()": {
"notice": "Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore."
},
"requestRateUpdate()": {
"notice": "Creates a Chainlink request for each oracle in the oracles array."
},
"setAuthorization(address,bool)": {
"notice": "Called by the owner to permission other addresses to generate new requests to oracles."
},
"transferLINK(address,uint256)": {
"notice": "Allows the owner of the contract to withdraw any LINK balance available on the contract."
},
"updateRequestDetails(uint128,uint128,address[],bytes32[])": {
"notice": "Updates the arrays of oracles and jobIds with new values, overwriting the old values."
}
}
}
},
"sources": {
"Aggregator.sol": {
"id": 0
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
},
"interfaces/AggregatorInterface.sol": {
"id": 9
},
"vendor/SignedSafeMath.sol": {
"id": 41
},
"vendor/Ownable.sol": {
"id": 38
},
"vendor/SafeMathChainlink.sol": {
"id": 40
}
},
"sourceCodes": {
"Aggregator.sol": "pragma solidity 0.4.24;\n\nimport \"./ChainlinkClient.sol\";\nimport \"./interfaces/AggregatorInterface.sol\";\nimport \"./vendor/SignedSafeMath.sol\";\nimport \"./vendor/Ownable.sol\";\nimport \"./vendor/SafeMathChainlink.sol\";\n\n/**\n * @title An example Chainlink contract with aggregation\n * @notice Requesters can use this contract as a framework for creating\n * requests to multiple Chainlink nodes and running aggregation\n * as the contract receives answers.\n */\ncontract Aggregator is AggregatorInterface, ChainlinkClient, Ownable {\n using SafeMathChainlink for uint256;\n using SignedSafeMath for int256;\n\n struct Answer {\n uint128 minimumResponses;\n uint128 maxResponses;\n int256[] responses;\n }\n\n event ResponseReceived(int256 indexed response, uint256 indexed answerId, address indexed sender);\n\n int256 private currentAnswerValue;\n uint256 private updatedTimestampValue;\n uint256 private latestCompletedAnswer;\n uint128 public paymentAmount;\n uint128 public minimumResponses;\n bytes32[] public jobIds;\n address[] public oracles;\n\n uint256 private answerCounter = 1;\n mapping(address => bool) public authorizedRequesters;\n mapping(bytes32 => uint256) private requestAnswers;\n mapping(uint256 => Answer) private answers;\n mapping(uint256 => int256) private currentAnswers;\n mapping(uint256 => uint256) private updatedTimestamps;\n\n uint256 constant private MAX_ORACLE_COUNT = 28;\n\n /**\n * @notice Deploy with the address of the LINK token and arrays of matching\n * length containing the addresses of the oracles and their corresponding\n * Job IDs.\n * @dev Sets the LinkToken address for the network, addresses of the oracles,\n * and jobIds in storage.\n * @param _link The address of the LINK token\n * @param _paymentAmount the amount of LINK to be sent to each oracle for each request\n * @param _minimumResponses the minimum number of responses\n * before an answer will be calculated\n * @param _oracles An array of oracle addresses\n * @param _jobIds An array of Job IDs\n */\n constructor(\n address _link,\n uint128 _paymentAmount,\n uint128 _minimumResponses,\n address[] _oracles,\n bytes32[] _jobIds\n ) public Ownable() {\n setChainlinkToken(_link);\n updateRequestDetails(_paymentAmount, _minimumResponses, _oracles, _jobIds);\n }\n\n /**\n * @notice Creates a Chainlink request for each oracle in the oracles array.\n * @dev This example does not include request parameters. Reference any documentation\n * associated with the Job IDs used to determine the required parameters per-request.\n */\n function requestRateUpdate()\n external\n ensureAuthorizedRequester()\n {\n Chainlink.Request memory request;\n bytes32 requestId;\n uint256 oraclePayment = paymentAmount;\n\n for (uint i = 0; i < oracles.length; i++) {\n request = buildChainlinkRequest(jobIds[i], this, this.chainlinkCallback.selector);\n requestId = sendChainlinkRequestTo(oracles[i], request, oraclePayment);\n requestAnswers[requestId] = answerCounter;\n }\n answers[answerCounter].minimumResponses = minimumResponses;\n answers[answerCounter].maxResponses = uint128(oracles.length);\n\n emit NewRound(answerCounter, msg.sender, block.timestamp);\n\n answerCounter = answerCounter.add(1);\n }\n\n /**\n * @notice Receives the answer from the Chainlink node.\n * @dev This function can only be called by the oracle that received the request.\n * @param _clRequestId The Chainlink request ID associated with the answer\n * @param _response The answer provided by the Chainlink node\n */\n function chainlinkCallback(bytes32 _clRequestId, int256 _response)\n external\n {\n validateChainlinkCallback(_clRequestId);\n\n uint256 answerId = requestAnswers[_clRequestId];\n delete requestAnswers[_clRequestId];\n\n answers[answerId].responses.push(_response);\n emit ResponseReceived(_response, answerId, msg.sender);\n updateLatestAnswer(answerId);\n deleteAnswer(answerId);\n }\n\n /**\n * @notice Updates the arrays of oracles and jobIds with new values,\n * overwriting the old values.\n * @dev Arrays are validated to be equal length.\n * @param _paymentAmount the amount of LINK to be sent to each oracle for each request\n * @param _minimumResponses the minimum number of responses\n * before an answer will be calculated\n * @param _oracles An array of oracle addresses\n * @param _jobIds An array of Job IDs\n */\n function updateRequestDetails(\n uint128 _paymentAmount,\n uint128 _minimumResponses,\n address[] _oracles,\n bytes32[] _jobIds\n )\n public\n onlyOwner()\n validateAnswerRequirements(_minimumResponses, _oracles, _jobIds)\n {\n paymentAmount = _paymentAmount;\n minimumResponses = _minimumResponses;\n jobIds = _jobIds;\n oracles = _oracles;\n }\n\n /**\n * @notice Allows the owner of the contract to withdraw any LINK balance\n * available on the contract.\n * @dev The contract will need to have a LINK balance in order to create requests.\n * @param _recipient The address to receive the LINK tokens\n * @param _amount The amount of LINK to send from the contract\n */\n function transferLINK(address _recipient, uint256 _amount)\n public\n onlyOwner()\n {\n LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress());\n require(linkToken.transfer(_recipient, _amount), \"LINK transfer failed\");\n }\n\n /**\n * @notice Called by the owner to permission other addresses to generate new\n * requests to oracles.\n * @param _requester the address whose permissions are being set\n * @param _allowed boolean that determines whether the requester is\n * permissioned or not\n */\n function setAuthorization(address _requester, bool _allowed)\n external\n onlyOwner()\n {\n authorizedRequesters[_requester] = _allowed;\n }\n\n /**\n * @notice Cancels an outstanding Chainlink request.\n * The oracle contract requires the request ID and additional metadata to\n * validate the cancellation. Only old answers can be cancelled.\n * @param _requestId is the identifier for the chainlink request being cancelled\n * @param _payment is the amount of LINK paid to the oracle for the request\n * @param _expiration is the time when the request expires\n */\n function cancelRequest(\n bytes32 _requestId,\n uint256 _payment,\n uint256 _expiration\n )\n external\n ensureAuthorizedRequester()\n {\n uint256 answerId = requestAnswers[_requestId];\n require(answerId < latestCompletedAnswer, \"Cannot modify an in-progress answer\");\n\n delete requestAnswers[_requestId];\n answers[answerId].responses.push(0);\n deleteAnswer(answerId);\n\n cancelChainlinkRequest(\n _requestId,\n _payment,\n this.chainlinkCallback.selector,\n _expiration\n );\n }\n\n /**\n * @notice Called by the owner to kill the contract. This transfers all LINK\n * balance and ETH balance (if there is any) to the owner.\n */\n function destroy()\n external\n onlyOwner()\n {\n LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress());\n transferLINK(owner, linkToken.balanceOf(address(this)));\n selfdestruct(owner);\n }\n\n /**\n * @dev Performs aggregation of the answers received from the Chainlink nodes.\n * Assumes that at least half the oracles are honest and so can't contol the\n * middle of the ordered responses.\n * @param _answerId The answer ID associated with the group of requests\n */\n function updateLatestAnswer(uint256 _answerId)\n private\n ensureMinResponsesReceived(_answerId)\n ensureOnlyLatestAnswer(_answerId)\n {\n uint256 responseLength = answers[_answerId].responses.length;\n uint256 middleIndex = responseLength.div(2);\n int256 currentAnswerTemp;\n if (responseLength % 2 == 0) {\n int256 median1 = quickselect(answers[_answerId].responses, middleIndex);\n int256 median2 = quickselect(answers[_answerId].responses, middleIndex.add(1)); // quickselect is 1 indexed\n currentAnswerTemp = median1.add(median2) / 2; // signed integers are not supported by SafeMath\n } else {\n currentAnswerTemp = quickselect(answers[_answerId].responses, middleIndex.add(1)); // quickselect is 1 indexed\n }\n currentAnswerValue = currentAnswerTemp;\n latestCompletedAnswer = _answerId;\n updatedTimestampValue = now;\n updatedTimestamps[_answerId] = now;\n currentAnswers[_answerId] = currentAnswerTemp;\n emit AnswerUpdated(currentAnswerTemp, _answerId, now);\n }\n\n /**\n * @notice get the most recently reported answer\n */\n function latestAnswer()\n external\n view\n returns (int256)\n {\n return currentAnswers[latestCompletedAnswer];\n }\n\n /**\n * @notice get the last updated at block timestamp\n */\n function latestTimestamp()\n external\n view\n returns (uint256)\n {\n return updatedTimestamps[latestCompletedAnswer];\n }\n\n /**\n * @notice get past rounds answers\n * @param _roundId the answer number to retrieve the answer for\n */\n function getAnswer(uint256 _roundId)\n external\n view\n returns (int256)\n {\n return currentAnswers[_roundId];\n }\n\n /**\n * @notice get block timestamp when an answer was last updated\n * @param _roundId the answer number to retrieve the updated timestamp for\n */\n function getTimestamp(uint256 _roundId)\n external\n view\n returns (uint256)\n {\n return updatedTimestamps[_roundId];\n }\n\n /**\n * @notice get the latest completed round where the answer was updated\n */\n function latestRound()\n external\n view\n returns (uint256)\n {\n return latestCompletedAnswer;\n }\n\n /**\n * @dev Returns the kth value of the ordered array\n * See: http://www.cs.yale.edu/homes/aspnes/pinewiki/QuickSelect.html\n * @param _a The list of elements to pull from\n * @param _k The index, 1 based, of the elements you want to pull from when ordered\n */\n function quickselect(int256[] memory _a, uint256 _k)\n private\n pure\n returns (int256)\n {\n int256[] memory a = _a;\n uint256 k = _k;\n uint256 aLen = a.length;\n int256[] memory a1 = new int256[](aLen);\n int256[] memory a2 = new int256[](aLen);\n uint256 a1Len;\n uint256 a2Len;\n int256 pivot;\n uint256 i;\n\n while (true) {\n pivot = a[aLen.div(2)];\n a1Len = 0;\n a2Len = 0;\n for (i = 0; i < aLen; i++) {\n if (a[i] < pivot) {\n a1[a1Len] = a[i];\n a1Len++;\n } else if (a[i] > pivot) {\n a2[a2Len] = a[i];\n a2Len++;\n }\n }\n if (k <= a1Len) {\n aLen = a1Len;\n (a, a1) = swap(a, a1);\n } else if (k > (aLen.sub(a2Len))) {\n k = k.sub(aLen.sub(a2Len));\n aLen = a2Len;\n (a, a2) = swap(a, a2);\n } else {\n return pivot;\n }\n }\n }\n\n /**\n * @dev Swaps the pointers to two uint256 arrays in memory\n * @param _a The pointer to the first in memory array\n * @param _b The pointer to the second in memory array\n */\n function swap(int256[] memory _a, int256[] memory _b)\n private\n pure\n returns(int256[] memory, int256[] memory)\n {\n return (_b, _a);\n }\n\n /**\n * @dev Cleans up the answer record if all responses have been received.\n * @param _answerId The identifier of the answer to be deleted\n */\n function deleteAnswer(uint256 _answerId)\n private\n ensureAllResponsesReceived(_answerId)\n {\n delete answers[_answerId];\n }\n\n /**\n * @dev Prevents taking an action if the minimum number of responses has not\n * been received for an answer.\n * @param _answerId The the identifier of the answer that keeps track of the responses.\n */\n modifier ensureMinResponsesReceived(uint256 _answerId) {\n if (answers[_answerId].responses.length >= answers[_answerId].minimumResponses) {\n _;\n }\n }\n\n /**\n * @dev Prevents taking an action if not all responses are received for an answer.\n * @param _answerId The the identifier of the answer that keeps track of the responses.\n */\n modifier ensureAllResponsesReceived(uint256 _answerId) {\n if (answers[_answerId].responses.length == answers[_answerId].maxResponses) {\n _;\n }\n }\n\n /**\n * @dev Prevents taking an action if a newer answer has been recorded.\n * @param _answerId The current answer's identifier.\n * Answer IDs are in ascending order.\n */\n modifier ensureOnlyLatestAnswer(uint256 _answerId) {\n if (latestCompletedAnswer <= _answerId) {\n _;\n }\n }\n\n /**\n * @dev Ensures corresponding number of oracles and jobs.\n * @param _oracles The list of oracles.\n * @param _jobIds The list of jobs.\n */\n modifier validateAnswerRequirements(\n uint256 _minimumResponses,\n address[] _oracles,\n bytes32[] _jobIds\n ) {\n require(_oracles.length <= MAX_ORACLE_COUNT, \"cannot have more than 45 oracles\");\n require(_oracles.length >= _minimumResponses, \"must have at least as many oracles as responses\");\n require(_oracles.length == _jobIds.length, \"must have exactly as many oracles as job IDs\");\n _;\n }\n\n /**\n * @dev Reverts if `msg.sender` is not authorized to make requests.\n */\n modifier ensureAuthorizedRequester() {\n require(authorizedRequesters[msg.sender] || msg.sender == owner, \"Not an authorized address for creating requests\");\n _;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n",
"interfaces/AggregatorInterface.sol": "pragma solidity >=0.4.24;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n",
"vendor/SignedSafeMath.sol": "pragma solidity 0.4.24;\n\n/**\n * @title SignedSafeMath\n * @dev Signed math operations with safety checks that revert on error.\n */\nlibrary SignedSafeMath {\n int256 constant private _INT256_MIN = -2**255;\n\n /**\n * @dev Multiplies two signed integers, reverts on overflow.\n */\n function mul(int256 a, int256 b) internal pure returns (int256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n require(!(a == -1 && b == _INT256_MIN), \"SignedSafeMath: multiplication overflow\");\n\n int256 c = a * b;\n require(c / a == b, \"SignedSafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.\n */\n function div(int256 a, int256 b) internal pure returns (int256) {\n require(b != 0, \"SignedSafeMath: division by zero\");\n require(!(b == -1 && a == _INT256_MIN), \"SignedSafeMath: division overflow\");\n\n int256 c = a / b;\n\n return c;\n }\n\n /**\n * @dev Subtracts two signed integers, reverts on overflow.\n */\n function sub(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a - b;\n require((b >= 0 && c <= a) || (b < 0 && c > a), \"SignedSafeMath: subtraction overflow\");\n\n return c;\n }\n\n /**\n * @dev Adds two signed integers, reverts on overflow.\n */\n function add(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a + b;\n require((b >= 0 && c >= a) || (b < 0 && c < a), \"SignedSafeMath: addition overflow\");\n\n return c;\n }\n}\n",
"vendor/Ownable.sol": "pragma solidity ^0.4.24;\n\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract Ownable {\n address public owner;\n\n\n event OwnershipRenounced(address indexed previousOwner);\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /**\n * @dev The Ownable constructor sets the original `owner` of the contract to the sender\n * account.\n */\n constructor() public {\n owner = msg.sender;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n /**\n * @dev Allows the current owner to relinquish control of the contract.\n * @notice Renouncing to ownership will leave the contract without an owner.\n * It will not be possible to call the functions with the `onlyOwner`\n * modifier anymore.\n */\n function renounceOwnership() public onlyOwner {\n emit OwnershipRenounced(owner);\n owner = address(0);\n }\n\n /**\n * @dev Allows the current owner to transfer control of the contract to a newOwner.\n * @param _newOwner The address to transfer ownership to.\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n _transferOwnership(_newOwner);\n }\n\n /**\n * @dev Transfers control of the contract to a newOwner.\n * @param _newOwner The address to transfer ownership to.\n */\n function _transferOwnership(address _newOwner) internal {\n require(_newOwner != address(0));\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMathChainlink {\n\n /**\n * @dev Multiplies two numbers, throws on overflow.\n */\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (_a == 0) {\n return 0;\n }\n\n c = _a * _b;\n assert(c / _a == _b);\n return c;\n }\n\n /**\n * @dev Integer division of two numbers, truncating the quotient.\n */\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\n // uint256 c = _a / _b;\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n return _a / _b;\n }\n\n /**\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n assert(_b <= _a);\n return _a - _b;\n }\n\n /**\n * @dev Adds two numbers, throws on overflow.\n */\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n c = _a + _b;\n assert(c >= _a);\n return c;\n }\n}\n"
},
"sourceTreeHashHex": "0xc929a77f512731ebbbf55b3bc476a89536375a6dac461bd0ac14350da6f141a3",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "AggregatorInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "latestAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRound",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "current",
"type": "int256"
},
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": false,
"name": "timestamp",
"type": "uint256"
}
],
"name": "AnswerUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": true,
"name": "startedBy",
"type": "address"
},
{
"indexed": false,
"name": "startedAt",
"type": "uint256"
}
],
"name": "NewRound",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"getAnswer(uint256)": "b5ab58dc",
"getTimestamp(uint256)": "b633620c",
"latestAnswer()": "50d25bcd",
"latestRound()": "668a0f02",
"latestTimestamp()": "8205bf6a"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/AggregatorInterface.sol": {
"id": 9
}
},
"sourceCodes": {
"interfaces/AggregatorInterface.sol": "pragma solidity >=0.4.24;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n"
},
"sourceTreeHashHex": "0xb21fa756e241d3fbfe7546158a7e1bb4a98f261744751c4e9dfe5f474ea46338",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "AggregatorV3Interface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "version",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "description",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_roundId",
"type": "uint80"
}
],
"name": "getRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"decimals()": "313ce567",
"description()": "7284e416",
"getRoundData(uint80)": "9a6fc8f5",
"latestRoundData()": "feaf968c",
"version()": "54fd4d50"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/AggregatorV3Interface.sol": {
"id": 10
}
},
"sourceCodes": {
"interfaces/AggregatorV3Interface.sol": "pragma solidity >=0.4.24;\n\ninterface AggregatorV3Interface {\n\n function decimals() external view returns (uint8);\n function description() external view returns (string memory);\n function version() external view returns (uint256);\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(uint80 _roundId)\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n"
},
"sourceTreeHashHex": "0xbf26d0dca0e2815b7c0bd09bddc9ceca339b8c9c2319ca74b2555273f5cbc19c",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "BasicConsumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawLink",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_oracle",
"type": "address"
},
{
"name": "_specId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": true,
"name": "price",
"type": "bytes32"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b506040516060806112cc83398101604090815281516020830151919092015161004683640100000000610063810204565b61005882640100000000610085810204565b600655506100a79050565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b611216806100b66000396000f30060806040526004361061006c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100715780636c0cae681461008e5780638dc654a2146100e75780639d1b464a146100fc578063ec65d0f814610123575b600080fd5b34801561007d57600080fd5b5061008c600435602435610166565b005b34801561009a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261008c9436949293602493928401919081908401838280828437509497506102af9650505050505050565b3480156100f357600080fd5b5061008c610462565b34801561010857600080fd5b50610111610622565b60408051918252519081900360200190f35b34801561012f57600080fd5b5061008c6004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610628565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b6102b761119d565b60606102e96006543063042f2b657c010000000000000000000000000000000000000000000000000000000002610634565b91506103b76040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a5059000000000000000000000000000000000000000000000000008152508461065f9092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816103cc579050509050828160008151811015156103f357fe5b9060200190602002018190525061044a6040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461068e9092919063ffffffff16565b61045c82670de0b6b3a7640000610701565b50505050565b600061046c610731565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b1580156104e757600080fd5b505af11580156104fb573d6000803e3d6000fd5b505050506040513d602081101561051157600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d60208110156105b057600080fd5b5051151561061f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b61045c8484848461074d565b61063c61119d565b61064461119d565b6106568186868663ffffffff61088816565b95945050505050565b6080830151610674908363ffffffff6108ea16565b6080830151610689908263ffffffff6108ea16565b505050565b60808301516000906106a6908463ffffffff6108ea16565b6106b38460800151610907565b5060005b81518110156106f4576106ec82828151811015156106d157fe5b6020908102909101015160808601519063ffffffff6108ea16565b6001016106b7565b61045c8460800151610912565b6003546000906107289073ffffffffffffffffffffffffffffffffffffffff16848461091d565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050565b61089061119d565b6108a08560800151610100610c7f565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6108f78260038351610cb9565b610689828263ffffffff610db616565b61061f816004610dd0565b61061f816007610dd0565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106109d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610994565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610ac287610de9565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d6020811015610bda57600080fd5b50511515610c6f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610c876111d2565b6020820615610c9c5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610cdb57610cd58360ff848116602002168317610f9b565b50610689565b60ff8111610d0f57610cfc836018602060ff8616021763ffffffff610f9b16565b50610cd58382600163ffffffff610fb316565b61ffff8111610d4457610d31836019602060ff8616021763ffffffff610f9b16565b50610cd58382600263ffffffff610fb316565b63ffffffff8111610d7b57610d6883601a602060ff8616021763ffffffff610f9b16565b50610cd58382600463ffffffff610fb316565b67ffffffffffffffff811161068957610da383601b602060ff8616021763ffffffff610f9b16565b5061045c8382600863ffffffff610fb316565b610dbe6111d2565b61072883846000015151848551610fd4565b61068982601f602060ff8516021763ffffffff610f9b16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610ede578181015183820152602001610ec6565b50505050905090810190601f168015610f0b5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610fa36111d2565b61072883846000015151846110c6565b610fbb6111d2565b610fcc848560000151518585611111565b949350505050565b610fdc6111d2565b600080600085518511151515610ff157600080fd5b8760200151858801111561101b5761101b886110138a602001518a890161116f565b600202611186565b8751805188602083010194508089880111156110375788870182525b60208801935050505b6020851061108057815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611040565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6110ce6111d2565b602084015183106110ea576110ea848560200151600202611186565b8351805160208583010184815381861415611106576001820183525b509495945050505050565b6111196111d2565b6000856020015185840111156111385761113886868501600202611186565b6001836101000a03905085518386820101858319825116178152815185880111156111635784870182525b50959695505050505050565b60008183111561118057508161072b565b50919050565b81516111928383610c7f565b5061045c8382610db6565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016111cd6111d2565b905290565b604080518082019091526060815260006020820152905600a165627a7a7230582028045f3004421199ce32553b0e9663364a2ea0c7ec69124c3a26e0171977dd2c0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x60 DUP1 PUSH2 0x12CC DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 SWAP1 SWAP3 ADD MLOAD PUSH2 0x46 DUP4 PUSH5 0x100000000 PUSH2 0x63 DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x58 DUP3 PUSH5 0x100000000 PUSH2 0x85 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x6 SSTORE POP PUSH2 0xA7 SWAP1 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1216 DUP1 PUSH2 0xB6 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0xFC JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x166 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x8C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2AF SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH2 0x462 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x111 PUSH2 0x622 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x628 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x220 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x2B7 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2E9 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x634 JUMP JUMPDEST SWAP2 POP PUSH2 0x3B7 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3CC JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x44A PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x68E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x45C DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x701 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46C PUSH2 0x731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x61F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x45C DUP5 DUP5 DUP5 DUP5 PUSH2 0x74D JUMP JUMPDEST PUSH2 0x63C PUSH2 0x119D JUMP JUMPDEST PUSH2 0x644 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x656 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x888 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x674 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x689 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH2 0x6B3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x907 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6F4 JUMPI PUSH2 0x6EC DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x6B7 JUMP JUMPDEST PUSH2 0x45C DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x912 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x728 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x91D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x87D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x890 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x8A0 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC7F JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x8F7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x689 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xDB6 AND JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x4 PUSH2 0xDD0 JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x7 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9D1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x994 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xAC2 DUP8 PUSH2 0xDE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xC6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC87 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xC9C JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCDB JUMPI PUSH2 0xCD5 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xF9B JUMP JUMPDEST POP PUSH2 0x689 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD0F JUMPI PUSH2 0xCFC DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD44 JUMPI PUSH2 0xD31 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD7B JUMPI PUSH2 0xD68 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x689 JUMPI PUSH2 0xDA3 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xDBE PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xFD4 JUMP JUMPDEST PUSH2 0x689 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEDE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEC6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA3 PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0xFCC DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1111 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFDC PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0xFF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x101B JUMPI PUSH2 0x101B DUP9 PUSH2 0x1013 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x116F JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1037 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1080 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1040 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x10CE PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x10EA JUMPI PUSH2 0x10EA DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1106 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1119 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1138 JUMPI PUSH2 0x1138 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1163 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1180 JUMPI POP DUP2 PUSH2 0x72B JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1192 DUP4 DUP4 PUSH2 0xC7F JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH2 0xDB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x11CD PUSH2 0x11D2 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x28 DIV 0x5f ADDRESS DIV TIMESTAMP GT SWAP10 0xce ORIGIN SSTORE EXTCODESIZE 0xe SWAP7 PUSH4 0x364A2EA0 0xc7 0xec PUSH10 0x124C3A26E0171977DD2C STOP 0x29 ",
"sourceMap": "51:201:21:-;;;1121:1:2;1094:28;;91:158:21;8:9:-1;5:2;;;30:1;27;20:12;5:2;91:158:21;;;;;;;;;;;;;;;;;;;;;;;;;165:24;91:158;165:17;;;;:24;:::i;:::-;195:27;214:7;195:18;;;;:27;:::i;:::-;228:6;:16;-1:-1:-1;51:201:21;;-1:-1:-1;51:201:21;4751:94:2;4808:4;:32;;-1:-1:-1;;;;;;4808:32:2;-1:-1:-1;;;;;4808:32:2;;;;;;;;;;4751:94::o;4529:108::-;4589:6;:43;;-1:-1:-1;;;;;;4589:43:2;-1:-1:-1;;;;;4589:43:2;;;;;;;;;;4529:108::o;51:201:21:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061006c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100715780636c0cae681461008e5780638dc654a2146100e75780639d1b464a146100fc578063ec65d0f814610123575b600080fd5b34801561007d57600080fd5b5061008c600435602435610166565b005b34801561009a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261008c9436949293602493928401919081908401838280828437509497506102af9650505050505050565b3480156100f357600080fd5b5061008c610462565b34801561010857600080fd5b50610111610622565b60408051918252519081900360200190f35b34801561012f57600080fd5b5061008c6004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610628565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b6102b761119d565b60606102e96006543063042f2b657c010000000000000000000000000000000000000000000000000000000002610634565b91506103b76040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a5059000000000000000000000000000000000000000000000000008152508461065f9092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816103cc579050509050828160008151811015156103f357fe5b9060200190602002018190525061044a6040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461068e9092919063ffffffff16565b61045c82670de0b6b3a7640000610701565b50505050565b600061046c610731565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b1580156104e757600080fd5b505af11580156104fb573d6000803e3d6000fd5b505050506040513d602081101561051157600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d60208110156105b057600080fd5b5051151561061f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b61045c8484848461074d565b61063c61119d565b61064461119d565b6106568186868663ffffffff61088816565b95945050505050565b6080830151610674908363ffffffff6108ea16565b6080830151610689908263ffffffff6108ea16565b505050565b60808301516000906106a6908463ffffffff6108ea16565b6106b38460800151610907565b5060005b81518110156106f4576106ec82828151811015156106d157fe5b6020908102909101015160808601519063ffffffff6108ea16565b6001016106b7565b61045c8460800151610912565b6003546000906107289073ffffffffffffffffffffffffffffffffffffffff16848461091d565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050565b61089061119d565b6108a08560800151610100610c7f565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6108f78260038351610cb9565b610689828263ffffffff610db616565b61061f816004610dd0565b61061f816007610dd0565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106109d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610994565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610ac287610de9565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d6020811015610bda57600080fd5b50511515610c6f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610c876111d2565b6020820615610c9c5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610cdb57610cd58360ff848116602002168317610f9b565b50610689565b60ff8111610d0f57610cfc836018602060ff8616021763ffffffff610f9b16565b50610cd58382600163ffffffff610fb316565b61ffff8111610d4457610d31836019602060ff8616021763ffffffff610f9b16565b50610cd58382600263ffffffff610fb316565b63ffffffff8111610d7b57610d6883601a602060ff8616021763ffffffff610f9b16565b50610cd58382600463ffffffff610fb316565b67ffffffffffffffff811161068957610da383601b602060ff8616021763ffffffff610f9b16565b5061045c8382600863ffffffff610fb316565b610dbe6111d2565b61072883846000015151848551610fd4565b61068982601f602060ff8516021763ffffffff610f9b16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610ede578181015183820152602001610ec6565b50505050905090810190601f168015610f0b5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610fa36111d2565b61072883846000015151846110c6565b610fbb6111d2565b610fcc848560000151518585611111565b949350505050565b610fdc6111d2565b600080600085518511151515610ff157600080fd5b8760200151858801111561101b5761101b886110138a602001518a890161116f565b600202611186565b8751805188602083010194508089880111156110375788870182525b60208801935050505b6020851061108057815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611040565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6110ce6111d2565b602084015183106110ea576110ea848560200151600202611186565b8351805160208583010184815381861415611106576001820183525b509495945050505050565b6111196111d2565b6000856020015185840111156111385761113886868501600202611186565b6001836101000a03905085518386820101858319825116178152815185880111156111635784870182525b50959695505050505050565b60008183111561118057508161072b565b50919050565b81516111928383610c7f565b5061045c8382610db6565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016111cd6111d2565b905290565b604080518082019091526060815260006020820152905600a165627a7a7230582028045f3004421199ce32553b0e9663364a2ea0c7ec69124c3a26e0171977dd2c0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0xFC JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x166 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x8C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2AF SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH2 0x462 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x111 PUSH2 0x622 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x628 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x220 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x2B7 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2E9 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x634 JUMP JUMPDEST SWAP2 POP PUSH2 0x3B7 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3CC JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x44A PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x68E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x45C DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x701 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46C PUSH2 0x731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x61F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x45C DUP5 DUP5 DUP5 DUP5 PUSH2 0x74D JUMP JUMPDEST PUSH2 0x63C PUSH2 0x119D JUMP JUMPDEST PUSH2 0x644 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x656 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x888 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x674 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x689 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH2 0x6B3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x907 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6F4 JUMPI PUSH2 0x6EC DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x6B7 JUMP JUMPDEST PUSH2 0x45C DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x912 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x728 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x91D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x87D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x890 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x8A0 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC7F JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x8F7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x689 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xDB6 AND JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x4 PUSH2 0xDD0 JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x7 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9D1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x994 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xAC2 DUP8 PUSH2 0xDE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xC6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC87 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xC9C JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCDB JUMPI PUSH2 0xCD5 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xF9B JUMP JUMPDEST POP PUSH2 0x689 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD0F JUMPI PUSH2 0xCFC DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD44 JUMPI PUSH2 0xD31 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD7B JUMPI PUSH2 0xD68 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x689 JUMPI PUSH2 0xDA3 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xDBE PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xFD4 JUMP JUMPDEST PUSH2 0x689 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEDE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEC6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA3 PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0xFCC DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1111 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFDC PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0xFF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x101B JUMPI PUSH2 0x101B DUP9 PUSH2 0x1013 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x116F JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1037 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1080 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1040 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x10CE PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x10EA JUMPI PUSH2 0x10EA DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1106 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1119 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1138 JUMPI PUSH2 0x1138 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1163 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1180 JUMPI POP DUP2 PUSH2 0x72B JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1192 DUP4 DUP4 PUSH2 0xC7F JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH2 0xDB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x11CD PUSH2 0x11D2 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x28 DIV 0x5f ADDRESS DIV TIMESTAMP GT SWAP10 0xce ORIGIN SSTORE EXTCODESIZE 0xe SWAP7 PUSH4 0x364A2EA0 0xc7 0xec PUSH10 0x124C3A26E0171977DD2C STOP 0x29 ",
"sourceMap": "51:201:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1169:188:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1169:188:24;;;;;;;;;323:404;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;323:404:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;323:404:24;;-1:-1:-1;323:404:24;;-1:-1:-1;;;;;;;323:404:24;961:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;961:204:24;;;;127:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:27:24;;;;;;;;;;;;;;;;;;;;731:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;731:226:24;;;;;;;;;;;;;1169:188;8660:27:2;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;1289:36:24;;1318:6;;1306:10;;1289:36;;;;;-1:-1:-1;1331:12:24;:21;-1:-1:-1;1169:188:24:o;323:404::-;384:28;;:::i;:::-;574:20;415:58;437:6;;445:4;451:21;;;415;:58::i;:::-;384:89;;479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;597:15;;;610:1;597:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;574:38;;628:9;618:4;623:1;618:7;;;;;;;;;;;;;;;;;:19;;;;643:32;;;;;;;;;;;;;;;;;;;670:4;643:3;:18;;:32;;;;;:::i;:::-;681:41;702:3;579:6:2;681:20:24;:41::i;:::-;;323:404;;;:::o;961:204::-;998:23;1043;:21;:23::i;:::-;1107:29;;;;;;1130:4;1107:29;;;;;;998:69;;-1:-1:-1;1081:13:24;;;;;;1095:10;;1081:13;;1107:14;;:29;;;;;;;;;;;;;;-1:-1:-1;1081:13:24;1107:29;;;5:2:-1;;;;30:1;27;20:12;5:2;1107:29:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1107:29:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1107:29:24;1081:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:29;;1081:56;;;;;;;-1:-1:-1;1081:56:24;;;;5:2:-1;;;;30:1;27;20:12;5:2;1081:56:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1081:56:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1081:56:24;1073:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;961:204;:::o;127:27::-;;;;:::o;731:226::-;874:78;897:10;909:8;919:19;940:11;874:22;:78::i;1725:295:2:-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;1958:155:1:-;2046:8;;;;:27;;2068:4;2046:27;:21;:27;:::i;:::-;2079:8;;;;:29;;2101:6;2079:29;:21;:29;:::i;:::-;1958:155;;;:::o;3428:294::-;3537:8;;;;3602:9;;3537:27;;3559:4;3537:27;:21;:27;:::i;:::-;3570:21;:4;:8;;;:19;:21::i;:::-;-1:-1:-1;3614:1:1;3597:93;3621:7;:14;3617:1;:18;3597:93;;;3650:33;3672:7;3680:1;3672:10;;;;;;;;;;;;;;;;;;;3650:8;;;;;:33;:21;:33;:::i;:::-;3637:3;;3597:93;;;3695:22;:4;:8;;;:20;:22::i;2317:180:2:-;2469:6;;2422:7;;2446:46;;2469:6;;2477:4;2483:8;2446:22;:46::i;:::-;2439:53;;2317:180;;;;;:::o;5210:110::-;5310:4;;;;5210:110;:::o;3997:417::-;4151:35;4215:27;;;:15;:27;;;;;;;;4249:34;;;;;;4294:30;;4215:27;;;;;4231:10;;4294:30;;4151:35;4294:30;4330:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4330:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4330:79:2;;;;3997:417;;;;;:::o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;1228:39;;:20;;;:39;1273:43;;:23;;;:43;1209:13;972:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;3001:476:2:-;3125:17;3191:4;3197:8;;3174:32;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3174:32:2;;;3164:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;;;;;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;;;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3330:60:2;3322:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;:::o;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;4496:155:33:-;4573:6;;:::i;:::-;4601:45;4607:3;4612;:7;;;:14;4628:4;4634;:11;4601:5;:45::i;1439:155:34:-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;7481:527:2:-;7878:7;;7893:20;;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7628:6;7598:405;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;7628:6;7598:405;;;;;;;;;;;;;;7569:5;;7628:29;;:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7990:12;;7598:405;;;;;;;;;;7628:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7598:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7598:405:2;;;22:32:-1;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;7598:405:2;;;;179:29:-1;;;;160:49;;;-1:-1;7598:405:2;;-1:-1:-1;;;;;;;;;;7481:527:2;;;:::o;5811:144:33:-;5885:6;;:::i;:::-;5913:37;5924:3;5929;:7;;;:14;5945:4;5913:10;:37::i;9497:154::-;9578:6;;:::i;:::-;9606:40;9615:3;9620;:7;;;:14;9636:4;9642:3;9606:8;:40::i;:::-;9599:47;9497:154;-1:-1:-1;;;;9497:154:33:o;2651:1140::-;2746:6;;:::i;:::-;2897:9;2912:8;3580:9;2782:4;:11;2775:3;:18;;2767:27;;;;;;;;2817:3;:12;;;2811:3;2805;:9;:24;2801:90;;;2839:45;2846:3;2851:28;2855:3;:12;;;2875:3;2869;:9;2851:3;:28::i;:::-;2882:1;2851:32;2839:6;:45::i;:::-;3006:3;3000:10;3077:6;3071:13;3193:3;3188:2;3180:6;3176:15;3172:25;3164:33;;3277:6;3271:3;3266;3262:13;3259:25;3256:2;;;3319:3;3314;3310:13;3302:6;3295:29;3256:2;3356;3350:4;3346:13;3339:20;;2935:430;;3417:129;3431:2;3424:9;;3417:129;;3486:10;;3473:24;;3435:9;;;;;3520:2;3512:10;;;;3530:9;;;;3417:129;;;-1:-1:-1;3655:10:33;3704:11;;3600:2;:8;;;;3592:3;:17;:21;;3667:9;;3651:26;;;3700:22;;3742:21;;;;3729:35;;;-1:-1:-1;3783:3:33;;;-1:-1:-1;;2651:1140:33:o;4945:619::-;5028:6;;:::i;:::-;5060:12;;;;5053:19;;5049:69;;5082:29;5089:3;5094;:12;;;5109:1;5094:16;5082:6;:29::i;:::-;5204:3;5198:10;5275:6;5269:13;5387:2;5381:3;5373:6;5369:16;5365:25;5411:4;5405;5397:19;5482:6;5477:3;5474:15;5471:2;;;5527:1;5519:6;5515:14;5507:6;5500:30;5471:2;-1:-1:-1;5556:3:33;;4945:619;-1:-1:-1;;;;;4945:619:33:o;8610:642::-;8699:6;;:::i;:::-;8799:9;8736:3;:12;;;8730:3;8724;:9;:24;8720:73;;;8758:28;8765:3;8777;8771;:9;8784:1;8770:15;8758:6;:28::i;:::-;8824:1;8818:3;8811;:10;:14;8799:26;;8911:3;8905:10;9026:3;9020;9012:6;9008:16;9004:26;9082:4;9074;9070:9;9063:4;9057:11;9053:27;9050:37;9044:4;9037:51;9170:6;9164:13;9158:3;9153;9149:13;9146:32;9143:2;;;9213:3;9208;9204:13;9196:6;9189:29;9143:2;-1:-1:-1;9244:3:33;;8610:642;-1:-1:-1;;;;;;8610:642:33:o;1889:114::-;1939:4;1959:1;1955;:5;1951:34;;;-1:-1:-1;1977:1:33;1970:8;;1951:34;-1:-1:-1;1997:1:33;1889:114;-1:-1:-1;1889:114:33:o;1732:153::-;1823:7;;1836:19;1823:3;1846:8;1836:4;:19::i;:::-;;1861;1868:3;1873:6;1861;:19::i;51:201:21:-;;;;;;;;;-1:-1:-1;51:201:21;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;51:201:21;;;;;:::o"
},
"methodIdentifiers": {
"cancelRequest(bytes32,uint256,bytes4,uint256)": "ec65d0f8",
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"requestEthereumPrice(string)": "6c0cae68",
"withdrawLink()": "8dc654a2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawLink\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_specId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"RequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/BasicConsumer.sol\":\"BasicConsumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/BasicConsumer.sol\":{\"keccak256\":\"0x1d4bc9d7c40e959e4bd953b8c9bb9295c4d1f1091757f1294d8d45bcf3453a97\",\"urls\":[\"bzzr://b69057579f6ae845923d1e98a5b6c2e2b2c843569c44a44d0a5f04e4be257197\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/Consumer.sol\":{\"keccak256\":\"0xbfa7e56235f6b488d92d3d5441048331cc6d1cbd83518eb07a0805e7a62f4449\",\"urls\":[\"bzzr://05c399b169c9aebb647d546fff910e4452d13d54080ee031f6ca442302c8ef6e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/BasicConsumer.sol": {
"id": 21
},
"tests/Consumer.sol": {
"id": 24
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/BasicConsumer.sol": "pragma solidity 0.4.24;\n\nimport \"./Consumer.sol\";\n\ncontract BasicConsumer is Consumer {\n\n constructor(address _link, address _oracle, bytes32 _specId) public {\n setChainlinkToken(_link);\n setChainlinkOracle(_oracle);\n specId = _specId;\n }\n\n}\n",
"tests/Consumer.sol": "pragma solidity 0.4.24;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract Consumer is ChainlinkClient {\n bytes32 internal specId;\n bytes32 public currentPrice;\n\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n\n event RequestFulfilled(\n bytes32 indexed requestId, // User-defined ID\n bytes32 indexed price\n );\n\n function requestEthereumPrice(string _currency) public {\n Chainlink.Request memory req = buildChainlinkRequest(specId, this, this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n string[] memory path = new string[](1);\n path[0] = _currency;\n req.addStringArray(\"path\", path);\n sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function cancelRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function withdrawLink() public {\n LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());\n require(link.transfer(msg.sender, link.balanceOf(address(this))), \"Unable to transfer\");\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n emit RequestFulfilled(_requestId, _price);\n currentPrice = _price;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x77421423c0c30a2a085257789cfe2c2f27121956495fe5c9ac874178403542d5",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "BasicToken",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
],
"devdoc": {
"methods": {
"balanceOf(address)": {
"details": "Gets the balance of the specified address.",
"params": {
"_owner": "The address to query the the balance of. "
},
"return": "An uint256 representing the amount owned by the passed address."
},
"transfer(address,uint256)": {
"details": "transfer token for a specified address",
"params": {
"_to": "The address to transfer to.",
"_value": "The amount to be transferred."
}
}
},
"title": "Basic token"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b5061023e806100206000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005481565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b33600090815260016020526040812054610143908363ffffffff6101ed16565b336000908152600160205260408082209290925573ffffffffffffffffffffffffffffffffffffffff851681522054610182908363ffffffff6101ff16565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b6000828211156101f957fe5b50900390565b8181018281101561020c57fe5b929150505600a165627a7a723058208854a611dca7c4a32a3dbb96c79dd8b569af793b9cbb851759cb9acf8a4734060029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18160DDD DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xB0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0xF5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xFB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x143 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1ED AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x182 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1FF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP3 CALLER SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1F9 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x20C JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 SLOAD 0xa6 GT 0xdc 0xa7 0xc4 LOG3 0x2a RETURNDATASIZE 0xbb SWAP7 0xc7 SWAP14 0xd8 0xb5 PUSH10 0xAF793B9CBB851759CB9A 0xcf DUP11 0x47 CALLVALUE MOD STOP 0x29 ",
"sourceMap": "274:809:32:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;274:809:32;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005481565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b33600090815260016020526040812054610143908363ffffffff6101ed16565b336000908152600160205260408082209290925573ffffffffffffffffffffffffffffffffffffffff851681522054610182908363ffffffff6101ff16565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b6000828211156101f957fe5b50900390565b8181018281101561020c57fe5b929150505600a165627a7a723058208854a611dca7c4a32a3dbb96c79dd8b569af793b9cbb851759cb9acf8a4734060029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18160DDD DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xB0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0xF5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xFB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x123 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x143 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1ED AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x182 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1FF AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP3 CALLER SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1F9 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x20C JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 SLOAD 0xa6 GT 0xdc 0xa7 0xc4 LOG3 0x2a RETURNDATASIZE 0xbb SWAP7 0xc7 SWAP14 0xd8 0xb5 PUSH10 0xAF793B9CBB851759CB9A 0xcf DUP11 0x47 CALLVALUE MOD STOP 0x29 ",
"sourceMap": "274:809:32:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179:26:14;;8:9:-1;5:2;;;30:1;27;20:12;5:2;179:26:14;;;;;;;;;;;;;;;;;;;;976:104:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:104:32;;;;;;;542:231;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;542:231:32;;;;;;;;;;;;;;;;;;;;;;;;;;;179:26:14;;;;:::o;976:104:32:-;1059:16;;1029:15;1059:16;;;:8;:16;;;;;;;976:104::o;542:231::-;642:10;598:4;633:20;;;:8;:20;;;;;;:32;;658:6;633:32;:24;:32;:::i;:::-;619:10;610:20;;;;:8;:20;;;;;;:55;;;;:20;687:13;;;;;;:25;;705:6;687:25;:17;:25;:::i;:::-;671:13;;;;;;;:8;:13;;;;;;;;;:41;;;;718:33;;;;;;;671:13;;727:10;;718:33;;;;;;;;;;-1:-1:-1;764:4:32;542:231;;;;:::o;1069:116:40:-;1129:7;1151:8;;;;1144:16;;;;-1:-1:-1;1173:7:40;;;1069:116::o;1247:128::-;1328:7;;;1348;;;;1341:15;;;;1247:128;;;;:::o"
},
"methodIdentifiers": {
"balanceOf(address)": "70a08231",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"balanceOf(address)\":{\"details\":\"Gets the balance of the specified address.\",\"params\":{\"_owner\":\"The address to query the the balance of. \"},\"return\":\"An uint256 representing the amount owned by the passed address.\"},\"transfer(address,uint256)\":{\"details\":\"transfer token for a specified address\",\"params\":{\"_to\":\"The address to transfer to.\",\"_value\":\"The amount to be transferred.\"}}},\"title\":\"Basic token\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/BasicToken.sol\":\"BasicToken\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ERC20Basic.sol\":{\"keccak256\":\"0x5c0857cec6aebc5dfbafe5c0b3761952f0180c07f23200ed2b80051ccc6a6d6d\",\"urls\":[\"bzzr://658dc7a8924774d1009631c1ff7c546328ff32bf5a53274fb7651d5ca20e3e48\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/BasicToken.sol\":{\"keccak256\":\"0xe024b5f9c509c6e630587c51beeb5417a7b147c4532b0cbf00763a01ff98ad45\",\"urls\":[\"bzzr://b898aa83d88a05011b5f6e4a7aedea29b0f8f27f742049efd7b9b89988901ae6\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074\",\"urls\":[\"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/BasicToken.sol": {
"id": 32
},
"interfaces/ERC20Basic.sol": {
"id": 14
},
"vendor/SafeMathChainlink.sol": {
"id": 40
}
},
"sourceCodes": {
"vendor/BasicToken.sol": "pragma solidity ^0.4.24;\n\n\nimport { ERC20Basic as linkERC20Basic } from \"../interfaces/ERC20Basic.sol\";\nimport { SafeMathChainlink as linkSafeMath } from \"./SafeMathChainlink.sol\";\n\n\n/**\n * @title Basic token\n * @dev Basic version of StandardToken, with no allowances. \n */\ncontract BasicToken is linkERC20Basic {\n using linkSafeMath for uint256;\n\n mapping(address => uint256) balances;\n\n /**\n * @dev transfer token for a specified address\n * @param _to The address to transfer to.\n * @param _value The amount to be transferred.\n */\n function transfer(address _to, uint256 _value) returns (bool) {\n balances[msg.sender] = balances[msg.sender].sub(_value);\n balances[_to] = balances[_to].add(_value);\n Transfer(msg.sender, _to, _value);\n return true;\n }\n\n /**\n * @dev Gets the balance of the specified address.\n * @param _owner The address to query the the balance of. \n * @return An uint256 representing the amount owned by the passed address.\n */\n function balanceOf(address _owner) constant returns (uint256 balance) {\n return balances[_owner];\n }\n\n}\n",
"interfaces/ERC20Basic.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title ERC20Basic\n * @dev Simpler version of ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/179\n */\ncontract ERC20Basic {\n uint256 public totalSupply;\n function balanceOf(address who) constant returns (uint256);\n function transfer(address to, uint256 value) returns (bool);\n event Transfer(address indexed from, address indexed to, uint256 value);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMathChainlink {\n\n /**\n * @dev Multiplies two numbers, throws on overflow.\n */\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (_a == 0) {\n return 0;\n }\n\n c = _a * _b;\n assert(c / _a == _b);\n return c;\n }\n\n /**\n * @dev Integer division of two numbers, truncating the quotient.\n */\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\n // uint256 c = _a / _b;\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n return _a / _b;\n }\n\n /**\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n assert(_b <= _a);\n return _a - _b;\n }\n\n /**\n * @dev Adds two numbers, throws on overflow.\n */\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n c = _a + _b;\n assert(c >= _a);\n return c;\n }\n}\n"
},
"sourceTreeHashHex": "0x9f8ff4356f69a56c5746a24ff09adf403fecbb8fb77e02192ff473b84356014c",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Buffer",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820cac330d9b33d6f30713da75d481e71f51c8b57fa7d9fb21b185db7c0b190400f0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN STOP PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xca 0xc3 ADDRESS 0xd9 0xb3 RETURNDATASIZE PUSH16 0x30713DA75D481E71F51C8B57FA7D9FB2 SHL XOR 0x5d 0xb7 0xc0 0xb1 SWAP1 BLOCKHASH 0xf STOP 0x29 ",
"sourceMap": "403:9250:33:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820cac330d9b33d6f30713da75d481e71f51c8b57fa7d9fb21b185db7c0b190400f0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xca 0xc3 ADDRESS 0xd9 0xb3 RETURNDATASIZE PUSH16 0x30713DA75D481E71F51C8B57FA7D9FB2 SHL XOR 0x5d 0xb7 0xc0 0xb1 SWAP1 BLOCKHASH 0xf STOP 0x29 ",
"sourceMap": "403:9250:33:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":\"Buffer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n"
},
"sourceTreeHashHex": "0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "CBOR",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a723058206283f5534e6d138d58aee25a4d0a11b73841d021b143b4251e368c82b06b31f10029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN STOP PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH3 0x83F553 0x4e PUSH14 0x138D58AEE25A4D0A11B73841D021 0xb1 NUMBER 0xb4 0x25 0x1e CALLDATASIZE DUP13 DUP3 0xb0 PUSH12 0x31F100290000000000000000 ",
"sourceMap": "127:3333:34:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a723058206283f5534e6d138d58aee25a4d0a11b73841d021b143b4251e368c82b06b31f10029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH3 0x83F553 0x4e PUSH14 0x138D58AEE25A4D0A11B73841D021 0xb1 NUMBER 0xb4 0x25 0x1e CALLDATASIZE DUP13 DUP3 0xb0 PUSH12 0x31F100290000000000000000 ",
"sourceMap": "127:3333:34:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":\"CBOR\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n"
},
"sourceTreeHashHex": "0xd51725b16dd157e4c8ea5b781e45f7b89e8bfac135ee2f433455f52bc45aaf94",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Chainlink",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {},
"title": "Library for common Chainlink functions"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820760d823cd008b73bb7e2b80f527a9361b230b67d8002256b8a0364c70d5b3c700029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN STOP PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH23 0xD823CD008B73BB7E2B80F527A9361B230B67D8002256B DUP11 SUB PUSH5 0xC70D5B3C70 STOP 0x29 ",
"sourceMap": "268:3456:1:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820760d823cd008b73bb7e2b80f527a9361b230b67d8002256b8a0364c70d5b3c700029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH23 0xD823CD008B73BB7E2B80F527A9361B230B67D8002256B DUP11 SUB PUSH5 0xC70D5B3C70 STOP 0x29 ",
"sourceMap": "268:3456:1:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{},\"title\":\"Library for common Chainlink functions\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":\"Chainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n"
},
"sourceTreeHashHex": "0xd84c7de67999a442bf37bb4a94de13feea702985ca2761ded5e6daeb5cbe4d82",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ChainlinkClient",
"compilerOutput": {
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {},
"title": "The ChainlinkClient contract"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040526001600455348015601457600080fd5b5060358060226000396000f3006080604052600080fd00a165627a7a72305820d76a0fb3a41ac39ccbff2f791c0a594c3640b10528c4786e2c99efe1fe184e360029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH1 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x22 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd7 PUSH11 0xFB3A41AC39CCBFF2F791C EXP MSIZE 0x4c CALLDATASIZE BLOCKHASH 0xb1 SDIV 0x28 0xc4 PUSH25 0x6E2C99EFE1FE184E3600290000000000000000000000000000 ",
"sourceMap": "475:8619:2:-;;;1121:1;1094:28;;475:8619;8:9:-1;5:2;;;30:1;27;20:12;5:2;475:8619:2;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600080fd00a165627a7a72305820d76a0fb3a41ac39ccbff2f791c0a594c3640b10528c4786e2c99efe1fe184e360029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd7 PUSH11 0xFB3A41AC39CCBFF2F791C EXP MSIZE 0x4c CALLDATASIZE BLOCKHASH 0xb1 SDIV 0x28 0xc4 PUSH25 0x6E2C99EFE1FE184E3600290000000000000000000000000000 ",
"sourceMap": "475:8619:2:-;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{},\"title\":\"The ChainlinkClient contract\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":\"ChainlinkClient\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x05bc26d94f743e99ec36add036123831e8f6dae33a4460b92df938adeb8a3425",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ChainlinkRequestInterface",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "sender",
"type": "address"
},
{
"name": "payment",
"type": "uint256"
},
{
"name": "id",
"type": "bytes32"
},
{
"name": "callbackAddress",
"type": "address"
},
{
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"name": "nonce",
"type": "uint256"
},
{
"name": "version",
"type": "uint256"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "oracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "requestId",
"type": "bytes32"
},
{
"name": "payment",
"type": "uint256"
},
{
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"name": "expiration",
"type": "uint256"
}
],
"name": "cancelOracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"cancelOracleRequest(bytes32,uint256,bytes4,uint256)": "6ee4d553",
"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)": "40429946"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
}
},
"sourceCodes": {
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n"
},
"sourceTreeHashHex": "0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Chainlinked",
"compilerOutput": {
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {},
"title": "The Chainlinked contract"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040526001600455348015601457600080fd5b5060358060226000396000f3006080604052600080fd00a165627a7a72305820b5bf32c4acbc321ef8f3e3240f3ba4df88a7f43c37f165954d2dec70f8e493530029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH1 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x22 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb5 0xbf ORIGIN 0xc4 0xac 0xbc ORIGIN 0x1e 0xf8 RETURN 0xe3 0x24 0xf EXTCODESIZE LOG4 0xdf DUP9 0xa7 DELEGATECALL EXTCODECOPY CALLDATACOPY CALL PUSH6 0x954D2DEC70F8 0xe4 SWAP4 MSTORE8 STOP 0x29 ",
"sourceMap": "271:4198:3:-;;;1121:1:2;1094:28;;271:4198:3;8:9:-1;5:2;;;30:1;27;20:12;5:2;271:4198:3;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600080fd00a165627a7a72305820b5bf32c4acbc321ef8f3e3240f3ba4df88a7f43c37f165954d2dec70f8e493530029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb5 0xbf ORIGIN 0xc4 0xac 0xbc ORIGIN 0x1e 0xf8 RETURN 0xe3 0x24 0xf EXTCODESIZE LOG4 0xdf DUP9 0xa7 DELEGATECALL EXTCODECOPY CALLDATACOPY CALL PUSH6 0x954D2DEC70F8 0xe4 SWAP4 MSTORE8 STOP 0x29 ",
"sourceMap": "271:4198:3:-;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{},\"title\":\"The Chainlinked contract\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlinked.sol\":\"Chainlinked\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlinked.sol\":{\"keccak256\":\"0x7ea2587ce4ad6fb965aac139bf7872baafed08c48cb6d2e3cb1c4139b535c73a\",\"urls\":[\"bzzr://bf058b58fa620e0c3d5d9286728a5233ab43dbd7838dd786e7aec9899e848f37\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"Chainlinked.sol": {
"id": 3
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"Chainlinked.sol": "pragma solidity ^0.4.24;\n\nimport \"./ChainlinkClient.sol\";\n\n/**\n * @title The Chainlinked contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network. ChainlinkClient is an alias of the Chainlinked contract.\n */\ncontract Chainlinked is ChainlinkClient {\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function newRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n return buildChainlinkRequest(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `sendChainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function chainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequest(_req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function chainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n return sendChainlinkRequestTo(_oracle, _req, _payment);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setOracle(address _oracle) internal {\n setChainlinkOracle(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setLinkToken(address _link) internal {\n setChainlinkToken(_link);\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkToken()\n internal\n view\n returns (address)\n {\n return chainlinkTokenAddress();\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function oracleAddress()\n internal\n view\n returns (address)\n {\n return chainlinkOracleAddress();\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function fulfillChainlinkRequest(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function setChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n useChainlinkWithENS(_ens, _node);\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `setChainlinkWithENS` has been called previously\n */\n function setOracleWithENS()\n internal\n {\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addExternalRequest(address _oracle, bytes32 _requestId)\n internal\n {\n addChainlinkExternalRequest(_oracle, _requestId);\n }\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x419415c1df4379b56cf48113629059e3a2314d04b1e319cb97cc36a5fd7967f9",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ConcreteChainlink",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [],
"name": "closeEvent",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "addUint",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "bytes"
}
],
"name": "addBytes",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_values",
"type": "bytes32[]"
}
],
"name": "addStringArray",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "int256"
}
],
"name": "addInt",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "data",
"type": "bytes"
}
],
"name": "setBuffer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "string"
}
],
"name": "add",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "payload",
"type": "bytes"
}
],
"name": "RequestData",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b506119c4806100206000396000f3006080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303dc532681146100875780630e734a581461009e5780632255beb0146100f957806347655b1b146101905780635e31692e14610222578063cc39406f1461027d578063ebdf86ca146102d6575b600080fd5b34801561009357600080fd5b5061009c61036d565b005b3480156100aa57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750949750509335945061043a9350505050565b34801561010557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506106b49650505050505050565b34801561019c57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061083a9650505050505050565b34801561022e57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c9436949293602493928401919081908401838280828437509497505093359450610b439350505050565b34801561028957600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750949750610cc99650505050505050565b3480156102e257600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f419650505050505050565b6040805160208082526003805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116049183018290527f84485ae823e5c366e9581c146349e23f73b2f459d9eee1b9f15f36aac3b3145a9390929182918201908490801561042a5780601f106103ff5761010080835404028352916020019161042a565b820191906000526020600020905b81548152906001019060200180831161040d57829003601f168201915b50509250505060405180910390a1565b6104426118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01169390930494850184900490930283018101875295820183815294959394608087019492939192849284918401828280156105955780601f1061056a57610100808354040283529160200191610595565b820191906000526020600020905b81548152906001019060200180831161057857829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff6110c716565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911792909216919091179055606083015160025560808301518051805185949360039261069f92849291909101906118e5565b50602082015181600101555050905050505050565b6106bc6118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011693909304948501849004909302830181018752958201838152949593946080870194929391928492849184018282801561080f5780601f106107e45761010080835404028352916020019161080f565b820191906000526020600020905b8154815290600101906020018083116107f257829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff6110f616565b606060006108466118b0565b835160405190808252806020026020018201604052801561087b57816020015b60608152602001906001900390816108665790505b509250600091505b83518210156108cf576108ac848381518110151561089d57fe5b90602001906020020151611120565b83838151811015156108ba57fe5b60209081029091010152600190910190610883565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050509183525050600191909101546020909101529052509050610a4d81868563ffffffff6112ce16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610b2c92849291909101906118e5565b506020820151816001015550509050505050505050565b610b4b6118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff61134716565b610cd16118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610e245780601f10610df957610100808354040283529160200191610e24565b820191906000526020600020905b815481529060010190602001808311610e0757829003601f168201915b5050509183525050600191909101546020909101529052509050610e4e818363ffffffff61137116565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610f2d92849291909101906118e5565b506020820151816001015550509050505050565b610f496118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011693909304948501849004909302830181018752958201838152949593946080870194929391928492849184018282801561109c5780601f106110715761010080835404028352916020019161109c565b820191906000526020600020905b81548152906001019060200180831161107f57829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff61138f16565b60808301516110dc908363ffffffff6113b916565b60808301516110f1908263ffffffff6113d616565b505050565b608083015161110b908363ffffffff6113b916565b60808301516110f1908263ffffffff6113e616565b6040805160208082528183019092526060918291600091829182918591908082016104008038833901905050945060009350600092505b60208310156111e4576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156111d9578185858151811015156111a257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b600190920191611157565b836040519080825280601f01601f191660200182016040528015611212578160200160208202803883390190505b509050600092505b838310156112c457848381518110151561123057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561128957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161121a565b9695505050505050565b60808301516000906112e6908463ffffffff6113b916565b6112f384608001516113f3565b5060005b81518110156113345761132c828281518110151561131157fe5b6020908102909101015160808601519063ffffffff6113b916565b6001016112f7565b6113418460800151611401565b50505050565b608083015161135c908363ffffffff6113b916565b60808301516110f1908263ffffffff61140c16565b6113808260800151825161149f565b506110f18260800151826114df565b60808301516113a4908363ffffffff6113b916565b60808301516110f1908263ffffffff6113b916565b6113c68260038351611500565b6110f1828263ffffffff6114df16565b6113e282600083611500565b5050565b6113c68260028351611500565b6113fe8160046115fd565b50565b6113fe8160076115fd565b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008112156114435761143e8282611616565b6113e2565b67ffffffffffffffff81131561145d5761143e8282611673565b600081126114715761143e82600083611500565b6113e2826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03611500565b6114a7611963565b60208206156114bc5760208206602003820191505b506020808301829052604080518085526000815283019091019052815b92915050565b6114e7611963565b6114f9838460000151518485516116ae565b9392505050565b601781116115225761151c8360ff8481166020021683176117a0565b506110f1565b60ff811161155657611543836018602060ff8616021763ffffffff6117a016565b5061151c8382600163ffffffff6117b816565b61ffff811161158b57611578836019602060ff8616021763ffffffff6117a016565b5061151c8382600263ffffffff6117b816565b63ffffffff81116115c2576115af83601a602060ff8616021763ffffffff6117a016565b5061151c8382600463ffffffff6117b816565b67ffffffffffffffff81116110f1576115ea83601b602060ff8616021763ffffffff6117a016565b506113418382600863ffffffff6117b816565b6110f182601f602060ff8516021763ffffffff6117a016565b6116278260c363ffffffff6117a016565b506113e282827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03604051602001808281526020019150506040516020818303038152906040526113e6565b6116848260c263ffffffff6117a016565b506113e28282604051602001808281526020019150506040516020818303038152906040526113e6565b6116b6611963565b6000806000855185111515156116cb57600080fd5b876020015185880111156116f5576116f5886116ed8a602001518a89016117d9565b6002026117f0565b8751805188602083010194508089880111156117115788870182525b60208801935050505b6020851061175a57815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909401936020928301929091019061171a565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6117a8611963565b6114f98384600001515184611807565b6117c0611963565b6117d1848560000151518585611852565b949350505050565b6000818311156117ea5750816114d9565b50919050565b81516117fc838361149f565b5061134183826114df565b61180f611963565b6020840151831061182b5761182b8485602001516002026117f0565b8351805160208583010184815381861415611847576001820183525b509495945050505050565b61185a611963565b60008560200151858401111561187957611879868685016002026117f0565b6001836101000a03905085518386820101858319825116178152815185880111156118a45784870182525b50959695505050505050565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016118e0611963565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061192657805160ff1916838001178555611953565b82800160010185558215611953579182015b82811115611953578251825591602001919060010190611938565b5061195f92915061197b565b5090565b60408051808201909152606081526000602082015290565b61199591905b8082111561195f5760008155600101611981565b905600a165627a7a72305820cb36a60e333c6a0820167eed06201ed9a005f0f67eaa29be70cd554dd7b842fc0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3DC5326 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0xE734A58 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x2255BEB0 EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0x47655B1B EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x5E31692E EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xCC39406F EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0xEBDF86CA EQ PUSH2 0x2D6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x36D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x43A SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x6B4 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD DUP8 CALLDATALOAD DUP10 ADD DUP1 CALLDATALOAD PUSH1 0x20 DUP2 DUP2 MUL DUP5 DUP2 ADD DUP3 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 SWAP11 SWAP10 DUP10 ADD SWAP9 SWAP3 SWAP8 POP SWAP1 DUP3 ADD SWAP6 POP SWAP4 POP DUP4 SWAP3 POP DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x83A SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xB43 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x289 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xCC9 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xF41 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE PUSH32 0x84485AE823E5C366E9581C146349E23F73B2F459D9EEE1B9F15F36AAC3B3145A SWAP4 SWAP1 SWAP3 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x42A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3FF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x42A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x40D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x442 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x595 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x56A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x595 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x578 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10C7 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x69F SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6BC PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x80F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7E4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x80F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7F2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10F6 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x846 PUSH2 0x18B0 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x87B JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x866 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP4 MLOAD DUP3 LT ISZERO PUSH2 0x8CF JUMPI PUSH2 0x8AC DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x89D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1120 JUMP JUMPDEST DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8BA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x883 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xA22 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9F7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xA22 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xA05 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xA4D DUP2 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x12CE AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xB2C SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB4B PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xC9E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC73 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC9E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC81 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1347 AND JUMP JUMPDEST PUSH2 0xCD1 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xE24 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xDF9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xE24 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE07 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xE4E DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1371 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xF2D SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x109C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1071 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x109C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x107F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x138F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10DC SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13D6 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x110B SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13E6 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP6 SWAP2 SWAP1 DUP1 DUP3 ADD PUSH2 0x400 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP5 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 LT ISZERO PUSH2 0x11E4 JUMPI PUSH1 0x8 DUP4 MUL PUSH1 0x2 EXP DUP8 MUL SWAP2 POP PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ISZERO PUSH2 0x11D9 JUMPI DUP2 DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1157 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1212 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP4 DUP4 LT ISZERO PUSH2 0x12C4 JUMPI DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1230 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL DUP2 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1289 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x121A JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x12E6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH2 0x12F3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x13F3 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x1334 JUMPI PUSH2 0x132C DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1311 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x12F7 JUMP JUMPDEST PUSH2 0x1341 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x1401 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x135C SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x140C AND JUMP JUMPDEST PUSH2 0x1380 DUP3 PUSH1 0x80 ADD MLOAD DUP3 MLOAD PUSH2 0x149F JUMP JUMPDEST POP PUSH2 0x10F1 DUP3 PUSH1 0x80 ADD MLOAD DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13A4 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH2 0x13C6 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x10F1 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x14DF AND JUMP JUMPDEST PUSH2 0x13E2 DUP3 PUSH1 0x0 DUP4 PUSH2 0x1500 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x13C6 DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH1 0x4 PUSH2 0x15FD JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH1 0x7 PUSH2 0x15FD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x1443 JUMPI PUSH2 0x143E DUP3 DUP3 PUSH2 0x1616 JUMP JUMPDEST PUSH2 0x13E2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x145D JUMPI PUSH2 0x143E DUP3 DUP3 PUSH2 0x1673 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x1471 JUMPI PUSH2 0x143E DUP3 PUSH1 0x0 DUP4 PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x13E2 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x14A7 PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x14BC JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE DUP4 ADD SWAP1 SWAP2 ADD SWAP1 MSTORE DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x14E7 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x14F9 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x16AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1522 JUMPI PUSH2 0x151C DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x17A0 JUMP JUMPDEST POP PUSH2 0x10F1 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1556 JUMPI PUSH2 0x1543 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x158B JUMPI PUSH2 0x1578 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x15C2 JUMPI PUSH2 0x15AF DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10F1 JUMPI PUSH2 0x15EA DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x1341 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH2 0x10F1 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST PUSH2 0x1627 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x13E2 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x1684 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x13E2 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x16B6 PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x16CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x16F5 JUMPI PUSH2 0x16F5 DUP9 PUSH2 0x16ED DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x17D9 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1711 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x175A JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x171A JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17A8 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x14F9 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x17C0 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x17D1 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1852 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x17EA JUMPI POP DUP2 PUSH2 0x14D9 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x17FC DUP4 DUP4 PUSH2 0x149F JUMP JUMPDEST POP PUSH2 0x1341 DUP4 DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x180F PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x182B JUMPI PUSH2 0x182B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1847 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x185A PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1879 JUMPI PUSH2 0x1879 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x18A4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x18E0 PUSH2 0x1963 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1926 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1953 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1953 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1953 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1938 JUMP JUMPDEST POP PUSH2 0x195F SWAP3 SWAP2 POP PUSH2 0x197B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x1995 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x195F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1981 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xcb CALLDATASIZE 0xa6 0xe CALLER EXTCODECOPY PUSH11 0x820167EED06201ED9A005 CREATE 0xf6 PUSH31 0xAA29BE70CD554DD7B842FC0029000000000000000000000000000000000000 ",
"sourceMap": "181:1947:22:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;181:1947:22;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303dc532681146100875780630e734a581461009e5780632255beb0146100f957806347655b1b146101905780635e31692e14610222578063cc39406f1461027d578063ebdf86ca146102d6575b600080fd5b34801561009357600080fd5b5061009c61036d565b005b3480156100aa57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750949750509335945061043a9350505050565b34801561010557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506106b49650505050505050565b34801561019c57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061083a9650505050505050565b34801561022e57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c9436949293602493928401919081908401838280828437509497505093359450610b439350505050565b34801561028957600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c943694929360249392840191908190840183828082843750949750610cc99650505050505050565b3480156102e257600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261009c94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f419650505050505050565b6040805160208082526003805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116049183018290527f84485ae823e5c366e9581c146349e23f73b2f459d9eee1b9f15f36aac3b3145a9390929182918201908490801561042a5780601f106103ff5761010080835404028352916020019161042a565b820191906000526020600020905b81548152906001019060200180831161040d57829003601f168201915b50509250505060405180910390a1565b6104426118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01169390930494850184900490930283018101875295820183815294959394608087019492939192849284918401828280156105955780601f1061056a57610100808354040283529160200191610595565b820191906000526020600020905b81548152906001019060200180831161057857829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff6110c716565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911792909216919091179055606083015160025560808301518051805185949360039261069f92849291909101906118e5565b50602082015181600101555050905050505050565b6106bc6118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011693909304948501849004909302830181018752958201838152949593946080870194929391928492849184018282801561080f5780601f106107e45761010080835404028352916020019161080f565b820191906000526020600020905b8154815290600101906020018083116107f257829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff6110f616565b606060006108466118b0565b835160405190808252806020026020018201604052801561087b57816020015b60608152602001906001900390816108665790505b509250600091505b83518210156108cf576108ac848381518110151561089d57fe5b90602001906020020151611120565b83838151811015156108ba57fe5b60209081029091010152600190910190610883565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050509183525050600191909101546020909101529052509050610a4d81868563ffffffff6112ce16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610b2c92849291909101906118e5565b506020820151816001015550509050505050505050565b610b4b6118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff61134716565b610cd16118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116939093049485018490049093028301810187529582018381529495939460808701949293919284928491840182828015610e245780601f10610df957610100808354040283529160200191610e24565b820191906000526020600020905b815481529060010190602001808311610e0757829003601f168201915b5050509183525050600191909101546020909101529052509050610e4e818363ffffffff61137116565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610f2d92849291909101906118e5565b506020820151816001015550509050505050565b610f496118b0565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff81166020808601919091527fffffffff000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000007401000000000000000000000000000000000000000090930492909202919091168486015260028054606080870191909152865160038054601f96811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011693909304948501849004909302830181018752958201838152949593946080870194929391928492849184018282801561109c5780601f106110715761010080835404028352916020019161109c565b820191906000526020600020905b81548152906001019060200180831161107f57829003601f168201915b50505091835250506001919091015460209091015290525090506105c081848463ffffffff61138f16565b60808301516110dc908363ffffffff6113b916565b60808301516110f1908263ffffffff6113d616565b505050565b608083015161110b908363ffffffff6113b916565b60808301516110f1908263ffffffff6113e616565b6040805160208082528183019092526060918291600091829182918591908082016104008038833901905050945060009350600092505b60208310156111e4576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156111d9578185858151811015156111a257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b600190920191611157565b836040519080825280601f01601f191660200182016040528015611212578160200160208202803883390190505b509050600092505b838310156112c457848381518110151561123057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561128957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161121a565b9695505050505050565b60808301516000906112e6908463ffffffff6113b916565b6112f384608001516113f3565b5060005b81518110156113345761132c828281518110151561131157fe5b6020908102909101015160808601519063ffffffff6113b916565b6001016112f7565b6113418460800151611401565b50505050565b608083015161135c908363ffffffff6113b916565b60808301516110f1908263ffffffff61140c16565b6113808260800151825161149f565b506110f18260800151826114df565b60808301516113a4908363ffffffff6113b916565b60808301516110f1908263ffffffff6113b916565b6113c68260038351611500565b6110f1828263ffffffff6114df16565b6113e282600083611500565b5050565b6113c68260028351611500565b6113fe8160046115fd565b50565b6113fe8160076115fd565b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008112156114435761143e8282611616565b6113e2565b67ffffffffffffffff81131561145d5761143e8282611673565b600081126114715761143e82600083611500565b6113e2826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03611500565b6114a7611963565b60208206156114bc5760208206602003820191505b506020808301829052604080518085526000815283019091019052815b92915050565b6114e7611963565b6114f9838460000151518485516116ae565b9392505050565b601781116115225761151c8360ff8481166020021683176117a0565b506110f1565b60ff811161155657611543836018602060ff8616021763ffffffff6117a016565b5061151c8382600163ffffffff6117b816565b61ffff811161158b57611578836019602060ff8616021763ffffffff6117a016565b5061151c8382600263ffffffff6117b816565b63ffffffff81116115c2576115af83601a602060ff8616021763ffffffff6117a016565b5061151c8382600463ffffffff6117b816565b67ffffffffffffffff81116110f1576115ea83601b602060ff8616021763ffffffff6117a016565b506113418382600863ffffffff6117b816565b6110f182601f602060ff8516021763ffffffff6117a016565b6116278260c363ffffffff6117a016565b506113e282827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03604051602001808281526020019150506040516020818303038152906040526113e6565b6116848260c263ffffffff6117a016565b506113e28282604051602001808281526020019150506040516020818303038152906040526113e6565b6116b6611963565b6000806000855185111515156116cb57600080fd5b876020015185880111156116f5576116f5886116ed8a602001518a89016117d9565b6002026117f0565b8751805188602083010194508089880111156117115788870182525b60208801935050505b6020851061175a57815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909401936020928301929091019061171a565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6117a8611963565b6114f98384600001515184611807565b6117c0611963565b6117d1848560000151518585611852565b949350505050565b6000818311156117ea5750816114d9565b50919050565b81516117fc838361149f565b5061134183826114df565b61180f611963565b6020840151831061182b5761182b8485602001516002026117f0565b8351805160208583010184815381861415611847576001820183525b509495945050505050565b61185a611963565b60008560200151858401111561187957611879868685016002026117f0565b6001836101000a03905085518386820101858319825116178152815185880111156118a45784870182525b50959695505050505050565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016118e0611963565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061192657805160ff1916838001178555611953565b82800160010185558215611953579182015b82811115611953578251825591602001919060010190611938565b5061195f92915061197b565b5090565b60408051808201909152606081526000602082015290565b61199591905b8082111561195f5760008155600101611981565b905600a165627a7a72305820cb36a60e333c6a0820167eed06201ed9a005f0f67eaa29be70cd554dd7b842fc0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3DC5326 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0xE734A58 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x2255BEB0 EQ PUSH2 0xF9 JUMPI DUP1 PUSH4 0x47655B1B EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x5E31692E EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xCC39406F EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0xEBDF86CA EQ PUSH2 0x2D6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x36D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x43A SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x6B4 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD DUP8 CALLDATALOAD DUP10 ADD DUP1 CALLDATALOAD PUSH1 0x20 DUP2 DUP2 MUL DUP5 DUP2 ADD DUP3 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 SWAP11 SWAP10 DUP10 ADD SWAP9 SWAP3 SWAP8 POP SWAP1 DUP3 ADD SWAP6 POP SWAP4 POP DUP4 SWAP3 POP DUP6 ADD SWAP1 DUP5 SWAP1 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x83A SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xB43 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x289 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xCC9 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x9C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xF41 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE PUSH32 0x84485AE823E5C366E9581C146349E23F73B2F459D9EEE1B9F15F36AAC3B3145A SWAP4 SWAP1 SWAP3 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x42A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3FF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x42A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x40D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x442 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x595 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x56A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x595 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x578 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10C7 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x69F SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6BC PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x80F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7E4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x80F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7F2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10F6 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x846 PUSH2 0x18B0 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x87B JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x866 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP4 MLOAD DUP3 LT ISZERO PUSH2 0x8CF JUMPI PUSH2 0x8AC DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x89D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1120 JUMP JUMPDEST DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8BA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x883 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xA22 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9F7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xA22 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xA05 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xA4D DUP2 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x12CE AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xB2C SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB4B PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xC9E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC73 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC9E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC81 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1347 AND JUMP JUMPDEST PUSH2 0xCD1 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xE24 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xDF9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xE24 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE07 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xE4E DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1371 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xF2D SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x18E5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x18B0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP4 DIV SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1F SWAP7 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP4 SWAP1 SWAP4 DIV SWAP5 DUP6 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP4 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP3 ADD DUP4 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP5 SWAP3 DUP5 SWAP2 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x109C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1071 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x109C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x107F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x5C0 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x138F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10DC SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13D6 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x110B SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13E6 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP2 DUP6 SWAP2 SWAP1 DUP1 DUP3 ADD PUSH2 0x400 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP5 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 LT ISZERO PUSH2 0x11E4 JUMPI PUSH1 0x8 DUP4 MUL PUSH1 0x2 EXP DUP8 MUL SWAP2 POP PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ISZERO PUSH2 0x11D9 JUMPI DUP2 DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1157 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1212 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP4 DUP4 LT ISZERO PUSH2 0x12C4 JUMPI DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1230 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL DUP2 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1289 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x121A JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x12E6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH2 0x12F3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x13F3 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x1334 JUMPI PUSH2 0x132C DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1311 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x12F7 JUMP JUMPDEST PUSH2 0x1341 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x1401 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x135C SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x140C AND JUMP JUMPDEST PUSH2 0x1380 DUP3 PUSH1 0x80 ADD MLOAD DUP3 MLOAD PUSH2 0x149F JUMP JUMPDEST POP PUSH2 0x10F1 DUP3 PUSH1 0x80 ADD MLOAD DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13A4 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x10F1 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x13B9 AND JUMP JUMPDEST PUSH2 0x13C6 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x10F1 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x14DF AND JUMP JUMPDEST PUSH2 0x13E2 DUP3 PUSH1 0x0 DUP4 PUSH2 0x1500 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x13C6 DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH1 0x4 PUSH2 0x15FD JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH1 0x7 PUSH2 0x15FD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x1443 JUMPI PUSH2 0x143E DUP3 DUP3 PUSH2 0x1616 JUMP JUMPDEST PUSH2 0x13E2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x145D JUMPI PUSH2 0x143E DUP3 DUP3 PUSH2 0x1673 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x1471 JUMPI PUSH2 0x143E DUP3 PUSH1 0x0 DUP4 PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x13E2 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x1500 JUMP JUMPDEST PUSH2 0x14A7 PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x14BC JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE DUP4 ADD SWAP1 SWAP2 ADD SWAP1 MSTORE DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x14E7 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x14F9 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x16AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1522 JUMPI PUSH2 0x151C DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x17A0 JUMP JUMPDEST POP PUSH2 0x10F1 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1556 JUMPI PUSH2 0x1543 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x158B JUMPI PUSH2 0x1578 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x15C2 JUMPI PUSH2 0x15AF DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x151C DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10F1 JUMPI PUSH2 0x15EA DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x1341 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x17B8 AND JUMP JUMPDEST PUSH2 0x10F1 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST PUSH2 0x1627 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x13E2 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x1684 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x17A0 AND JUMP JUMPDEST POP PUSH2 0x13E2 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x16B6 PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x16CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x16F5 JUMPI PUSH2 0x16F5 DUP9 PUSH2 0x16ED DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x17D9 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1711 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x175A JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x171A JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17A8 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x14F9 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x17C0 PUSH2 0x1963 JUMP JUMPDEST PUSH2 0x17D1 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1852 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x17EA JUMPI POP DUP2 PUSH2 0x14D9 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x17FC DUP4 DUP4 PUSH2 0x149F JUMP JUMPDEST POP PUSH2 0x1341 DUP4 DUP3 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x180F PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x182B JUMPI PUSH2 0x182B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1847 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x185A PUSH2 0x1963 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1879 JUMPI PUSH2 0x1879 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x17F0 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x18A4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x18E0 PUSH2 0x1963 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1926 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1953 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1953 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1953 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1938 JUMP JUMPDEST POP PUSH2 0x195F SWAP3 SWAP2 POP PUSH2 0x197B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x1995 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x195F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1981 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xcb CALLDATASIZE 0xa6 0xe CALLER EXTCODECOPY PUSH11 0x820167EED06201ED9A005 CREATE 0xf6 PUSH31 0xAA29BE70CD554DD7B842FC0029000000000000000000000000000000000000 ",
"sourceMap": "181:1947:22:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;377:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;377:69:22;;;;;;997:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;997:141:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;997:141:22;;-1:-1:-1;;997:141:22;;;-1:-1:-1;997:141:22;;-1:-1:-1;;;;997:141:22;710;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;710:141:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;710:141:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;710:141:22;;;;-1:-1:-1;710:141:22;-1:-1:-1;710:141:22;;-1:-1:-1;710:141:22;;;;;;;;-1:-1:-1;710:141:22;;-1:-1:-1;710:141:22;;-1:-1:-1;;;;;;;710:141:22;1271:331;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1271:331:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1271:331:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1271:331:22;;;;-1:-1:-1;1271:331:22;-1:-1:-1;1271:331:22;;-1:-1:-1;1271:331:22;;;;;;;;;-1:-1:-1;1271:331:22;;-1:-1:-1;1271:331:22;;-1:-1:-1;;;;;;;1271:331:22;855:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;855:138:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;855:138:22;;-1:-1:-1;;855:138:22;;;-1:-1:-1;855:138:22;;-1:-1:-1;;;;855:138:22;450:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;450:120:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;450:120:22;;-1:-1:-1;450:120:22;;-1:-1:-1;;;;;;;450:120:22;574:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;574:132:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;574:132:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;574:132:22;;;;-1:-1:-1;574:132:22;-1:-1:-1;574:132:22;;-1:-1:-1;574:132:22;;;;;;;;-1:-1:-1;574:132:22;;-1:-1:-1;574:132:22;;-1:-1:-1;;;;;;;574:132:22;377:69;417:24;;;;;;;429:7;417:24;;;;;;;;;;;;;;;;;;;;;;;429:7;;417:24;;;;;;429:7;;417:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;377:69::o;997:141::-;1056:27;;:::i;:::-;:33;;;;;;;;1086:3;1056:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1086:3;;1056:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1056:33:22;;;-1:-1:-1;;1056:33:22;;;;;;;;;;;;;-1:-1:-1;1056:33:22;-1:-1:-1;1095:24:22;1056:33;1106:4;1112:6;1095:24;:10;:24;:::i;:::-;1125:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1131:2;;1125:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;997:141;;;:::o;710:::-;768:27;;:::i;:::-;:33;;;;;;;;798:3;768:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;798:3;;768:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;768:33:22;;;-1:-1:-1;;768:33:22;;;;;;;;;;;;;-1:-1:-1;768:33:22;-1:-1:-1;807:25:22;768:33;819:4;825:6;807:25;:11;:25;:::i;1271:331::-;1347:23;1412:9;1512:27;;:::i;:::-;1386:7;:14;1373:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1347:54;;1424:1;1412:13;;1407:100;1431:7;:14;1427:1;:18;1407:100;;;1473:27;1489:7;1497:1;1489:10;;;;;;;;;;;;;;;;;;1473:15;:27::i;:::-;1460:7;1468:1;1460:10;;;;;;;;;;;;;;;;;;:40;1447:3;;;;;1407:100;;;1512:33;;;;;;;;1542:3;1512:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1542:3;;1512:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1512:33:22;;;-1:-1:-1;;1512:33:22;;;;;;;;;;;;;-1:-1:-1;1512:33:22;-1:-1:-1;1551:32:22;1512:33;1569:4;1575:7;1551:32;:17;:32;:::i;:::-;1589:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1595:2;;1589:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;1271:331;;;;;:::o;855:138::-;912:27;;:::i;:::-;:33;;;;;;;;942:3;912:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;942:3;;912:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;912:33:22;;;-1:-1:-1;;912:33:22;;;;;;;;;;;;;-1:-1:-1;912:33:22;-1:-1:-1;951:23:22;912:33;961:4;967:6;951:23;:9;:23;:::i;450:120::-;494:27;;:::i;:::-;:33;;;;;;;;524:3;494:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;524:3;;494:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;494:33:22;;;-1:-1:-1;;494:33:22;;;;;;;;;;;;;-1:-1:-1;494:33:22;-1:-1:-1;533:18:22;494:33;546:4;533:18;:12;:18;:::i;:::-;557:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;563:2;;557:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;450:120;;:::o;574:132::-;628:27;;:::i;:::-;:33;;;;;;;;658:3;628:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;658:3;;628:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;628:33:22;;;-1:-1:-1;;628:33:22;;;;;;;;;;;;;-1:-1:-1;628:33:22;-1:-1:-1;667:20:22;628:33;674:4;680:6;667:20;:6;:20;:::i;3047:158:1:-;3140:8;;;;:27;;3162:4;3140:27;:21;:27;:::i;:::-;3173:8;;;;:27;;3193:6;3173:27;:19;:27;:::i;:::-;3047:158;;;:::o;2318:::-;2410:8;;;;:27;;2432:4;2410:27;:21;:27;:::i;:::-;2443:8;;;;:28;;2464:6;2443:28;:20;:28;:::i;1606:520:22:-;1705:13;;;1715:2;1705:13;;;;;;;;;1664:6;;;;1724:14;;;;;;1664:6;;1705:13;;;;17:15:-1;;105:10;1705:13:22;88:34:-1;136:17;;-1:-1;1705:13:22;1678:40;;1741:1;1724:18;;1762:1;1753:10;;1748:185;1769:2;1765:1;:6;1748:185;;;1827:1;:5;;1821:1;:12;1811:22;;;-1:-1:-1;1847:9:22;;;;1843:84;;1893:4;1868:11;1880:9;1868:22;;;;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1;1907:11:22;;;;;1843:84;1773:3;;;;;1748:185;;;1982:9;1972:20;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;1972:20:22;;1938:54;;2007:1;2003:5;;1998:85;2014:9;2010:1;:13;1998:85;;;2062:11;2074:1;2062:14;;;;;;;;;;;;;;;;;;;;2038:18;2057:1;2038:21;;;;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;2025:3:22;;;;;1998:85;;;2102:18;1606:520;-1:-1:-1;;;;;;1606:520:22:o;3428:294:1:-;3537:8;;;;3602:9;;3537:27;;3559:4;3537:27;:21;:27;:::i;:::-;3570:21;:4;:8;;;:19;:21::i;:::-;-1:-1:-1;3614:1:1;3597:93;3621:7;:14;3617:1;:18;3597:93;;;3650:33;3672:7;3680:1;3672:10;;;;;;;;;;;;;;;;;;;3650:8;;;;;:33;:21;:33;:::i;:::-;3637:3;;3597:93;;;3695:22;:4;:8;;;:20;:22::i;:::-;3428:294;;;;:::o;2683:155::-;2774:8;;;;:27;;2796:4;2774:27;:21;:27;:::i;:::-;2807:8;;;;:26;;2826:6;2807:26;:18;:26;:::i;1576:175::-;1655:45;1677:4;:8;;;1687:5;:12;1655:21;:45::i;:::-;;1706:40;1730:4;:8;;;1740:5;1706:23;:40::i;1958:155::-;2046:8;;;;:27;;2068:4;2046:27;:21;:27;:::i;:::-;2079:8;;;;:29;;2101:6;2079:29;:21;:29;:::i;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;1600:136::-;1691:38;1702:3;241:1;1723:5;1691:10;:38::i;:::-;1600:136;;:::o;2196:181::-;2296:47;2307:3;346:1;2330:5;:12;2296:10;:47::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;:::-;3037:135;:::o;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;1742:448::-;1842:20;1834:5;:28;1831:353;;;1878:30;1897:3;1902:5;1878:18;:30::i;:::-;1831:353;;;1936:18;1928:5;:26;1925:259;;;1970:24;1983:3;1988:5;1970:12;:24::i;1925:259::-;2023:1;2014:10;;2011:173;;2040:44;2051:3;241:1;2077:5;2040:10;:44::i;2011:173::-;2115:58;2126:3;297:1;2166:5;2161:2;:10;2115;:58::i;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;1283:27;;;1270:41;;1151:3;942:395;;;;;:::o;4496:155::-;4573:6;;:::i;:::-;4601:45;4607:3;4612;:7;;;:14;4628:4;4634;:11;4601:5;:45::i;:::-;4594:52;4496:155;-1:-1:-1;;;4496:155:33:o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;1439:155::-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;2598:229::-;2694:72;:3;2716:48;2694:72;:15;:72;:::i;:::-;;2774:46;2786:3;2812:5;2807:2;:10;2791:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2791:28:34;;;2774:11;:46::i;2383:209::-;2473:63;:3;2495:39;2473:63;:15;:63;:::i;:::-;;2544:41;2556:3;2577:5;2561:23;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2561:23:34;;;2544:11;:41::i;2651:1140:33:-;2746:6;;:::i;:::-;2897:9;2912:8;3580:9;2782:4;:11;2775:3;:18;;2767:27;;;;;;;;2817:3;:12;;;2811:3;2805;:9;:24;2801:90;;;2839:45;2846:3;2851:28;2855:3;:12;;;2875:3;2869;:9;2851:3;:28::i;:::-;2882:1;2851:32;2839:6;:45::i;:::-;3006:3;3000:10;3077:6;3071:13;3193:3;3188:2;3180:6;3176:15;3172:25;3164:33;;3277:6;3271:3;3266;3262:13;3259:25;3256:2;;;3319:3;3314;3310:13;3302:6;3295:29;3256:2;3356;3350:4;3346:13;3339:20;;2935:430;;3417:129;3431:2;3424:9;;3417:129;;3486:10;;3473:24;;3435:9;;;;;3520:2;3512:10;;;;3530:9;;;;3417:129;;;-1:-1:-1;3655:10:33;3704:11;;3600:2;:8;;;;3592:3;:17;:21;;3667:9;;3651:26;;;3700:22;;3742:21;;;;3729:35;;;-1:-1:-1;3783:3:33;;;-1:-1:-1;;2651:1140:33:o;5811:144::-;5885:6;;:::i;:::-;5913:37;5924:3;5929;:7;;;:14;5945:4;5913:10;:37::i;9497:154::-;9578:6;;:::i;:::-;9606:40;9615:3;9620;:7;;;:14;9636:4;9642:3;9606:8;:40::i;:::-;9599:47;9497:154;-1:-1:-1;;;;9497:154:33:o;1889:114::-;1939:4;1959:1;1955;:5;1951:34;;;-1:-1:-1;1977:1:33;1970:8;;1951:34;-1:-1:-1;1997:1:33;1889:114;-1:-1:-1;1889:114:33:o;1732:153::-;1823:7;;1836:19;1823:3;1846:8;1836:4;:19::i;:::-;;1861;1868:3;1873:6;1861;:19::i;4945:619::-;5028:6;;:::i;:::-;5060:12;;;;5053:19;;5049:69;;5082:29;5089:3;5094;:12;;;5109:1;5094:16;5082:6;:29::i;:::-;5204:3;5198:10;5275:6;5269:13;5387:2;5381:3;5373:6;5369:16;5365:25;5411:4;5405;5397:19;5482:6;5477:3;5474:15;5471:2;;;5527:1;5519:6;5515:14;5507:6;5500:30;5471:2;-1:-1:-1;5556:3:33;;4945:619;-1:-1:-1;;;;;4945:619:33:o;8610:642::-;8699:6;;:::i;:::-;8799:9;8736:3;:12;;;8730:3;8724;:9;:24;8720:73;;;8758:28;8765:3;8777;8771;:9;8784:1;8770:15;8758:6;:28::i;:::-;8824:1;8818:3;8811;:10;:14;8799:26;;8911:3;8905:10;9026:3;9020;9012:6;9008:16;9004:26;9082:4;9074;9070:9;9063:4;9057:11;9053:27;9050:37;9044:4;9037:51;9170:6;9164:13;9158:3;9153;9149:13;9146:32;9143:2;;;9213:3;9208;9204:13;9196:6;9189:29;9143:2;-1:-1:-1;9244:3:33;;8610:642;-1:-1:-1;;;;;;8610:642:33:o;181:1947:22:-;;;;;;;;;-1:-1:-1;181:1947:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;181:1947:22;;;-1:-1:-1;181:1947:22;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;181:1947:22;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o"
},
"methodIdentifiers": {
"add(string,string)": "ebdf86ca",
"addBytes(string,bytes)": "2255beb0",
"addInt(string,int256)": "5e31692e",
"addStringArray(string,bytes32[])": "47655b1b",
"addUint(string,uint256)": "0e734a58",
"closeEvent()": "03dc5326",
"setBuffer(bytes)": "cc39406f"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[],\"name\":\"closeEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"addUint\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"addBytes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_values\",\"type\":\"bytes32[]\"}],\"name\":\"addStringArray\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"addInt\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"setBuffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"RequestData\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/ConcreteChainlink.sol\":\"ConcreteChainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/ConcreteChainlink.sol\":{\"keccak256\":\"0x3bde37294d85eb0c739e7f0beb5f88915bfb3671588ae265d9c773cb742fa79f\",\"urls\":[\"bzzr://b844e6102c5ec307a5508872bc2bc5516e5c5a221dd44616e23225f487382df0\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/ConcreteChainlink.sol": {
"id": 22
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"tests/ConcreteChainlink.sol": "pragma solidity 0.4.24;\n\nimport \"../Chainlink.sol\";\nimport { CBOR as CBOR_Chainlink } from \"../vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"../vendor/Buffer.sol\";\n\ncontract ConcreteChainlink {\n using Chainlink for Chainlink.Request;\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n Chainlink.Request private req;\n\n event RequestData(bytes payload);\n\n function closeEvent() public {\n emit RequestData(req.buf.buf);\n }\n\n function setBuffer(bytes data) public {\n Chainlink.Request memory r2 = req;\n r2.setBuffer(data);\n req = r2;\n }\n\n function add(string _key, string _value) public {\n Chainlink.Request memory r2 = req;\n r2.add(_key, _value);\n req = r2;\n }\n\n function addBytes(string _key, bytes _value) public {\n Chainlink.Request memory r2 = req;\n r2.addBytes(_key, _value);\n req = r2;\n }\n\n function addInt(string _key, int256 _value) public {\n Chainlink.Request memory r2 = req;\n r2.addInt(_key, _value);\n req = r2;\n }\n\n function addUint(string _key, uint256 _value) public {\n Chainlink.Request memory r2 = req;\n r2.addUint(_key, _value);\n req = r2;\n }\n\n // Temporarily have method receive bytes32[] memory until experimental\n // string[] memory can be invoked from truffle tests.\n function addStringArray(string _key, bytes32[] memory _values) public {\n string[] memory strings = new string[](_values.length);\n for (uint256 i = 0; i < _values.length; i++) {\n strings[i] = bytes32ToString(_values[i]);\n }\n Chainlink.Request memory r2 = req;\n r2.addStringArray(_key, strings);\n req = r2;\n }\n\n function bytes32ToString(bytes32 x) private pure returns (string) {\n bytes memory bytesString = new bytes(32);\n uint charCount = 0;\n for (uint j = 0; j < 32; j++) {\n byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));\n if (char != 0) {\n bytesString[charCount] = char;\n charCount++;\n }\n }\n bytes memory bytesStringTrimmed = new bytes(charCount);\n for (j = 0; j < charCount; j++) {\n bytesStringTrimmed[j] = bytesString[j];\n }\n return string(bytesStringTrimmed);\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n"
},
"sourceTreeHashHex": "0xfb4be323917d8c244aea2b76b8fff6f05124be9ea7ad40cd142b614d449af27f",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ConcreteChainlinked",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_amount",
"type": "uint256"
}
],
"name": "publicLINK",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "publicCancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_requestId",
"type": "bytes32"
}
],
"name": "publicAddExternalRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "fulfillRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_address",
"type": "address"
},
{
"name": "_fulfillmentSignature",
"type": "bytes"
},
{
"name": "_wei",
"type": "uint256"
}
],
"name": "publicRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "publicChainlinkToken",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_address",
"type": "address"
},
{
"name": "_fulfillmentSignature",
"type": "bytes"
},
{
"name": "_wei",
"type": "uint256"
}
],
"name": "publicRequestRunTo",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "publicFulfillChainlinkRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_address",
"type": "address"
},
{
"name": "_fulfillmentSignature",
"type": "bytes"
}
],
"name": "publicNewRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "publicOracleAddress",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_oracle",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"name": "callbackAddress",
"type": "address"
},
{
"indexed": false,
"name": "callbackfunctionSelector",
"type": "bytes4"
},
{
"indexed": false,
"name": "data",
"type": "bytes"
}
],
"name": "Request",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "amount",
"type": "uint256"
}
],
"name": "LinkAmount",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b5060405160408061129083398101604052805160209091015161004082640100000000610059810204565b6100528164010000000061006e810204565b50506100c4565b61006b81640100000000610080810204565b50565b61006b816401000000006100a2810204565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b6111bd806100d36000396000f3006080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f14df8281146100a8578063448d6c10146100c25780635491ec6a146101055780635d64e3101461013657806366a4f3501461015157806398bb2b2d146101c9578063a1179a2714610207578063ad7e401c14610286578063d9a26716146102a1578063f7ea03ff14610317575b600080fd5b3480156100b457600080fd5b506100c060043561032c565b005b3480156100ce57600080fd5b506100c06004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610379565b34801561011157600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351660243561038b565b34801561014257600080fd5b506100c0600435602435610399565b34801561015d57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100c0948235946024803573ffffffffffffffffffffffffffffffffffffffff169536959460649492019190819084018382808284375094975050933594506104b39350505050565b3480156101d557600080fd5b506101de610554565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561021357600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100c09473ffffffffffffffffffffffffffffffffffffffff81358116956024803596604435909316953695608494920191819084018382808284375094975050933594506105639350505050565b34801561029257600080fd5b506100c06004356024356105d3565b3480156102ad57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100c0948235946024803573ffffffffffffffffffffffffffffffffffffffff16953695946064949201919081908401838280828437509497506105dc9650505050505050565b34801561032357600080fd5b506101de61073d565b7f81c82a6ea1ed1cf28a5376c6d13caab9047c853ec5107907ec9431c50ec1a85c610365670de0b6b3a76400008363ffffffff61074716565b60408051918252519081900360200190a150565b61038584848484610776565b50505050565b61039582826108b1565b5050565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461045357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2505050565b6104bb611144565b6105408585856040518082805190602001908083835b6020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206108bb565b905061054c81836108d6565b505050505050565b600061055e6108e9565b905090565b61056b611144565b6105bd8585856040518082805190602001908083836020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b90506105ca8682846108f3565b50505050505050565b61039582610900565b6105e4611144565b6106368484846040518082805190602001908083836020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b805160208083015160408085015160808087015151835187815273ffffffffffffffffffffffffffffffffffffffff8616818801527fffffffff000000000000000000000000000000000000000000000000000000008416948101949094526060840182815281519285019290925280519798507f6ae3654efc50e419eaebe21a0569020545587e83c4409cfb1d3a4217cbed8a21979495929490939260a08401919085019080838360005b838110156106fa5781810151838201526020016106e2565b50505050905090810190601f1680156107275780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a150505050565b600061055e610a19565b600082151561075857506000610770565b5081810281838281151561076857fe5b041461077057fe5b92915050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561089257600080fd5b505af11580156108a6573d6000803e3d6000fd5b505050505050505050565b6103958282610a23565b6108c3611144565b6108ce848484610b0a565b949350505050565b60006108e28383610b35565b9392505050565b600061055e610b5c565b60006108ce848484610b78565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146109ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b600061055e610eda565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610ab657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610b12611144565b610b1a611144565b610b2c8186868663ffffffff610ef616565b95945050505050565b6003546000906108e29073ffffffffffffffffffffffffffffffffffffffff168484610b78565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610c2c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610bef565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610d1d87610f58565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50511515610eca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b610efe611144565b610f0e856080015161010061110a565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b8381101561104d578181015183820152602001611035565b50505050905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b611112611179565b60208206156111275760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611174611179565b905290565b604080518082019091526060815260006020820152905600a165627a7a72305820ed4eb984593de2be818a8f19dce0c0c3205cd2a63a6a2937a22f069851e06efa0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x40 DUP1 PUSH2 0x1290 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH2 0x40 DUP3 PUSH5 0x100000000 PUSH2 0x59 DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x52 DUP2 PUSH5 0x100000000 PUSH2 0x6E DUP2 MUL DIV JUMP JUMPDEST POP POP PUSH2 0xC4 JUMP JUMPDEST PUSH2 0x6B DUP2 PUSH5 0x100000000 PUSH2 0x80 DUP2 MUL DIV JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x6B DUP2 PUSH5 0x100000000 PUSH2 0xA2 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x11BD DUP1 PUSH2 0xD3 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3F14DF82 DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x448D6C10 EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x5491EC6A EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x5D64E310 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x66A4F350 EQ PUSH2 0x151 JUMPI DUP1 PUSH4 0x98BB2B2D EQ PUSH2 0x1C9 JUMPI DUP1 PUSH4 0xA1179A27 EQ PUSH2 0x207 JUMPI DUP1 PUSH4 0xAD7E401C EQ PUSH2 0x286 JUMPI DUP1 PUSH4 0xD9A26716 EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0xF7EA03FF EQ PUSH2 0x317 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH2 0x32C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x379 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x38B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x399 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xC0 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x4B3 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DE PUSH2 0x554 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x213 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0xC0 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP7 PUSH1 0x44 CALLDATALOAD SWAP1 SWAP4 AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 SWAP3 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x563 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x292 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x5D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xC0 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x5DC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DE PUSH2 0x73D JUMP JUMPDEST PUSH32 0x81C82A6EA1ED1CF28A5376C6D13CAAB9047C853EC5107907EC9431C50EC1A85C PUSH2 0x365 PUSH8 0xDE0B6B3A7640000 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x747 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x385 DUP5 DUP5 DUP5 DUP5 PUSH2 0x776 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 DUP3 PUSH2 0x8B1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x453 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x4BB PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x540 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH2 0x8BB JUMP JUMPDEST SWAP1 POP PUSH2 0x54C DUP2 DUP4 PUSH2 0x8D6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0x8E9 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x56B PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x5BD DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST SWAP1 POP PUSH2 0x5CA DUP7 DUP3 DUP5 PUSH2 0x8F3 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 PUSH2 0x900 JUMP JUMPDEST PUSH2 0x5E4 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x636 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x80 DUP1 DUP8 ADD MLOAD MLOAD DUP4 MLOAD DUP8 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP2 DUP9 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP5 ADD DUP3 DUP2 MSTORE DUP2 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP8 SWAP9 POP PUSH32 0x6AE3654EFC50E419EAEBE21A0569020545587E83C4409CFB1D3A4217CBED8A21 SWAP8 SWAP5 SWAP6 SWAP3 SWAP5 SWAP1 SWAP4 SWAP3 PUSH1 0xA0 DUP5 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6FA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6E2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x727 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xA19 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO ISZERO PUSH2 0x758 JUMPI POP PUSH1 0x0 PUSH2 0x770 JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 ISZERO ISZERO PUSH2 0x768 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x770 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8A6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 DUP3 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x8C3 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x8CE DUP5 DUP5 DUP5 PUSH2 0xB0A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E2 DUP4 DUP4 PUSH2 0xB35 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xB5C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8CE DUP5 DUP5 DUP5 PUSH2 0xB78 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x9BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xB12 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xB1A PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xB2C DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xEF6 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x8E2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB78 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC2C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBEF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xD1D DUP8 PUSH2 0xF58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDBD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDA5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xDEA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE1F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xECA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xEFE PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xF0E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x110A JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x104D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1035 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x107A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1112 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1127 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1174 PUSH2 0x1179 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xed 0x4e 0xb9 DUP5 MSIZE RETURNDATASIZE 0xe2 0xbe DUP2 DUP11 DUP16 NOT 0xdc 0xe0 0xc0 0xc3 KECCAK256 0x5c 0xd2 0xa6 GASPRICE PUSH11 0x2937A22F069851E06EFA00 0x29 ",
"sourceMap": "97:2242:23:-;;;1121:1:2;1094:28;;185:105:23;8:9:-1;5:2;;;30:1;27;20:12;5:2;185:105:23;;;;;;;;;;;;;;;;;;;242:19;185:105;242:12;;;;:19;:::i;:::-;267:18;277:7;267:9;;;;:18;:::i;:::-;185:105;;97:2242;;2459:81:3;2511:24;2529:5;2511:17;;;;:24;:::i;:::-;2459:81;:::o;2262:83::-;2313:27;2332:7;2313:18;;;;:27;:::i;4751:94:2:-;4808:4;:32;;-1:-1:-1;;;;;;4808:32:2;-1:-1:-1;;;;;4808:32:2;;;;;;;;;;4751:94::o;4529:108::-;4589:6;:43;;-1:-1:-1;;;;;;4589:43:2;-1:-1:-1;;;;;4589:43:2;;;;;;;;;;4529:108::o;97:2242:23:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f14df8281146100a8578063448d6c10146100c25780635491ec6a146101055780635d64e3101461013657806366a4f3501461015157806398bb2b2d146101c9578063a1179a2714610207578063ad7e401c14610286578063d9a26716146102a1578063f7ea03ff14610317575b600080fd5b3480156100b457600080fd5b506100c060043561032c565b005b3480156100ce57600080fd5b506100c06004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610379565b34801561011157600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351660243561038b565b34801561014257600080fd5b506100c0600435602435610399565b34801561015d57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100c0948235946024803573ffffffffffffffffffffffffffffffffffffffff169536959460649492019190819084018382808284375094975050933594506104b39350505050565b3480156101d557600080fd5b506101de610554565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561021357600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100c09473ffffffffffffffffffffffffffffffffffffffff81358116956024803596604435909316953695608494920191819084018382808284375094975050933594506105639350505050565b34801561029257600080fd5b506100c06004356024356105d3565b3480156102ad57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100c0948235946024803573ffffffffffffffffffffffffffffffffffffffff16953695946064949201919081908401838280828437509497506105dc9650505050505050565b34801561032357600080fd5b506101de61073d565b7f81c82a6ea1ed1cf28a5376c6d13caab9047c853ec5107907ec9431c50ec1a85c610365670de0b6b3a76400008363ffffffff61074716565b60408051918252519081900360200190a150565b61038584848484610776565b50505050565b61039582826108b1565b5050565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461045357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2505050565b6104bb611144565b6105408585856040518082805190602001908083835b6020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206108bb565b905061054c81836108d6565b505050505050565b600061055e6108e9565b905090565b61056b611144565b6105bd8585856040518082805190602001908083836020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b90506105ca8682846108f3565b50505050505050565b61039582610900565b6105e4611144565b6106368484846040518082805190602001908083836020831061050e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104d1565b805160208083015160408085015160808087015151835187815273ffffffffffffffffffffffffffffffffffffffff8616818801527fffffffff000000000000000000000000000000000000000000000000000000008416948101949094526060840182815281519285019290925280519798507f6ae3654efc50e419eaebe21a0569020545587e83c4409cfb1d3a4217cbed8a21979495929490939260a08401919085019080838360005b838110156106fa5781810151838201526020016106e2565b50505050905090810190601f1680156107275780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a150505050565b600061055e610a19565b600082151561075857506000610770565b5081810281838281151561076857fe5b041461077057fe5b92915050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561089257600080fd5b505af11580156108a6573d6000803e3d6000fd5b505050505050505050565b6103958282610a23565b6108c3611144565b6108ce848484610b0a565b949350505050565b60006108e28383610b35565b9392505050565b600061055e610b5c565b60006108ce848484610b78565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146109ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b600061055e610eda565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610ab657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610b12611144565b610b1a611144565b610b2c8186868663ffffffff610ef616565b95945050505050565b6003546000906108e29073ffffffffffffffffffffffffffffffffffffffff168484610b78565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610c2c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610bef565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610d1d87610f58565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610e0b57600080fd5b505af1158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50511515610eca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b610efe611144565b610f0e856080015161010061110a565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b8381101561104d578181015183820152602001611035565b50505050905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b611112611179565b60208206156111275760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611174611179565b905290565b604080518082019091526060815260006020820152905600a165627a7a72305820ed4eb984593de2be818a8f19dce0c0c3205cd2a63a6a2937a22f069851e06efa0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3F14DF82 DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x448D6C10 EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x5491EC6A EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x5D64E310 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x66A4F350 EQ PUSH2 0x151 JUMPI DUP1 PUSH4 0x98BB2B2D EQ PUSH2 0x1C9 JUMPI DUP1 PUSH4 0xA1179A27 EQ PUSH2 0x207 JUMPI DUP1 PUSH4 0xAD7E401C EQ PUSH2 0x286 JUMPI DUP1 PUSH4 0xD9A26716 EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0xF7EA03FF EQ PUSH2 0x317 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH2 0x32C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x379 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x38B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x399 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xC0 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x4B3 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DE PUSH2 0x554 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x213 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0xC0 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP7 PUSH1 0x44 CALLDATALOAD SWAP1 SWAP4 AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 SWAP3 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x563 SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x292 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x5D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xC0 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x5DC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DE PUSH2 0x73D JUMP JUMPDEST PUSH32 0x81C82A6EA1ED1CF28A5376C6D13CAAB9047C853EC5107907EC9431C50EC1A85C PUSH2 0x365 PUSH8 0xDE0B6B3A7640000 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x747 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x385 DUP5 DUP5 DUP5 DUP5 PUSH2 0x776 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 DUP3 PUSH2 0x8B1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x453 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x4BB PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x540 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH2 0x8BB JUMP JUMPDEST SWAP1 POP PUSH2 0x54C DUP2 DUP4 PUSH2 0x8D6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0x8E9 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x56B PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x5BD DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST SWAP1 POP PUSH2 0x5CA DUP7 DUP3 DUP5 PUSH2 0x8F3 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 PUSH2 0x900 JUMP JUMPDEST PUSH2 0x5E4 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x636 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x50E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4D1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x80 DUP1 DUP8 ADD MLOAD MLOAD DUP4 MLOAD DUP8 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP2 DUP9 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND SWAP5 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP5 ADD DUP3 DUP2 MSTORE DUP2 MLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP8 SWAP9 POP PUSH32 0x6AE3654EFC50E419EAEBE21A0569020545587E83C4409CFB1D3A4217CBED8A21 SWAP8 SWAP5 SWAP6 SWAP3 SWAP5 SWAP1 SWAP4 SWAP3 PUSH1 0xA0 DUP5 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6FA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x6E2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x727 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xA19 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO ISZERO PUSH2 0x758 JUMPI POP PUSH1 0x0 PUSH2 0x770 JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 ISZERO ISZERO PUSH2 0x768 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x770 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8A6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x395 DUP3 DUP3 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x8C3 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0x8CE DUP5 DUP5 DUP5 PUSH2 0xB0A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E2 DUP4 DUP4 PUSH2 0xB35 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xB5C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8CE DUP5 DUP5 DUP5 PUSH2 0xB78 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x9BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55E PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xB12 PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xB1A PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xB2C DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xEF6 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x8E2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB78 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC2C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBEF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xD1D DUP8 PUSH2 0xF58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDBD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDA5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xDEA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE1F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xECA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xEFE PUSH2 0x1144 JUMP JUMPDEST PUSH2 0xF0E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x110A JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x104D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1035 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x107A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1112 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1127 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1174 PUSH2 0x1179 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xed 0x4e 0xb9 DUP5 MSIZE RETURNDATASIZE 0xe2 0xbe DUP2 DUP11 DUP16 NOT 0xdc 0xe0 0xc0 0xc3 KECCAK256 0x5c 0xd2 0xa6 GASPRICE PUSH11 0x2937A22F069851E06EFA00 0x29 ",
"sourceMap": "97:2242:23:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2012:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2012:89:23;;;;;;;1359:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1359:232:23;;;;;;;;;;;;;2203:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2203:134:23;;;;;;;;;1695:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1695:111:23;;;;;;;763:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;763:279:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;763:279:23;;-1:-1:-1;;763:279:23;;;-1:-1:-1;763:279:23;;-1:-1:-1;;;;763:279:23;1595:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1595:96:23;;;;;;;;;;;;;;;;;;;;;;;1046:309;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1046:309:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:309:23;;-1:-1:-1;;1046:309:23;;;-1:-1:-1;1046:309:23;;-1:-1:-1;;;;1046:309:23;1850:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1850:121:23;;;;;;;414:345;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;414:345:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;414:345:23;;-1:-1:-1;414:345:23;;-1:-1:-1;;;;;;;414:345:23;2105:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2105:94:23;;;;2012:89;2067:29;2078:17;579:6:2;2087:7:23;2078:17;:8;:17;:::i;:::-;2067:29;;;;;;;;;;;;;;;2012:89;:::o;1359:232::-;1508:78;1531:10;1543:8;1553:19;1574:11;1508:22;:78::i;:::-;1359:232;;;;:::o;2203:134::-;2293:39;2312:7;2321:10;2293:18;:39::i;:::-;2203:134;;:::o;1695:111::-;8660:27:2;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;1695:111:23;;;:::o;763:279::-;899:28;;:::i;:::-;930:74;948:3;953:8;980:21;970:32;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;970:32:23;;;;;;;;;;;;;;;;930:10;:74::i;:::-;899:105;;1010:27;1027:3;1032:4;1010:16;:27::i;:::-;;763:279;;;;;:::o;1595:96::-;1648:7;1670:16;:14;:16::i;:::-;1663:23;;1595:96;:::o;1046:309::-;1208:28;;:::i;:::-;1239:67;1250:3;1255:8;1282:21;1272:32;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;1239:67:23;1208:98;;1312:38;1331:7;1340:3;1345:4;1312:18;:38::i;:::-;;1046:309;;;;;;:::o;1850:121::-;1931:35;1955:10;1931:23;:35::i;414:345::-;535:28;;:::i;:::-;566:74;584:3;589:8;616:21;606:32;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;566:74:23;666:6;;680:19;;;;;707:22;;;;;737:7;;;;;:11;651:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;535:105;;-1:-1:-1;651:103:23;;680:19;;707:22;;737:11;;651:103;;;;;;;;;;;;666:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;651:103:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;414:345;;;;:::o;2105:94::-;2157:7;2179:15;:13;:15::i;212:380:40:-;272:9;498:7;;494:36;;;-1:-1:-1;522:1:40;515:8;;494:36;-1:-1:-1;540:7:40;;;545:2;540;:7;560:6;;;;;;;;:12;553:20;;;;212:380;;;;:::o;3997:417:2:-;4151:35;4215:27;;;:15;:27;;;;;;;;4249:34;;;;;;4294:30;;4215:27;;;;;4231:10;;4294:30;;4151:35;4294:30;4330:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4330:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4330:79:2;;;;3997:417;;;;;:::o;4328:139:3:-;4414:48;4442:7;4451:10;4414:27;:48::i;713:257::-;850:17;;:::i;:::-;889:76;911:7;920:16;938:26;889:21;:76::i;:::-;882:83;713:257;-1:-1:-1;;;;713:257:3:o;1271:166::-;1372:7;1396:36;1417:4;1423:8;1396:20;:36::i;:::-;1389:43;1271:166;-1:-1:-1;;;1271:166:3:o;2659:113::-;2720:7;2744:23;:21;:23::i;1941:206::-;2061:17;2095:47;2118:7;2127:4;2133:8;2095:22;:47::i;3245:162::-;8660:27:2;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;3245:162:3;;:::o;2901:113::-;2961:7;2985:24;:22;:24::i;5833:171:2:-;9047:1;9008:27;;;:15;:27;;;;;;5942:10;;9008:41;:27;:41;9000:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5962:27:2;;;;:15;:27;;;;;:37;;;;;;;;;;;;;;;5833:171::o;1725:295::-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;2317:180::-;2469:6;;2422:7;;2446:46;;2469:6;;2477:4;2483:8;2446:22;:46::i;5210:110::-;5310:4;;;;5210:110;:::o;3001:476::-;3125:17;3191:4;3197:8;;3174:32;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3174:32:2;;;3164:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;;;;;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;;;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3330:60:2;3322:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;:::o;5449:113::-;5550:6;;;;5449:113;:::o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;1228:39;;:20;;;:39;1273:43;;:23;;;:43;1209:13;972:366::o;7481:527:2:-;7878:7;;7893:20;;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7628:6;7598:405;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;7628:6;7598:405;;;;;;;;;;;;;;7569:5;;7628:29;;:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7990:12;;7598:405;;;;;;;;;;7628:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7598:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7598:405:2;;;22:32:-1;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;7598:405:2;;;;179:29:-1;;;;160:49;;;-1:-1;7598:405:2;;-1:-1:-1;;;;;;;;;;7481:527:2;;;:::o;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;97:2242:23:-;;;;;;;;;-1:-1:-1;97:2242:23;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;97:2242:23;;;;;:::o"
},
"methodIdentifiers": {
"fulfillRequest(bytes32,bytes32)": "5d64e310",
"publicAddExternalRequest(address,bytes32)": "5491ec6a",
"publicCancelRequest(bytes32,uint256,bytes4,uint256)": "448d6c10",
"publicChainlinkToken()": "98bb2b2d",
"publicFulfillChainlinkRequest(bytes32,bytes32)": "ad7e401c",
"publicLINK(uint256)": "3f14df82",
"publicNewRequest(bytes32,address,bytes)": "d9a26716",
"publicOracleAddress()": "f7ea03ff",
"publicRequest(bytes32,address,bytes,uint256)": "66a4f350",
"publicRequestRunTo(address,bytes32,address,bytes,uint256)": "a1179a27"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"publicLINK\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"publicCancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_requestId\",\"type\":\"bytes32\"}],\"name\":\"publicAddExternalRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"fulfillRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_address\",\"type\":\"address\"},{\"name\":\"_fulfillmentSignature\",\"type\":\"bytes\"},{\"name\":\"_wei\",\"type\":\"uint256\"}],\"name\":\"publicRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"publicChainlinkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_address\",\"type\":\"address\"},{\"name\":\"_fulfillmentSignature\",\"type\":\"bytes\"},{\"name\":\"_wei\",\"type\":\"uint256\"}],\"name\":\"publicRequestRunTo\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"publicFulfillChainlinkRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_address\",\"type\":\"address\"},{\"name\":\"_fulfillmentSignature\",\"type\":\"bytes\"}],\"name\":\"publicNewRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"publicOracleAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"callbackAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"callbackfunctionSelector\",\"type\":\"bytes4\"},{\"indexed\":false,\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Request\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LinkAmount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/ConcreteChainlinked.sol\":\"ConcreteChainlinked\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlinked.sol\":{\"keccak256\":\"0x7ea2587ce4ad6fb965aac139bf7872baafed08c48cb6d2e3cb1c4139b535c73a\",\"urls\":[\"bzzr://bf058b58fa620e0c3d5d9286728a5233ab43dbd7838dd786e7aec9899e848f37\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/ConcreteChainlinked.sol\":{\"keccak256\":\"0xe6d733162f0322fcbc9f3fa8f1a0d8a20194296683e018c1fdef20638a6b8fde\",\"urls\":[\"bzzr://61ff19cbbacf0d3ece2834e12d59f322491eae4c478c1570548e26eba86f8818\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074\",\"urls\":[\"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/ConcreteChainlinked.sol": {
"id": 23
},
"Chainlinked.sol": {
"id": 3
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
},
"vendor/SafeMathChainlink.sol": {
"id": 40
}
},
"sourceCodes": {
"tests/ConcreteChainlinked.sol": "pragma solidity 0.4.24;\n\nimport \"../Chainlinked.sol\";\nimport \"../vendor/SafeMathChainlink.sol\";\n\ncontract ConcreteChainlinked is Chainlinked {\n using SafeMathChainlink for uint256;\n\n constructor(address _link, address _oracle) public {\n setLinkToken(_link);\n setOracle(_oracle);\n }\n\n event Request(\n bytes32 id,\n address callbackAddress,\n bytes4 callbackfunctionSelector,\n bytes data\n );\n\n function publicNewRequest(\n bytes32 _id,\n address _address,\n bytes _fulfillmentSignature\n )\n public\n {\n Chainlink.Request memory req = newRequest(\n _id, _address, bytes4(keccak256(_fulfillmentSignature)));\n emit Request(\n req.id,\n req.callbackAddress,\n req.callbackFunctionId,\n req.buf.buf\n );\n }\n\n function publicRequest(\n bytes32 _id,\n address _address,\n bytes _fulfillmentSignature,\n uint256 _wei\n )\n public\n {\n Chainlink.Request memory req = newRequest(\n _id, _address, bytes4(keccak256(_fulfillmentSignature)));\n chainlinkRequest(req, _wei);\n }\n\n function publicRequestRunTo(\n address _oracle,\n bytes32 _id,\n address _address,\n bytes _fulfillmentSignature,\n uint256 _wei\n )\n public\n {\n Chainlink.Request memory run = newRequest(_id, _address, bytes4(keccak256(_fulfillmentSignature)));\n chainlinkRequestTo(_oracle, run, _wei);\n }\n\n function publicCancelRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function publicChainlinkToken() public view returns (address) {\n return chainlinkToken();\n }\n\n function fulfillRequest(bytes32 _requestId, bytes32)\n public\n recordChainlinkFulfillment(_requestId)\n {} // solhint-disable-line no-empty-blocks\n\n function publicFulfillChainlinkRequest(bytes32 _requestId, bytes32) public {\n fulfillChainlinkRequest(_requestId);\n }\n\n event LinkAmount(uint256 amount);\n\n function publicLINK(uint256 _amount) public {\n emit LinkAmount(LINK.mul(_amount));\n }\n\n function publicOracleAddress() public view returns (address) {\n return oracleAddress();\n }\n\n function publicAddExternalRequest(address _oracle, bytes32 _requestId)\n public\n {\n addExternalRequest(_oracle, _requestId);\n }\n}\n",
"Chainlinked.sol": "pragma solidity ^0.4.24;\n\nimport \"./ChainlinkClient.sol\";\n\n/**\n * @title The Chainlinked contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network. ChainlinkClient is an alias of the Chainlinked contract.\n */\ncontract Chainlinked is ChainlinkClient {\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function newRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n return buildChainlinkRequest(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `sendChainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function chainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequest(_req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function chainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n return sendChainlinkRequestTo(_oracle, _req, _payment);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setOracle(address _oracle) internal {\n setChainlinkOracle(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setLinkToken(address _link) internal {\n setChainlinkToken(_link);\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkToken()\n internal\n view\n returns (address)\n {\n return chainlinkTokenAddress();\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function oracleAddress()\n internal\n view\n returns (address)\n {\n return chainlinkOracleAddress();\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function fulfillChainlinkRequest(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function setChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n useChainlinkWithENS(_ens, _node);\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `setChainlinkWithENS` has been called previously\n */\n function setOracleWithENS()\n internal\n {\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addExternalRequest(address _oracle, bytes32 _requestId)\n internal\n {\n addChainlinkExternalRequest(_oracle, _requestId);\n }\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMathChainlink {\n\n /**\n * @dev Multiplies two numbers, throws on overflow.\n */\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (_a == 0) {\n return 0;\n }\n\n c = _a * _b;\n assert(c / _a == _b);\n return c;\n }\n\n /**\n * @dev Integer division of two numbers, truncating the quotient.\n */\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\n // uint256 c = _a / _b;\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n return _a / _b;\n }\n\n /**\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n assert(_b <= _a);\n return _a - _b;\n }\n\n /**\n * @dev Adds two numbers, throws on overflow.\n */\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n c = _a + _b;\n assert(c >= _a);\n return c;\n }\n}\n"
},
"sourceTreeHashHex": "0xda8b514faa37827a65ecef6ed0d24847b6ddab610210e09b132fda4c133ed3a6",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Consumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawLink",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": true,
"name": "price",
"type": "bytes32"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b50611216806100256000396000f30060806040526004361061006c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100715780636c0cae681461008e5780638dc654a2146100e75780639d1b464a146100fc578063ec65d0f814610123575b600080fd5b34801561007d57600080fd5b5061008c600435602435610166565b005b34801561009a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261008c9436949293602493928401919081908401838280828437509497506102af9650505050505050565b3480156100f357600080fd5b5061008c610462565b34801561010857600080fd5b50610111610622565b60408051918252519081900360200190f35b34801561012f57600080fd5b5061008c6004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610628565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b6102b761119d565b60606102e96006543063042f2b657c010000000000000000000000000000000000000000000000000000000002610634565b91506103b76040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a5059000000000000000000000000000000000000000000000000008152508461065f9092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816103cc579050509050828160008151811015156103f357fe5b9060200190602002018190525061044a6040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461068e9092919063ffffffff16565b61045c82670de0b6b3a7640000610701565b50505050565b600061046c610731565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b1580156104e757600080fd5b505af11580156104fb573d6000803e3d6000fd5b505050506040513d602081101561051157600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d60208110156105b057600080fd5b5051151561061f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b61045c8484848461074d565b61063c61119d565b61064461119d565b6106568186868663ffffffff61088816565b95945050505050565b6080830151610674908363ffffffff6108ea16565b6080830151610689908263ffffffff6108ea16565b505050565b60808301516000906106a6908463ffffffff6108ea16565b6106b38460800151610907565b5060005b81518110156106f4576106ec82828151811015156106d157fe5b6020908102909101015160808601519063ffffffff6108ea16565b6001016106b7565b61045c8460800151610912565b6003546000906107289073ffffffffffffffffffffffffffffffffffffffff16848461091d565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050565b61089061119d565b6108a08560800151610100610c7f565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6108f78260038351610cb9565b610689828263ffffffff610db616565b61061f816004610dd0565b61061f816007610dd0565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106109d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610994565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610ac287610de9565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d6020811015610bda57600080fd5b50511515610c6f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610c876111d2565b6020820615610c9c5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610cdb57610cd58360ff848116602002168317610f9b565b50610689565b60ff8111610d0f57610cfc836018602060ff8616021763ffffffff610f9b16565b50610cd58382600163ffffffff610fb316565b61ffff8111610d4457610d31836019602060ff8616021763ffffffff610f9b16565b50610cd58382600263ffffffff610fb316565b63ffffffff8111610d7b57610d6883601a602060ff8616021763ffffffff610f9b16565b50610cd58382600463ffffffff610fb316565b67ffffffffffffffff811161068957610da383601b602060ff8616021763ffffffff610f9b16565b5061045c8382600863ffffffff610fb316565b610dbe6111d2565b61072883846000015151848551610fd4565b61068982601f602060ff8516021763ffffffff610f9b16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610ede578181015183820152602001610ec6565b50505050905090810190601f168015610f0b5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610fa36111d2565b61072883846000015151846110c6565b610fbb6111d2565b610fcc848560000151518585611111565b949350505050565b610fdc6111d2565b600080600085518511151515610ff157600080fd5b8760200151858801111561101b5761101b886110138a602001518a890161116f565b600202611186565b8751805188602083010194508089880111156110375788870182525b60208801935050505b6020851061108057815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611040565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6110ce6111d2565b602084015183106110ea576110ea848560200151600202611186565b8351805160208583010184815381861415611106576001820183525b509495945050505050565b6111196111d2565b6000856020015185840111156111385761113886868501600202611186565b6001836101000a03905085518386820101858319825116178152815185880111156111635784870182525b50959695505050505050565b60008183111561118057508161072b565b50919050565b81516111928383610c7f565b5061045c8382610db6565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016111cd6111d2565b905290565b604080518082019091526060815260006020820152905600a165627a7a72305820e6d166ca79961c12bec55565457ce2f3d083d48f63ec5bae1724d636197845200029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1216 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0xFC JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x166 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x8C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2AF SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH2 0x462 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x111 PUSH2 0x622 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x628 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x220 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x2B7 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2E9 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x634 JUMP JUMPDEST SWAP2 POP PUSH2 0x3B7 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3CC JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x44A PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x68E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x45C DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x701 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46C PUSH2 0x731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x61F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x45C DUP5 DUP5 DUP5 DUP5 PUSH2 0x74D JUMP JUMPDEST PUSH2 0x63C PUSH2 0x119D JUMP JUMPDEST PUSH2 0x644 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x656 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x888 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x674 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x689 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH2 0x6B3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x907 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6F4 JUMPI PUSH2 0x6EC DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x6B7 JUMP JUMPDEST PUSH2 0x45C DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x912 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x728 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x91D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x87D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x890 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x8A0 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC7F JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x8F7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x689 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xDB6 AND JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x4 PUSH2 0xDD0 JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x7 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9D1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x994 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xAC2 DUP8 PUSH2 0xDE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xC6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC87 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xC9C JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCDB JUMPI PUSH2 0xCD5 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xF9B JUMP JUMPDEST POP PUSH2 0x689 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD0F JUMPI PUSH2 0xCFC DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD44 JUMPI PUSH2 0xD31 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD7B JUMPI PUSH2 0xD68 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x689 JUMPI PUSH2 0xDA3 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xDBE PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xFD4 JUMP JUMPDEST PUSH2 0x689 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEDE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEC6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA3 PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0xFCC DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1111 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFDC PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0xFF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x101B JUMPI PUSH2 0x101B DUP9 PUSH2 0x1013 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x116F JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1037 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1080 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1040 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x10CE PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x10EA JUMPI PUSH2 0x10EA DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1106 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1119 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1138 JUMPI PUSH2 0x1138 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1163 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1180 JUMPI POP DUP2 PUSH2 0x72B JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1192 DUP4 DUP4 PUSH2 0xC7F JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH2 0xDB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x11CD PUSH2 0x11D2 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xe6 0xd1 PUSH7 0xCA79961C12BEC5 SSTORE PUSH6 0x457CE2F3D083 0xd4 DUP16 PUSH4 0xEC5BAE17 0x24 0xd6 CALLDATASIZE NOT PUSH25 0x45200029000000000000000000000000000000000000000000 ",
"sourceMap": "59:1301:24:-;;;1121:1:2;1094:28;;59:1301:24;8:9:-1;5:2;;;30:1;27;20:12;5:2;59:1301:24;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061006c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100715780636c0cae681461008e5780638dc654a2146100e75780639d1b464a146100fc578063ec65d0f814610123575b600080fd5b34801561007d57600080fd5b5061008c600435602435610166565b005b34801561009a57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261008c9436949293602493928401919081908401838280828437509497506102af9650505050505050565b3480156100f357600080fd5b5061008c610462565b34801561010857600080fd5b50610111610622565b60408051918252519081900360200190f35b34801561012f57600080fd5b5061008c6004356024357fffffffff0000000000000000000000000000000000000000000000000000000060443516606435610628565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b6102b761119d565b60606102e96006543063042f2b657c010000000000000000000000000000000000000000000000000000000002610634565b91506103b76040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a5059000000000000000000000000000000000000000000000000008152508461065f9092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816103cc579050509050828160008151811015156103f357fe5b9060200190602002018190525061044a6040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461068e9092919063ffffffff16565b61045c82670de0b6b3a7640000610701565b50505050565b600061046c610731565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b1580156104e757600080fd5b505af11580156104fb573d6000803e3d6000fd5b505050506040513d602081101561051157600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d60208110156105b057600080fd5b5051151561061f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b61045c8484848461074d565b61063c61119d565b61064461119d565b6106568186868663ffffffff61088816565b95945050505050565b6080830151610674908363ffffffff6108ea16565b6080830151610689908263ffffffff6108ea16565b505050565b60808301516000906106a6908463ffffffff6108ea16565b6106b38460800151610907565b5060005b81518110156106f4576106ec82828151811015156106d157fe5b6020908102909101015160808601519063ffffffff6108ea16565b6001016106b7565b61045c8460800151610912565b6003546000906107289073ffffffffffffffffffffffffffffffffffffffff16848461091d565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050565b61089061119d565b6108a08560800151610100610c7f565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6108f78260038351610cb9565b610689828263ffffffff610db616565b61061f816004610dd0565b61061f816007610dd0565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106109d157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610994565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610ac287610de9565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d6020811015610bda57600080fd5b50511515610c6f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610c876111d2565b6020820615610c9c5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610cdb57610cd58360ff848116602002168317610f9b565b50610689565b60ff8111610d0f57610cfc836018602060ff8616021763ffffffff610f9b16565b50610cd58382600163ffffffff610fb316565b61ffff8111610d4457610d31836019602060ff8616021763ffffffff610f9b16565b50610cd58382600263ffffffff610fb316565b63ffffffff8111610d7b57610d6883601a602060ff8616021763ffffffff610f9b16565b50610cd58382600463ffffffff610fb316565b67ffffffffffffffff811161068957610da383601b602060ff8616021763ffffffff610f9b16565b5061045c8382600863ffffffff610fb316565b610dbe6111d2565b61072883846000015151848551610fd4565b61068982601f602060ff8516021763ffffffff610f9b16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610ede578181015183820152602001610ec6565b50505050905090810190601f168015610f0b5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610fa36111d2565b61072883846000015151846110c6565b610fbb6111d2565b610fcc848560000151518585611111565b949350505050565b610fdc6111d2565b600080600085518511151515610ff157600080fd5b8760200151858801111561101b5761101b886110138a602001518a890161116f565b600202611186565b8751805188602083010194508089880111156110375788870182525b60208801935050505b6020851061108057815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611040565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b6110ce6111d2565b602084015183106110ea576110ea848560200151600202611186565b8351805160208583010184815381861415611106576001820183525b509495945050505050565b6111196111d2565b6000856020015185840111156111385761113886868501600202611186565b6001836101000a03905085518386820101858319825116178152815185880111156111635784870182525b50959695505050505050565b60008183111561118057508161072b565b50919050565b81516111928383610c7f565b5061045c8382610db6565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016111cd6111d2565b905290565b604080518082019091526060815260006020820152905600a165627a7a72305820e6d166ca79961c12bec55565457ce2f3d083d48f63ec5bae1724d636197845200029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xE7 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0xFC JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x123 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x166 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x8C SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2AF SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH2 0x462 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x111 PUSH2 0x622 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x628 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x220 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x2B7 PUSH2 0x119D JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2E9 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x634 JUMP JUMPDEST SWAP2 POP PUSH2 0x3B7 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x3CC JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x44A PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x68E SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x45C DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x701 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46C PUSH2 0x731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x61F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x45C DUP5 DUP5 DUP5 DUP5 PUSH2 0x74D JUMP JUMPDEST PUSH2 0x63C PUSH2 0x119D JUMP JUMPDEST PUSH2 0x644 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x656 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x888 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x674 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x689 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH2 0x6B3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x907 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6F4 JUMPI PUSH2 0x6EC DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x8EA AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x6B7 JUMP JUMPDEST PUSH2 0x45C DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x912 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x728 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x91D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x87D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x890 PUSH2 0x119D JUMP JUMPDEST PUSH2 0x8A0 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC7F JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x8F7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x689 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xDB6 AND JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x4 PUSH2 0xDD0 JUMP JUMPDEST PUSH2 0x61F DUP2 PUSH1 0x7 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9D1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x994 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xAC2 DUP8 PUSH2 0xDE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xC6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC87 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xC9C JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCDB JUMPI PUSH2 0xCD5 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xF9B JUMP JUMPDEST POP PUSH2 0x689 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD0F JUMPI PUSH2 0xCFC DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD44 JUMPI PUSH2 0xD31 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD7B JUMPI PUSH2 0xD68 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0xCD5 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x689 JUMPI PUSH2 0xDA3 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xFB3 AND JUMP JUMPDEST PUSH2 0xDBE PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xFD4 JUMP JUMPDEST PUSH2 0x689 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xF9B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEDE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEC6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP 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 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA3 PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0x728 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x11D2 JUMP JUMPDEST PUSH2 0xFCC DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1111 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFDC PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0xFF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x101B JUMPI PUSH2 0x101B DUP9 PUSH2 0x1013 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x116F JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1037 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1080 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1040 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x10CE PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x10EA JUMPI PUSH2 0x10EA DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1106 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1119 PUSH2 0x11D2 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1138 JUMPI PUSH2 0x1138 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1186 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1163 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1180 JUMPI POP DUP2 PUSH2 0x72B JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1192 DUP4 DUP4 PUSH2 0xC7F JUMP JUMPDEST POP PUSH2 0x45C DUP4 DUP3 PUSH2 0xDB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x11CD PUSH2 0x11D2 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xe6 0xd1 PUSH7 0xCA79961C12BEC5 SSTORE PUSH6 0x457CE2F3D083 0xd4 DUP16 PUSH4 0xEC5BAE17 0x24 0xd6 CALLDATASIZE NOT PUSH25 0x45200029000000000000000000000000000000000000000000 ",
"sourceMap": "59:1301:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1169:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1169:188:24;;;;;;;;;323:404;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;323:404:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;323:404:24;;-1:-1:-1;323:404:24;;-1:-1:-1;;;;;;;323:404:24;961:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;961:204:24;;;;127:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:27:24;;;;;;;;;;;;;;;;;;;;731:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;731:226:24;;;;;;;;;;;;;1169:188;8660:27:2;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;1289:36:24;;1318:6;;1306:10;;1289:36;;;;;-1:-1:-1;1331:12:24;:21;-1:-1:-1;1169:188:24:o;323:404::-;384:28;;:::i;:::-;574:20;415:58;437:6;;445:4;451:21;;;415;:58::i;:::-;384:89;;479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;597:15;;;610:1;597:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;574:38;;628:9;618:4;623:1;618:7;;;;;;;;;;;;;;;;;:19;;;;643:32;;;;;;;;;;;;;;;;;;;670:4;643:3;:18;;:32;;;;;:::i;:::-;681:41;702:3;579:6:2;681:20:24;:41::i;:::-;;323:404;;;:::o;961:204::-;998:23;1043;:21;:23::i;:::-;1107:29;;;;;;1130:4;1107:29;;;;;;998:69;;-1:-1:-1;1081:13:24;;;;;;1095:10;;1081:13;;1107:14;;:29;;;;;;;;;;;;;;-1:-1:-1;1081:13:24;1107:29;;;5:2:-1;;;;30:1;27;20:12;5:2;1107:29:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1107:29:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1107:29:24;1081:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:29;;1081:56;;;;;;;-1:-1:-1;1081:56:24;;;;5:2:-1;;;;30:1;27;20:12;5:2;1081:56:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1081:56:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1081:56:24;1073:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;961:204;:::o;127:27::-;;;;:::o;731:226::-;874:78;897:10;909:8;919:19;940:11;874:22;:78::i;1725:295:2:-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;1958:155:1:-;2046:8;;;;:27;;2068:4;2046:27;:21;:27;:::i;:::-;2079:8;;;;:29;;2101:6;2079:29;:21;:29;:::i;:::-;1958:155;;;:::o;3428:294::-;3537:8;;;;3602:9;;3537:27;;3559:4;3537:27;:21;:27;:::i;:::-;3570:21;:4;:8;;;:19;:21::i;:::-;-1:-1:-1;3614:1:1;3597:93;3621:7;:14;3617:1;:18;3597:93;;;3650:33;3672:7;3680:1;3672:10;;;;;;;;;;;;;;;;;;;3650:8;;;;;:33;:21;:33;:::i;:::-;3637:3;;3597:93;;;3695:22;:4;:8;;;:20;:22::i;2317:180:2:-;2469:6;;2422:7;;2446:46;;2469:6;;2477:4;2483:8;2446:22;:46::i;:::-;2439:53;;2317:180;;;;;:::o;5210:110::-;5310:4;;;;5210:110;:::o;3997:417::-;4151:35;4215:27;;;:15;:27;;;;;;;;4249:34;;;;;;4294:30;;4215:27;;;;;4231:10;;4294:30;;4151:35;4294:30;4330:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4330:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4330:79:2;;;;3997:417;;;;;:::o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;1228:39;;:20;;;:39;1273:43;;:23;;;:43;1209:13;972:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;3001:476:2:-;3125:17;3191:4;3197:8;;3174:32;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3174:32:2;;;3164:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;;;;;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;;;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3330:60:2;3322:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;:::o;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;4496:155:33:-;4573:6;;:::i;:::-;4601:45;4607:3;4612;:7;;;:14;4628:4;4634;:11;4601:5;:45::i;1439:155:34:-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;7481:527:2:-;7878:7;;7893:20;;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7628:6;7598:405;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;7628:6;7598:405;;;;;;;;;;;;;;7569:5;;7628:29;;:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7990:12;;7598:405;;;;;;;;;;7628:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7598:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7598:405:2;;;22:32:-1;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;7598:405:2;;;;179:29:-1;;;;160:49;;;-1:-1;7598:405:2;;-1:-1:-1;;;;;;;;;;7481:527:2;;;:::o;5811:144:33:-;5885:6;;:::i;:::-;5913:37;5924:3;5929;:7;;;:14;5945:4;5913:10;:37::i;9497:154::-;9578:6;;:::i;:::-;9606:40;9615:3;9620;:7;;;:14;9636:4;9642:3;9606:8;:40::i;:::-;9599:47;9497:154;-1:-1:-1;;;;9497:154:33:o;2651:1140::-;2746:6;;:::i;:::-;2897:9;2912:8;3580:9;2782:4;:11;2775:3;:18;;2767:27;;;;;;;;2817:3;:12;;;2811:3;2805;:9;:24;2801:90;;;2839:45;2846:3;2851:28;2855:3;:12;;;2875:3;2869;:9;2851:3;:28::i;:::-;2882:1;2851:32;2839:6;:45::i;:::-;3006:3;3000:10;3077:6;3071:13;3193:3;3188:2;3180:6;3176:15;3172:25;3164:33;;3277:6;3271:3;3266;3262:13;3259:25;3256:2;;;3319:3;3314;3310:13;3302:6;3295:29;3256:2;3356;3350:4;3346:13;3339:20;;2935:430;;3417:129;3431:2;3424:9;;3417:129;;3486:10;;3473:24;;3435:9;;;;;3520:2;3512:10;;;;3530:9;;;;3417:129;;;-1:-1:-1;3655:10:33;3704:11;;3600:2;:8;;;;3592:3;:17;:21;;3667:9;;3651:26;;;3700:22;;3742:21;;;;3729:35;;;-1:-1:-1;3783:3:33;;;-1:-1:-1;;2651:1140:33:o;4945:619::-;5028:6;;:::i;:::-;5060:12;;;;5053:19;;5049:69;;5082:29;5089:3;5094;:12;;;5109:1;5094:16;5082:6;:29::i;:::-;5204:3;5198:10;5275:6;5269:13;5387:2;5381:3;5373:6;5369:16;5365:25;5411:4;5405;5397:19;5482:6;5477:3;5474:15;5471:2;;;5527:1;5519:6;5515:14;5507:6;5500:30;5471:2;-1:-1:-1;5556:3:33;;4945:619;-1:-1:-1;;;;;4945:619:33:o;8610:642::-;8699:6;;:::i;:::-;8799:9;8736:3;:12;;;8730:3;8724;:9;:24;8720:73;;;8758:28;8765:3;8777;8771;:9;8784:1;8770:15;8758:6;:28::i;:::-;8824:1;8818:3;8811;:10;:14;8799:26;;8911:3;8905:10;9026:3;9020;9012:6;9008:16;9004:26;9082:4;9074;9070:9;9063:4;9057:11;9053:27;9050:37;9044:4;9037:51;9170:6;9164:13;9158:3;9153;9149:13;9146:32;9143:2;;;9213:3;9208;9204:13;9196:6;9189:29;9143:2;-1:-1:-1;9244:3:33;;8610:642;-1:-1:-1;;;;;;8610:642:33:o;1889:114::-;1939:4;1959:1;1955;:5;1951:34;;;-1:-1:-1;1977:1:33;1970:8;;1951:34;-1:-1:-1;1997:1:33;1889:114;-1:-1:-1;1889:114:33:o;1732:153::-;1823:7;;1836:19;1823:3;1846:8;1836:4;:19::i;:::-;;1861;1868:3;1873:6;1861;:19::i;59:1301:24:-;;;;;;;;;-1:-1:-1;59:1301:24;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;59:1301:24;;;;;:::o"
},
"methodIdentifiers": {
"cancelRequest(bytes32,uint256,bytes4,uint256)": "ec65d0f8",
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"requestEthereumPrice(string)": "6c0cae68",
"withdrawLink()": "8dc654a2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawLink\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"RequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/Consumer.sol\":\"Consumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/Consumer.sol\":{\"keccak256\":\"0xbfa7e56235f6b488d92d3d5441048331cc6d1cbd83518eb07a0805e7a62f4449\",\"urls\":[\"bzzr://05c399b169c9aebb647d546fff910e4452d13d54080ee031f6ca442302c8ef6e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/Consumer.sol": {
"id": 24
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/Consumer.sol": "pragma solidity 0.4.24;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract Consumer is ChainlinkClient {\n bytes32 internal specId;\n bytes32 public currentPrice;\n\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n\n event RequestFulfilled(\n bytes32 indexed requestId, // User-defined ID\n bytes32 indexed price\n );\n\n function requestEthereumPrice(string _currency) public {\n Chainlink.Request memory req = buildChainlinkRequest(specId, this, this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n string[] memory path = new string[](1);\n path[0] = _currency;\n req.addStringArray(\"path\", path);\n sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function cancelRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function withdrawLink() public {\n LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());\n require(link.transfer(msg.sender, link.balanceOf(address(this))), \"Unable to transfer\");\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n emit RequestFulfilled(_requestId, _price);\n currentPrice = _price;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x2629cabe1c3bbbc47b1c6b9eb4e5bd9fc39056fcf06aa965efc308281f87f741",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENS",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "resolver",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "label",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setSubnodeOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "ttl",
"type": "uint64"
}
],
"name": "setTTL",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "ttl",
"outputs": [
{
"name": "",
"type": "uint64"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "resolver",
"type": "address"
}
],
"name": "setResolver",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": true,
"name": "label",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "NewOwner",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "resolver",
"type": "address"
}
],
"name": "NewResolver",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "ttl",
"type": "uint64"
}
],
"name": "NewTTL",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"owner(bytes32)": "02571be3",
"resolver(bytes32)": "0178b8bf",
"setOwner(bytes32,address)": "5b0fc9c3",
"setResolver(bytes32,address)": "1896f70a",
"setSubnodeOwner(bytes32,bytes32,address)": "06ab5923",
"setTTL(bytes32,uint64)": "14ab9038",
"ttl(bytes32)": "16a25cbd"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/ENS.sol": {
"id": 35
}
},
"sourceCodes": {
"vendor/ENS.sol": "pragma solidity ^0.4.24;\n\ninterface ENS {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public;\n function setResolver(bytes32 node, address resolver) public;\n function setOwner(bytes32 node, address owner) public;\n function setTTL(bytes32 node, uint64 ttl) public;\n function owner(bytes32 node) public view returns (address);\n function resolver(bytes32 node) public view returns (address);\n function ttl(bytes32 node) public view returns (uint64);\n\n}\n"
},
"sourceTreeHashHex": "0xcc83b20d8d1b27c26281cef49d7dd8543534b07b2107603f32778be9be04d6e1",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENSInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "resolver",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "label",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setSubnodeOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "ttl",
"type": "uint64"
}
],
"name": "setTTL",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "ttl",
"outputs": [
{
"name": "",
"type": "uint64"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "resolver",
"type": "address"
}
],
"name": "setResolver",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": true,
"name": "label",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "NewOwner",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "resolver",
"type": "address"
}
],
"name": "NewResolver",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "ttl",
"type": "uint64"
}
],
"name": "NewTTL",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"owner(bytes32)": "02571be3",
"resolver(bytes32)": "0178b8bf",
"setOwner(bytes32,address)": "5b0fc9c3",
"setResolver(bytes32,address)": "1896f70a",
"setSubnodeOwner(bytes32,bytes32,address)": "06ab5923",
"setTTL(bytes32,uint64)": "14ab9038",
"ttl(bytes32)": "16a25cbd"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/ENSInterface.sol": {
"id": 12
}
},
"sourceCodes": {
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n"
},
"sourceTreeHashHex": "0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENSRegistry",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "resolver",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "label",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setSubnodeOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "ttl",
"type": "uint64"
}
],
"name": "setTTL",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "ttl",
"outputs": [
{
"name": "",
"type": "uint64"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "resolver",
"type": "address"
}
],
"name": "setResolver",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "owner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": true,
"name": "label",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "NewOwner",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "resolver",
"type": "address"
}
],
"name": "NewResolver",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "ttl",
"type": "uint64"
}
],
"name": "NewTTL",
"type": "event"
}
],
"devdoc": {
"methods": {
"owner(bytes32)": {
"details": "Returns the address that owns the specified node.",
"params": {
"node": "The specified node."
},
"return": "address of the owner."
},
"resolver(bytes32)": {
"details": "Returns the address of the resolver for the specified node.",
"params": {
"node": "The specified node."
},
"return": "address of the resolver."
},
"setOwner(bytes32,address)": {
"details": "Transfers ownership of a node to a new address. May only be called by the current owner of the node.",
"params": {
"node": "The node to transfer ownership of.",
"owner": "The address of the new owner."
}
},
"setResolver(bytes32,address)": {
"details": "Sets the resolver address for the specified node.",
"params": {
"node": "The node to update.",
"resolver": "The address of the resolver."
}
},
"setSubnodeOwner(bytes32,bytes32,address)": {
"details": "Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.",
"params": {
"label": "The hash of the label specifying the subnode.",
"node": "The parent node.",
"owner": "The address of the new owner."
}
},
"setTTL(bytes32,uint64)": {
"details": "Sets the TTL for the specified node.",
"params": {
"node": "The node to update.",
"ttl": "The TTL in seconds."
}
},
"ttl(bytes32)": {
"details": "Returns the TTL of a node, and any records associated with it.",
"params": {
"node": "The specified node."
},
"return": "ttl of the node."
}
}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b5060008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a0319163317905561068f806100596000396000f3006080604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100c857806306ab5923146100e057806314ab90381461011657806316a25cbd1461013b5780631896f70a146101705780635b0fc9c3146101a1575b600080fd5b34801561009357600080fd5b5061009f6004356101d2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100d457600080fd5b5061009f6004356101fd565b3480156100ec57600080fd5b5061011460043560243573ffffffffffffffffffffffffffffffffffffffff60443516610225565b005b34801561012257600080fd5b5061011460043567ffffffffffffffff602435166103af565b34801561014757600080fd5b50610153600435610485565b6040805167ffffffffffffffff9092168252519081900360200190f35b34801561017c57600080fd5b5061011460043573ffffffffffffffffffffffffffffffffffffffff602435166104bc565b3480156101ad57600080fd5b5061011460043573ffffffffffffffffffffffffffffffffffffffff60243516610591565b60009081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600083815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff16331461025757600080fd5b604080516020808201889052818301879052825180830384018152606090920192839052815191929182918401908083835b602083106102c657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610289565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822073ffffffffffffffffffffffffffffffffffffffff8a16835293519397508995508a94507fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829391829003019150a350600090815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555050565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103e157600080fd5b6040805167ffffffffffffffff84168152905184917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68919081900360200190a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146104ee57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff84168152905184917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0919081900360200190a25060009182526020829052604090912060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146105c357600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff84168152905184917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266919081900360200190a25060009182526020829052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790555600a165627a7a72305820d10e40d85873d955ede21f3f13bb0d6040bdbce4716420b68eb367b5b23fde0b0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 DUP1 MSTORE PUSH1 0x20 MSTORE PUSH32 0xAD3228B676F7D3CD4284A5443F17F1962B36E491B30A40B2405849E597BA5FB5 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x68F DUP1 PUSH2 0x59 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x178B8BF DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x2571BE3 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x6AB5923 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x14AB9038 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x16A25CBD EQ PUSH2 0x13B JUMPI DUP1 PUSH4 0x1896F70A EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x5B0FC9C3 EQ PUSH2 0x1A1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F PUSH1 0x4 CALLDATALOAD PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F PUSH1 0x4 CALLDATALOAD PUSH2 0x1FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD AND PUSH2 0x225 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x3AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x153 PUSH1 0x4 CALLDATALOAD PUSH2 0x485 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x4BC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x591 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2C6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x289 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND DUP4 MSTORE SWAP4 MLOAD SWAP4 SWAP8 POP DUP10 SWAP6 POP DUP11 SWAP5 POP PUSH32 0xCE0457FE73731F824CC272376169235128C118B49D344817417C6D108D155E82 SWAP4 SWAP2 DUP3 SWAP1 SUB ADD SWAP2 POP LOG3 POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0x1D4F9BBFC9CAB89D66E1A1562F2233CCBF1308CB4F63DE2EAD5787ADDDB8FA68 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0x335721B01866DC23FBEE8B6B2C7B1E14D6F05C28CD35A2C934239F94095602A0 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0xD4735D920B0F87494915F556DD9B54C8F309026070CAEA5C737245152564D266 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd1 0xe BLOCKHASH 0xd8 PC PUSH20 0xD955EDE21F3F13BB0D6040BDBCE4716420B68EB3 PUSH8 0xB5B23FDE0B002900 ",
"sourceMap": "85:2681:36:-;;;457:63;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;484:7:36;:12;;;;;;:31;;-1:-1:-1;;;;;;484:31:36;505:10;484:31;;;85:2681;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100c857806306ab5923146100e057806314ab90381461011657806316a25cbd1461013b5780631896f70a146101705780635b0fc9c3146101a1575b600080fd5b34801561009357600080fd5b5061009f6004356101d2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100d457600080fd5b5061009f6004356101fd565b3480156100ec57600080fd5b5061011460043560243573ffffffffffffffffffffffffffffffffffffffff60443516610225565b005b34801561012257600080fd5b5061011460043567ffffffffffffffff602435166103af565b34801561014757600080fd5b50610153600435610485565b6040805167ffffffffffffffff9092168252519081900360200190f35b34801561017c57600080fd5b5061011460043573ffffffffffffffffffffffffffffffffffffffff602435166104bc565b3480156101ad57600080fd5b5061011460043573ffffffffffffffffffffffffffffffffffffffff60243516610591565b60009081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600083815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff16331461025757600080fd5b604080516020808201889052818301879052825180830384018152606090920192839052815191929182918401908083835b602083106102c657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610289565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822073ffffffffffffffffffffffffffffffffffffffff8a16835293519397508995508a94507fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829391829003019150a350600090815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555050565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103e157600080fd5b6040805167ffffffffffffffff84168152905184917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68919081900360200190a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146104ee57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff84168152905184917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0919081900360200190a25060009182526020829052604090912060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146105c357600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff84168152905184917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266919081900360200190a25060009182526020829052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790555600a165627a7a72305820d10e40d85873d955ede21f3f13bb0d6040bdbce4716420b68eb367b5b23fde0b0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x178B8BF DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x2571BE3 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x6AB5923 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x14AB9038 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x16A25CBD EQ PUSH2 0x13B JUMPI DUP1 PUSH4 0x1896F70A EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x5B0FC9C3 EQ PUSH2 0x1A1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F PUSH1 0x4 CALLDATALOAD PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F PUSH1 0x4 CALLDATALOAD PUSH2 0x1FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x44 CALLDATALOAD AND PUSH2 0x225 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x3AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x153 PUSH1 0x4 CALLDATALOAD PUSH2 0x485 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x4BC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x591 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP9 SWAP1 MSTORE DUP2 DUP4 ADD DUP8 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2C6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x289 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND DUP4 MSTORE SWAP4 MLOAD SWAP4 SWAP8 POP DUP10 SWAP6 POP DUP11 SWAP5 POP PUSH32 0xCE0457FE73731F824CC272376169235128C118B49D344817417C6D108D155E82 SWAP4 SWAP2 DUP3 SWAP1 SUB ADD SWAP2 POP LOG3 POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0x1D4F9BBFC9CAB89D66E1A1562F2233CCBF1308CB4F63DE2EAD5787ADDDB8FA68 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0x335721B01866DC23FBEE8B6B2C7B1E14D6F05C28CD35A2C934239F94095602A0 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP2 MSTORE SWAP1 MLOAD DUP5 SWAP2 PUSH32 0xD4735D920B0F87494915F556DD9B54C8F309026070CAEA5C737245152564D266 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd1 0xe BLOCKHASH 0xd8 PC PUSH20 0xD955EDE21F3F13BB0D6040BDBCE4716420B68EB3 PUSH8 0xB5B23FDE0B002900 ",
"sourceMap": "85:2681:36:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2414:102:36;;;;;;;;;;;;;;;;;;;;;;;;2157:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2157:96:36;;;;;1186:237;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1186:237:36;;;;;;;;;;;;;1881:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1881:128:36;;;;;;;;;2672:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2672:91:36;;;;;;;;;;;;;;;;;;;;;;;;1586:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1586:159:36;;;;;;;;;747:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;747:141:36;;;;;;;;;2414:102;2467:7;2489:13;;;;;;;;;;:22;;;;;;2414:102::o;2157:96::-;2207:7;2229:13;;;;;;;;;;:19;;;;2157:96::o;1186:237::-;1285:15;353:13;;;;;;;;;;:19;1273:4;;353:33;:19;376:10;353:33;345:42;;;;;;1313:29;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1313:29:36;;;;;;;;1303:40;;1313:29;;;;;1303:40;;;;1313:29;1303:40;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1303:40:36;;;;;;;;;;;;1354:28;;;;;;;1303:40;;-1:-1:-1;1369:5:36;;-1:-1:-1;1363:4:36;;-1:-1:-1;1354:28:36;;;;;;;;-1:-1:-1;1354:28:36;-1:-1:-1;1388:7:36;:16;;;;;;;;;;:30;;;;;;;;;;;;;;;-1:-1:-1;;1186:237:36:o;1881:128::-;353:7;:13;;;;;;;;;;:19;1941:4;;353:33;:19;376:10;353:33;345:42;;;;;;1958:17;;;;;;;;;;1965:4;;1958:17;;;;;;;;;;-1:-1:-1;1981:7:36;:13;;;;;;;;;;;:17;;:23;;;;;;;;;;;;;;;;;;1881:128::o;2672:91::-;2720:6;2741:13;;;;;;;;;;:17;;;;;;;;;2672:91::o;1586:159::-;353:7;:13;;;;;;;;;;:19;1657:4;;353:33;:19;376:10;353:33;345:42;;;;;;1674:27;;;;;;;;;;1686:4;;1674:27;;;;;;;;;;-1:-1:-1;1707:7:36;:13;;;;;;;;;;;:22;;:33;;;;;;;;;;;;;;1586:159::o;747:141::-;353:7;:13;;;;;;;;;;:19;812:4;;353:33;:19;376:10;353:33;345:42;;;;;;829:21;;;;;;;;;;838:4;;829:21;;;;;;;;;;-1:-1:-1;856:7:36;:13;;;;;;;;;;;:27;;;;;;;;;;;;;;747:141::o"
},
"methodIdentifiers": {
"owner(bytes32)": "02571be3",
"resolver(bytes32)": "0178b8bf",
"setOwner(bytes32,address)": "5b0fc9c3",
"setResolver(bytes32,address)": "1896f70a",
"setSubnodeOwner(bytes32,bytes32,address)": "06ab5923",
"setTTL(bytes32,uint64)": "14ab9038",
"ttl(bytes32)": "16a25cbd"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"resolver\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"label\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setSubnodeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"setTTL\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"ttl\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"setResolver\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"label\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"NewResolver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"NewTTL\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"owner(bytes32)\":{\"details\":\"Returns the address that owns the specified node.\",\"params\":{\"node\":\"The specified node.\"},\"return\":\"address of the owner.\"},\"resolver(bytes32)\":{\"details\":\"Returns the address of the resolver for the specified node.\",\"params\":{\"node\":\"The specified node.\"},\"return\":\"address of the resolver.\"},\"setOwner(bytes32,address)\":{\"details\":\"Transfers ownership of a node to a new address. May only be called by the current owner of the node.\",\"params\":{\"node\":\"The node to transfer ownership of.\",\"owner\":\"The address of the new owner.\"}},\"setResolver(bytes32,address)\":{\"details\":\"Sets the resolver address for the specified node.\",\"params\":{\"node\":\"The node to update.\",\"resolver\":\"The address of the resolver.\"}},\"setSubnodeOwner(bytes32,bytes32,address)\":{\"details\":\"Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.\",\"params\":{\"label\":\"The hash of the label specifying the subnode.\",\"node\":\"The parent node.\",\"owner\":\"The address of the new owner.\"}},\"setTTL(bytes32,uint64)\":{\"details\":\"Sets the TTL for the specified node.\",\"params\":{\"node\":\"The node to update.\",\"ttl\":\"The TTL in seconds.\"}},\"ttl(bytes32)\":{\"details\":\"Returns the TTL of a node, and any records associated with it.\",\"params\":{\"node\":\"The specified node.\"},\"return\":\"ttl of the node.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSRegistry.sol\":\"ENSRegistry\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENS.sol\":{\"keccak256\":\"0xcc83b20d8d1b27c26281cef49d7dd8543534b07b2107603f32778be9be04d6e1\",\"urls\":[\"bzzr://85af7df26c00d317d3091ff1df8085c3bea6bd66ed24db378377ad6786da5d58\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSRegistry.sol\":{\"keccak256\":\"0x6c7783188b98f770f009b068e27a3e917132a0294f6ff51512576a830c20db92\",\"urls\":[\"bzzr://2d7f41c8485367027e5ff00145a77f5a97e7e04836b215a69fb71d72b7b2b793\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/ENSRegistry.sol": {
"id": 36
},
"vendor/ENS.sol": {
"id": 35
}
},
"sourceCodes": {
"vendor/ENSRegistry.sol": "pragma solidity ^0.4.24;\n\nimport \"./ENS.sol\";\n\n/**\n * The ENS registry contract.\n */\ncontract ENSRegistry is ENS {\n struct Record {\n address owner;\n address resolver;\n uint64 ttl;\n }\n\n mapping (bytes32 => Record) records;\n\n // Permits modifications only by the owner of the specified node.\n modifier only_owner(bytes32 node) {\n require(records[node].owner == msg.sender);\n _;\n }\n\n /**\n * @dev Constructs a new ENS registrar.\n */\n constructor() public {\n records[0x0].owner = msg.sender;\n }\n\n /**\n * @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node.\n * @param node The node to transfer ownership of.\n * @param owner The address of the new owner.\n */\n function setOwner(bytes32 node, address owner) public only_owner(node) {\n emit Transfer(node, owner);\n records[node].owner = owner;\n }\n\n /**\n * @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.\n * @param node The parent node.\n * @param label The hash of the label specifying the subnode.\n * @param owner The address of the new owner.\n */\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public only_owner(node) {\n bytes32 subnode = keccak256(abi.encodePacked(node, label));\n emit NewOwner(node, label, owner);\n records[subnode].owner = owner;\n }\n\n /**\n * @dev Sets the resolver address for the specified node.\n * @param node The node to update.\n * @param resolver The address of the resolver.\n */\n function setResolver(bytes32 node, address resolver) public only_owner(node) {\n emit NewResolver(node, resolver);\n records[node].resolver = resolver;\n }\n\n /**\n * @dev Sets the TTL for the specified node.\n * @param node The node to update.\n * @param ttl The TTL in seconds.\n */\n function setTTL(bytes32 node, uint64 ttl) public only_owner(node) {\n emit NewTTL(node, ttl);\n records[node].ttl = ttl;\n }\n\n /**\n * @dev Returns the address that owns the specified node.\n * @param node The specified node.\n * @return address of the owner.\n */\n function owner(bytes32 node) public view returns (address) {\n return records[node].owner;\n }\n\n /**\n * @dev Returns the address of the resolver for the specified node.\n * @param node The specified node.\n * @return address of the resolver.\n */\n function resolver(bytes32 node) public view returns (address) {\n return records[node].resolver;\n }\n\n /**\n * @dev Returns the TTL of a node, and any records associated with it.\n * @param node The specified node.\n * @return ttl of the node.\n */\n function ttl(bytes32 node) public view returns (uint64) {\n return records[node].ttl;\n }\n\n}\n",
"vendor/ENS.sol": "pragma solidity ^0.4.24;\n\ninterface ENS {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public;\n function setResolver(bytes32 node, address resolver) public;\n function setOwner(bytes32 node, address owner) public;\n function setTTL(bytes32 node, uint64 ttl) public;\n function owner(bytes32 node) public view returns (address);\n function resolver(bytes32 node) public view returns (address);\n function ttl(bytes32 node) public view returns (uint64);\n\n}\n"
},
"sourceTreeHashHex": "0x08def2c073d9d72b91f110446d2c6c6db54252a88c656d9bfe4dcb0f25f3594a",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENSResolver",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "addr",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"addr(bytes32)": "3b3b57de"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ERC20",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "spender",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "who",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
},
{
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "owner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
],
"devdoc": {
"methods": {},
"title": "ERC20 interface"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/ERC20.sol": {
"id": 13
},
"interfaces/ERC20Basic.sol": {
"id": 14
}
},
"sourceCodes": {
"interfaces/ERC20.sol": "pragma solidity ^0.4.11;\n\n\nimport { ERC20Basic as linkERC20Basic } from \"./ERC20Basic.sol\";\n\n\n/**\n * @title ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/20\n */\ncontract ERC20 is linkERC20Basic {\n function allowance(address owner, address spender) constant returns (uint256);\n function transferFrom(address from, address to, uint256 value) returns (bool);\n function approve(address spender, uint256 value) returns (bool);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n",
"interfaces/ERC20Basic.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title ERC20Basic\n * @dev Simpler version of ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/179\n */\ncontract ERC20Basic {\n uint256 public totalSupply;\n function balanceOf(address who) constant returns (uint256);\n function transfer(address to, uint256 value) returns (bool);\n event Transfer(address indexed from, address indexed to, uint256 value);\n}\n"
},
"sourceTreeHashHex": "0xc597ad81641c23618d27c52920f032b058f94144f688c910c427ec9a7ef4556c",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment