# Welcome to Ethernity CLOUD

Founded in 2018 by a small team of technologists and crypto enthusiasts, Ethernity explores the integration of [blockchain](https://en.wikipedia.org/wiki/Blockchain) with [trusted execution environment](https://en.wikipedia.org/wiki/Trusted_execution_environment) technologies.

Partnerships with high prestige organizations interested in such technologies is what motivates the team to voluntarily contribute some of their spare time to make the decentralization of the cloud a reality.

To quickly setup an **Ethernity NODE**, please visit this section:

{% content-ref url="/pages/-MOG0ZCV1pTHPjHdT6Z5" %}
[Ethernity Node Quick Start](/ethernity-node-quickstart)
{% endcontent-ref %}

If you want to run a **Proof of eXecution** task, setup the **Ethernity CLIENT** as shown in this section:

{% content-ref url="/pages/-MOG0faQXSWuPdXmz2n0" %}
[Ethernity SDK Quick Start](/ethernity-client-installation)
{% endcontent-ref %}

You can reach us via our Social Media channels. More information on the page:

{% content-ref url="/pages/-MOFxxIWr9mi1BF-eKYz" %}
[Social Media](/contact-1/social-media)
{% endcontent-ref %}


# Ethernity Node Quick Start

To run an Ethernity NODE there are some requirements. Please review the requirements carefully.

### Hardware and BIOS

{% content-ref url="/pages/-MOG15n3zEeOdUDQHMoC" %}
[Hardware Requirements](/ethernity-node-quickstart/hardware)
{% endcontent-ref %}

{% content-ref url="/pages/-MP3l4g5SNjMY6WK\_a3f" %}
[BIOS Settings](/ethernity-node-quickstart/bios-settings)
{% endcontent-ref %}

### Platform Software

{% content-ref url="/pages/-MOG18boNzRZ407OavEO" %}
[Supported Platforms](/ethernity-node-quickstart/platforms)
{% endcontent-ref %}

### Blockchain and Wallets Settings

{% content-ref url="/pages/-MOHSTaGvFB0VGowkv2r" %}
[Blockchain Settings](/ethernity-node-quickstart/blockchain)
{% endcontent-ref %}

### Installation

{% content-ref url="/pages/-MO\_To05\_7jffxZxiwgk" %}
[Installation](/ethernity-node-quickstart/ethernity-node-installation)
{% endcontent-ref %}

## Quick Start

### Install ansible

```
sudo apt update
sudo apt -y install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt -y install ansible
```

### Clone the repository

```
git clone https://github.com/ethernity-cloud/mvp-pox-node.git
```

### Install the kernel with SGX support

```
cd mvp-pox-node
sudo ansible-galaxy collection install crivetimihai.virtualization
sudo ansible-galaxy install uoi-io.libvirt
sudo ansible-playbook -i localhost, playbook.yml \
  -e "ansible_python_interpreter=/usr/bin/python3"
```

After the first run of the script, the new kernel is installed and the following message will be displayed:

```
ok: [localhost] => {
    "msg": "The kernel has been updated, a reboot is required"
}
```

Reboot the system as requested.

```
sudo reboot
```

Reconnect via SSH and resume the installation. Change to repository directory.

```bash
cd mvp-pox-node
```

### Create the config file

Write the blockchain wallets keypairs inside the config file if you have not done so already.

```
cat << EOF > config
ADDRESS=0xf17f52151EbEF6C7334FAD080c5704D77216b732
PRIVATE_KEY=AE6AE8E5CCBFB04590405997EE2D52D2B330726137B875053C36D94E974D162F
RESULT_ADDRESS=0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef
RESULT_PRIVATE_KEY=0DBBE8E4AE425A6D2687F1A7E3BA17BC98C673636790F1B8AD91193C05875EF1
EOF
```

### Deploy the node

```
sudo ansible-galaxy collection install crivetimihai.virtualization
sudo ansible-galaxy install uoi-io.libvirt
sudo ansible-playbook -i localhost, playbook.yml \
  -e "ansible_python_interpreter=/usr/bin/python3"
sudo cp -rf ~/.vagrant.d /root
```

### Start the node

```bash
systemctl start etny-vagrant
```


# Hardware Requirements

Hardware and BIOS requirements to run an Ethernity NODE

### Intel SGX

The system is required to have CPU and motherboard with SGX support.

Please check the following article for details on Hardware with SGX Support:

{% content-ref url="/pages/-MOG15n3zEeOdUDQHMoC" %}
[Hardware Requirements](/ethernity-node-quickstart/hardware)
{% endcontent-ref %}

If you have Linux already installed, please check the section on performing a check for SGX:

{% content-ref url="/pages/-MOhaWYQy\_ChWlW2Xb13" %}
[Check SGX Support](/ethernity-node/prerequisites-ethernity-node/check-sgx-support)
{% endcontent-ref %}

### BIOS

#### Secure Boot

The setup process installs a development kernel with the required SGX features enabled. This kernel is not signed. Secure Boot must be set to **DISABLED** in your BIOS configuration to allow it to boot.

#### SGX

A bios upgrade might be necessary for your system to activate SGX support. Please consult the hardware manufacturer.\
Software Guard Extension (SGX) must be set to **ENABLED** in the system BIOS.

If your CPU or System/BIOS lacks SGX support, please consult the section on the topic to find compatible hardware:

{% content-ref url="/pages/-MOHa1eS6qsYCU9ZRwgt" %}
[Hardware with SGX Support](/ethernity-node/prerequisites-ethernity-node/hardware-with-sgx-support)
{% endcontent-ref %}


# BIOS Settings

### Secure Boot

The setup process installs a development kernel with the required SGX features enabled. This kernel is not signed. Secure Boot must be set to **DISABLED** in your BIOS configuration to allow it to boot.

### SGX

A bios upgrade might be necessary for your system to activate SGX support. Please consult the hardware manufacturer.\
Software Guard Extension (SGX) must be set to **ENABLED** in the system BIOS.

If your CPU or System/BIOS lacks SGX support, please consult the section on the topic to find compatible hardware:

{% content-ref url="/pages/-MOHa1eS6qsYCU9ZRwgt" %}
[Hardware with SGX Support](/ethernity-node/prerequisites-ethernity-node/hardware-with-sgx-support)
{% endcontent-ref %}


# Supported Platforms

We support the following platform right now:

```
Ubuntu 20.04
Ubuntu 22.04
Ubuntu 24.04
Slackware 15-current
Debian 12.0
```

Support is planned for the following platforms in the future:

* Fedora
* Rocky
* AlmaLinux
* Microsoft Windows


# Blockchain Settings

#### Bloxberg

Ethernity Cloud runs on the bloxberg blockchain, an Ethereum-compatible PoA chain (chain ID 8995). The smart contract source can be reviewed here:\
<https://github.com/ethernity-cloud/pox-smart-contract>

Proof of eXecution (PoX) contract addresses on bloxberg:

* **Mainnet:** [0x549A6E06BB2084100148D50F51CF77a3436C3Ae7](https://blockexplorer.bloxberg.org/address/0x549A6E06BB2084100148D50F51CF77a3436C3Ae7)
* **Testnet:** [0x02882F03097fE8cD31afbdFbB5D72a498B41112c](https://blockexplorer.bloxberg.org/address/0x02882F03097fE8cD31afbdFbB5D72a498B41112c)

Ethernity Cloud also supports Polygon (mainnet and Amoy testnet), IoTeX Testnet, Ethereum Sepolia, and LitVM LiteForge. See **Configure the Node -> Select the network** for the full list and how to choose one.

Running a node requires two blockchain wallets (keypairs). One is used to submit transactions by the Data Processor and is used outside the TEE enclave. The other is used by the Results Processor to submit transactions containing results of the processing and is used inside the TEE enclave.

To generate and fund a blockchain wallet please check our section on the topic:


# Security Considerations

The Ethernity NODE runs tasks that are requested through the blockchain smart contract. This allows anybody to run their own software freely as long as it can be bundled inside a docker container.

In order to prevent abuse, the node restricts by default all outgoing connectivity of the full virtualization layer. Only to the required services are permitted: blockchain RPC, ipfs node, docker registry.

Further restrictions can be applied by the node operator by updating the source code which is licensed AGLP v3. Additional restrictions can include: running tasks requested only by a set of wallet addresses or running tasks containing only desired docker images.

Node operators are responsible for maintaining and enforcing their own set of rules.

Running a node requires generating two keypairs that represent the identity of your node and you are fully responsible to keep it safe. Do not share this information, or store it unencrypted outside the node configuration.


# Installation

### Automated Installation

This installer provides an easy way to automate the installation process of an Ethernity Node as much as possible.

Features:

* Automates the system update, and runs the ansible-playbook installation process
* Asks the user to generate (using the “ethkey” tool) or to input wallet details from console (node and result)
* Checks wallet balance for Bergs (continues only if Bergs > 0)
* Validates wallet for wrong input
* Prevents the user to continue if the node wallet is the same as the result wallet
* Restarts the system automatically after the system and kernel is updated

#### 1. Clone the repository to the home folder and run it

```
$ cd && git clone https://github.com/ethernity-cloud/mvp-pox-node.git
$ cd mvp-pox-node
$ ./etny-node-installer.sh
```

#### 2. Run the script again after system restart

```
$ cd mvp-pox-node
$ ./etny-node-installer.sh
```

### Maual Installation

#### 1. Install ansible

```
$ sudo apt update
$ sudo apt -y install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt -y install ansible
```

#### 2. Clone the repository

```
$ git clone https://github.com/ethernity-cloud/mvp-pox-node.git
```

#### 3. Install the kernel with SGX support

```
$ cd mvp-pox-node
$ sudo ansible-playbook -i localhost, playbook.yml \
  -e "ansible_python_interpreter=/usr/bin/python3"
```

After the first run of the script, the new kernel(with SGX support) is installed and the following message will be displayed:

```
ok: [localhost] => {
    "msg": "The kernel has been updated, a reboot is required"
}
```

Reboot the system as requested.

#### 4. Create config file (please use your own wallets):

```
$ cd mvp-pox-node
$ cat << EOF > config
PRIVATE_KEY=AE6AE8E5CCBFB04590405997EE2D52D2B330726137B875053C36D94E974D162F
EOF
$
```

#### 5. Start the node

```
$ cd mvp-pox-node
$ sudo ansible-playbook -i localhost, playbook.yml \
  -e "ansible_python_interpreter=/usr/bin/python3"
```

After the second run of the script the node should be successfully installed and the following message will be seen on the screen:

```
ok: [localhost] => {
    "msg": "Ethernity NODE installation successful"
}
```

#### 6. Check if the service is running correctly.

Service status can be seen by running the below command.

```
systemctl status etny-vagrant.service
```


# Ethernity SDK Quick Start

The Ethernity Cloud SDK lets you package your own code (a "backend") into an attestable, confidential enclave image and run it as a **Proof of eXecution** task on the Ethernity Cloud network. Two SDKs are available — pick the one that matches your stack. Both expose the same workflow: initialize a project, build the secure image, publish it, then run.

### Which SDK?

|             | Package                                                                            | Install                               | Runtime                                    |
| ----------- | ---------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------ |
| **Node.js** | [`@ethernity-cloud/sdk-js`](https://www.npmjs.com/package/@ethernity-cloud/sdk-js) | `npm install @ethernity-cloud/sdk-js` | Node.js 16+                                |
| **Python**  | [`ethernity-cloud-sdk-py`](https://pypi.org/project/ethernity-cloud-sdk-py/)       | `pip install ethernity-cloud-sdk-py`  | Python 3.10+ (Linux/macOS), 3.13 (Windows) |

Both SDKs can target either dApp template type:

* **Nodenithy** — your backend code is JavaScript / Node.js.
* **Pynithy** — your backend code is Python.

### Prerequisites

**Linux:**

* build-essential
* Docker + docker-compose
* Node.js 16+ (JS SDK) and/or Python 3.10+ (Python SDK)

**Windows:**

* Docker Desktop
* Node.js 16+ (JS SDK) and/or Python 3.13 (Python SDK)

### Installation

#### Node.js SDK

```bash
npm install @ethernity-cloud/sdk-js
```

Installing the package adds the `ecld-init`, `ecld-build`, and `ecld-publish` scripts to your project's `package.json` (via its postinstall step), so you can run them with `npm run`.

#### Python SDK

```bash
python -m venv venv
source venv/bin/activate        # macOS / Linux
venv\Scripts\activate           # Windows
pip install ethernity-cloud-sdk-py
```

The Python package exposes the `ecld-init`, `ecld-build`, and `ecld-publish` commands directly on your PATH.

### Workflow

The commands are identical for both SDKs.

* **Initialize** — `ecld-init` Sets up the project: choose the dApp type (Nodenithy / Pynithy) and the blockchain network, then the scaffold is generated. You will find a `src/serverless/` directory containing a `backend` file — this is where you add the functions your dApp calls, e.g.:

  ```python
  def hello(msg="World"):
      return "Hello " + msg
  ```
* **Build** — `ecld-build` Builds the project and stores the docker registry output under `registry/`. This is where your backend functions are baked into the secure enclave images.
* **Publish** — `ecld-publish` Required after build. Integrates the secure certificates used during executions and registers the image into the Ethernity Cloud Image Registry (on-chain), so nodes can attest and run the exact, untampered image.
* **Run** — start the demo/frontend to submit a task and test the integration end-to-end.

### Blockchain compatibility

The SDK can build and publish for the following networks:

| Network          | Type    | Chain ID |
| ---------------- | ------- | -------- |
| Bloxberg Mainnet | mainnet | 8995     |
| Bloxberg Testnet | testnet | 8995     |
| Polygon Mainnet  | mainnet | 137      |
| Polygon Amoy     | testnet | 80002    |
| IoTeX Testnet    | testnet | 4690     |
| Ethereum Sepolia | testnet | 11155111 |
| LitVM LiteForge  | testnet | 4441     |

> **Mainnet vs testnet attestation.** On **mainnet**, enclaves are signed `--production` and attested through CAS (real Intel SGX DCAP). On **testnet**, enclaves run in a non-CAS mode and self-sign their certificate from their own `MR_ENCLAVE` (`[TESTNET-INSECURE]`) — convenient for development, but not a production security guarantee.

### Tested platforms

* Windows 10 / 11
* Linux (Ubuntu 20.04+)


# Security Considerations

The Ethernity SDK delegates tasks to 3rd parties using blockchain transactions. At this moment the tasks metadata is saved to the blockchain and the content is uploaded to IPFS without encryption. The results are also publicly readable through IPFS. Please take this information into consideration when  submitting a task.

On the Testnet there still required to trust the data processor with the processing. Certain components of the system that handle results processing are still under development. The client is open source so anyone can establish a set of rules to only approve a set of data processors.

The side channel attacks against the common processors are not taken into consideration while developing the Ethernity software. Our vision is that the TEE technology will mature in time, and open hardware architecture such as RISC-V will provide robust environments for trusted computing.


# Prerequisites


# Hardware with SGX Support

### CPU

SGX was first introduced in 2015 with the sixth generation Intel Core microprocessors based on the Skylake microarchitecture.

Lists with SGX feature enabled CPUs are maintained by Intel at:\
[SGX with Intel® ME](https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&2_SoftwareGuardExtensions=Yes%20with%20Intel%C2%AE%20ME)\
[SGX with Intel® SPS and Intel® ME](https://ark.intel.com/content/www/us/en/ark/search/featurefilter.html?productType=873&2_SoftwareGuardExtensions=Yes%20with%20both%20Intel%C2%AE%20SPS%20and%20Intel%C2%AE%20ME)

Some of the initial 2015 released CPUs do not support SGX. Only specific S-Spec support it. Please consult the table below:

| Marketing Name | Processor#  | Post-Conversion S-Spec |
| -------------- | ----------- | ---------------------- |
| Intel® Core    | i7-6700K    | SR2L0                  |
| Intel® Core    | i5-6400T    | SR2L1                  |
| Intel® Core    | i7-6700     | SR2L2                  |
| Intel® Core    | i7-6700T    | SR2L3                  |
| Intel® Core    | i5-6600K    | SR2L4                  |
| Intel® Core    | i5-6600     | SR2L5                  |
| Intel® Core    | i5-6500     | SR2L6                  |
| Intel® Core    | i5-6400     | SR2L7                  |
| Intel® Core    | i5-6500T    | SR2L8                  |
| Intel® Core    | i5-6600T    | SR2L9                  |
| Intel® Xeon®   | E3-1280 v5  | SR2LC                  |
| Intel® Xeon®   | E3-1240 v5  | SR2LD                  |
| Intel® Xeon®   | E3-1230 v5  | SR2LE                  |
| Intel® Xeon®   | E3-1270 v5  | SR2LF                  |
| Intel® Xeon®   | E3-1220 v5  | SR2LG                  |
| Intel® Xeon®   | E3-1260L v5 | SR2LH                  |
| Intel® Xeon®   | E3-1225 v5  | SR2LJ                  |
| Intel® Xeon®   | E3-1275 v5  | SR2LK                  |
| Intel® Xeon®   | E3-1245 v5  | SR2LL                  |
| Intel® Xeon®   | E3-1235L v5 | SR2LM                  |
| Intel® Xeon®   | E3-1240L v5 | SR2LN                  |

### Motherboards / Compatible Systems

A list of SGX compatible systems that support Intel SGX is maintained here: <https://github.com/ayeks/SGX-hardware>

Starting April 2025, only Hardware with [FLC](https://software.intel.com/en-us/blogs/2018/12/09/an-update-on-3rd-party-attestation) is needed to be part of the mainnet, for the testnet SGX1 without [FLC](https://software.intel.com/en-us/blogs/2018/12/09/an-update-on-3rd-party-attestation) can be used.

### BIOS

A bios upgrade might be necessary for your system to activate SGX support. Please consult the hardware manufacturer.\
SGX must be set to ENABLED in the system BIOS.

### Cloud Service Providers

| Vendor        | Servicename                                                                                                                                                           | CPU SGX capable      | SGX activated in BIOS | Date     | Source                                                                                                                               |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Azure         | [Azure Confidential Computing Public Preview](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/microsoft-azure-compute.confidentialcompute?tab=Overview) | YES, SGX1            | YES, SGX1             | Oct 2018 | [Blog](https://azure.microsoft.com/en-us/blog/protect-data-in-use-with-the-public-preview-of-azure-confidential-computing/)          |
| IBM           | [IBM Cloud Bare Metal Instances](https://www.ibm.com/blogs/bluemix/2018/05/data-use-protection-ibm-cloud-using-intel-sgx/)                                            | YES, unknown version | YES                   | May 2018 | [Issue 46](https://github.com/ayeks/SGX-hardware/issues/46)                                                                          |
| packet.net    | [Reserved Hardware](https://www.packet.com/cloud/all-features/)                                                                                                       | YES, SGX1            | YES                   | Apr 2018 | [Issue 44](https://github.com/ayeks/SGX-hardware/issues/44)                                                                          |
| Alibaba Cloud | [ECS Bare Metal Instance](https://www.alibabacloud.com/product/ebm)                                                                                                   | YES, unknown version | YES                   | Sep 2018 | [Docs](https://www.alibabacloud.com/help/doc-detail/60576.html), [Issue 50](https://github.com/ayeks/SGX-hardware/issues/50)         |
| OVHcloud      | [Infrastructure Dedicated Servers](https://www.ovh.com/ca/en/dedicated-servers/infra/)                                                                                | YES, unknown version | YES                   | Sep 2019 | [Docs](https://www.ovh.ie/dedicated_servers/software-guard-extensions/), [Issue 66](https://github.com/ayeks/SGX-hardware/issues/66) |


# Check SGX Support

### Intel SGX check

There is no easy way to check SGX support in CPU and BIOS using Windows, therefore Linux is required to be installed to perform the checks.

Please check the section on Ubuntu Installation:

Operating System - Linux

Intel Software Guard Extension (SGX) functions are required for running an Ethernity NODE.\
To test if your environment supports SGX functions, run the small utility included in the repository:

#### **1. Clone the repository**

If you have not done so already, clone the repostiory.

```
git clone https://github.com/ethernity-cloud/mvp-pox-node.git
cd mvp-pox-node
```

Run test-sgx

```
utils/linux/test-sgx
```

### Results

```
...
Extended feature bits (EAX=07H, ECX=0H)
eax: 0 ebx: 29c6fbf ecx: 0 edx: 0
sgx available: 1

CPUID Leaf 12H, Sub-Leaf 0 of Intel SGX Capabilities (EAX=12H,ECX=0)
eax: 1 ebx: 0 ecx: 0 edx: 241f
sgx 1 supported: 1
sgx 2 supported: 0
MaxEnclaveSize_Not64: 1f
MaxEnclaveSize_64: 24
...
```

The following values must be 1 to indicate SGX support by the CPU:\
**sgx available**

One of the following values must be 1 to indicate SGX support in the System/BIOS\
**sgx 1 supported**\
**sgx 2 supported**

Another way of telling SGX works as expected is a value other than 0 for the following:\
**MaxEnclaveSize\_64**


# Installing Linux


# Download

## Download

Please download Ubuntu by using the links below.

#### Ubuntu 18.04 LTS

<https://releases.ubuntu.com/18.04/ubuntu-18.04.6-live-server-amd64.iso>

#### Ubuntu 20.04 LTS

<https://releases.ubuntu.com/20.04.6/ubuntu-20.04.6-live-server-amd64.iso>

**Ubuntu 22.04 LTS**

<https://releases.ubuntu.com/22.04/ubuntu-22.04.1-live-server-amd64.iso>[ <br>](<https://releases.ubuntu.com/20.04/ubuntu-20.04.5-live-server-amd64.iso&#xD;&#xA;>)

You can burn this ISO on a CD/DVD and skip to the [USB Installation Media](/ethernity-node/prerequisites-ethernity-node/installing-linux/usb-installation-media) section.\
Otherwise, depending on your operating system, create the USB installation media by following the instructions from the next section.&#x20;


# USB Installation Media

## Creating USB Installation Media

In order to install Ubuntu via a USB stick you will have to create a bootable USB stick containing the Ubuntu OS as shown below. The guide below applies for both Ubuntu 18.04 and Ubuntu 20.04.

### Using Windows

We recommend creating a bootable Linux USB stick on a Windows system utilizing Rufus.&#x20;

#### Downloading Rufus

You can download **Rufus** from the official website of Rufus at <https://rufus.ie>

Go to the official website of **Rufus** from any web browser and the following will be displayed:

![Scroll to the Download section. Click on Rufus Portable link as marked in the screenshot below. ](/files/-MO_z2QjBwmH-BVau6tw)

![Click on Rufus 3.13 Portable](/files/-MO_zL8Ue9DWcdHgK2W0)

![File download begins and progress can be seen. After download is complete please click on "Open file".](/files/-MObfpbnngvkjpORjB20)

![You can either select Yes or No. We recommend No.](/files/-MObi6VuuXxa_9_qFx6m)

![Rufus Main Window](/files/-MObqa45LW1xQsECYBju)

#### Creating an Ubuntu 18.04 LTS Bootable USB with Rufus

*NOTE*: **Rufus** will ***delete everything*** from your USB device. If you have any important data, please move it somewhere safe before you go through this process.

![ Insert your USB drive that you wish to make Ubuntu bootable. Rufus should list it in the Device section.](/files/-MOblTJRBWuYFy8v9zTf)

![Now click on the SELECT button as marked in the screenshot.](/files/-MOblgRYmdHs6B9WWAtD)

![A File Explorer window pops up. Please select the Ubuntu 18.04 LTS iso image and click Open.](/files/-MObmCAfOwbgIwQkRmj8)

![Click on the START button to start the process.](/files/-MObmayQz1QawVWI2dY1)

![Click on Yes so that Rufus can download additional files needed to continue.](/files/-MObmvHbqjFtx1sy2ttB)

![Leave the option to Write in ISO Image mode selected and click OK.](/files/-MObnL1WKqSVDVFEudpI)

![Last WARNING before Rufus DELETES all data on the USB stick. Click OK to continue.](/files/-MObnYWPfYULGIWGzvmc)

![Rufus should start making your USB drive Ubuntu bootable. It should take a few minutes.](/files/-MObnwSXHRVYB8sukY8M)

![Once it’s done, you should see the READY status. Now close Rufus and your USB drive is ready.](/files/-MObpo2vmj9ONQ2Obh3O)

### Using Ubuntu UI&#x20;

Please follow the steps shown below:

#### 1. Overview

With a bootable Ubuntu USB stick, you can:

* Install or upgrade Ubuntu
* Test out the Ubuntu desktop experience without touching your PC configuration
* Use tools installed by default on the USB stick to repair or fix a broken configuration

Creating a bootable Ubuntu USB stick is very simple, especially from Ubuntu itself, and we’re going to cover the process in the next few steps.

![Laptop Ubuntu desktop](https://assets.ubuntu.com/v1/27f94697-bionic-noqueen.png)

#### 2. Requirements

You will need:

* A 4GB or larger USB stick/flash drive
* Ubuntu Desktop 14.04 or later installed
* An Ubuntu ISO file.

![Download an Ubuntu ISO](https://assets.ubuntu.com/v1/647dd5d0-bionic-download.png)

#### 3. Launch Startup Disk Creator

We’re going to use an application called ‘Startup Disk Creator’ to write the ISO image to your USB stick. This is installed by default on Ubuntu, and can be launched as follows:

1. Insert your USB stick (select ‘Do nothing’ if prompted by Ubuntu)
2. On Ubuntu 18.04 and later, use the bottom left icon to open ‘Show Applications’
3. In older versions of Ubuntu, use the top left icon to open the dash
4. Use the search field to look for *Startup Disk Creator*
5. Select **Startup Disk Creator** from the results to launch the application

![Search for Startup Disk Creator](https://assets.ubuntu.com/v1/ed29b466-bionic-search-apps.png)

#### 4. ISO and USB selection

When launched, Startup Disk Creator will look for the ISO files in your *Downloads* folder, as well as any attached USB storage it can write to.

It’s likely that both your Ubuntu ISO and the correct USB device will have been detected and set as ‘Source disc image’ and ‘Disk to use’ in the application window. If not, use the ‘Other’ button to locate your ISO file and select the exact USB device you want to use from the list of devices.

Click **Make Startup Disk** to start the process.

![Click on Make Startup Disk](https://assets.ubuntu.com/v1/48c17275-bionic-make-startup-disk.png)

#### 5. Confirm USB device

Before making any permanent changes, you will be asked to confirm the USB device you’ve chosen is correct. This is important because any data currently stored on this device will be destroyed.

After confirming, the write process will start and a progress bar appears.

![USB write progress](https://assets.ubuntu.com/v1/af6b2c2a-bionic-usb-progress.png)

#### 6. Installation complete

That’s it! You now have Ubuntu on a USB stick, bootable and ready to go.

![USB write complete](https://assets.ubuntu.com/v1/d4690a43-bionic-usb-complete.png)

### Using Ubuntu Console

1. sudo umount /dev/sdX (where sdX is your USB stick)
2. sudo dd if=/path/to/ubuntu.iso of=/dev/sdX bs=1M (where ubuntu.iso is the downloaded file and sdX is the USB stick)

### Installing Ubuntu

After the USB installation media is created by one of the methods from above please continue to install [Ubuntu 18.04 LTS](/ethernity-node/prerequisites-ethernity-node/installing-linux/installing-ubuntu-18.04) or [Ubuntu 20.04 LTS](/ethernity-node/prerequisites-ethernity-node/installing-linux/ubuntu-20.04-lts-recommended)


# Ubuntu 18.04 LTS

This section describes the necessary steps to perform the installation of Ubuntu 18.04

## Installation

Please find below a step by step guide on how to install Ubuntu Server 18.04 LTS with screenshots at every step.

![Choose your desired language. Please use English in case troubleshooting is required.](/files/-MOaTBNtdtHlPk-Zg4cB)

![Please select your Country, we used United Kingdom](/files/-MOaTE0_niZUKK5u8Iw9)

![We had a UK keyboard layout and selected No for this question ](/files/-MOaTG7LjZWMO-nNL4qg)

![Keyboard Layout English (UK) in our case, but feel free to select what suits your configuration best](/files/-MOaTHd1KE2wutD0LSCI)

![Confirming Keyboard Layout English (UK)](/files/-MOaTJ5eSlKVDn43I59g)

![We used "ubuntu" as a hostname but feel free to change it](/files/-MOaTKWZ63pj8sfyQAI7)

![Username for the account](/files/-MOaTM9WeuKKYF56kcU4)

![Full name of the account](/files/-MOaTNp8ssVq3JbVCh0v)

![Password](/files/-MOaTPL8uB_dql4Ay82t)

![Re-enter Password](/files/-MOaTQoMmiC1jh3N7bne)

![Confirm or select time zone](/files/-MOaTSLapCmeySOmt4RS)

![Use the entire disk and set up LVM](/files/-MOaTTdYYG_JtpHPgEro)

![select your desired drive](/files/-MOaTUyva2S5NswAXR2r)

![Click on Yes to save the changes to disk](/files/-MOaTWU26C20OXKHWfFL)

![Leave the default value. The entire disk will be used](/files/-MOaTXz5TmsM7t9SwWIb)

![Select \<Yes> to confirm the changes](/files/-MOaTZM2eHsUJhWj8Jh6)

![We just used Continue without any proxy serve, but this is where you'd enter your proxy details](/files/-MOaT_nWr6RAnaelBOtU)

![We prefer to update the box manually so "No automatic updates"](/files/-MOaTbGqYaW2laud-n9k)

![Press SPACE while highlighting "OpenSSH server" to select it and then ENTER to continue.](/files/-MOaTcfwrVKRr998kXZT)

![Select \<Yes> for GRUB to install on the master boot record](/files/-MOaTe7Zx5Ak4eDvvMyh)

![We're done! Select Continue to reboot the system](/files/-MOaTf_bE1KKv1mzRcI3)

![This is how it looks after first login](/files/-MOaTgvzDL2DT2YpoK3W)

#### Check if SSH Service running

If you've followed the Installation from above the SSH server should already be enabled.&#x20;

![You can double check if the ssh server is running by executing "systemctl status ssh"](/files/-MObvEt9-qzeDpe393gI)

#### IP address

![Run "ifconfig" to get the IP address of the network interface.](/files/-MObxvy7_Q4RE2ZxL7bI)

### SSH Connection

Please continue to the [SSH Connection](/ethernity-node/prerequisites-ethernity-node/installing-linux/ssh-connection) session to find out on how to connect to your node remotely.


# Ubuntu 20.04 LTS (Recommended)

This section describes the necessary steps to perform the installation of Ubuntu 20.04

## Installation

Please find below a step by step guide on how to install Ubuntu Server 20.04 LTS with screenshots at every step.

![Choose your desired language. Please use English in case any troubleshooting will be required](/files/45FB2YT4s6o1tJtJAaww)

![Update to the latest Installer](/files/fyfDhRceuEqAP2qz77Kp)

![Choose your Keyboard Layout](/files/7XwFnsEwtHxBI0x6KDK8)

![Your ethernet cable should get an IP address automatically through DHCP (in our case we have 10.0.2.15)](/files/hYtY0EksMAH2ds2pmhGQ)

![No proxy needed in our case, but your case could be different](/files/Yk3eWAdHYLoYZwjIAjao)

![Leave this option selected as default or change the servers if you need to do that](/files/hQacohpVu6E5IBRQrdPu)

![Use the entire disk](/files/g4b7dCKapnCBg8K5VX6S)

![Confirm the selection and choose Done to continue](/files/8BqM94X6elN8NOqJZd18)

![All your data on the hard drive will be lost!!! Continue](/files/0XXFRqPlm0TZmQMVmkQ1)

![Setup the Profile as you see fit and select "Done" to continue](/files/b357tSWv7hfI21GOsW9Z)

![Select "Install OpenSSH" server and continue](/files/a8dIBJVvqOD4ON2q1VPv)

![No selection is required here. Select "Done" to continue](/files/b5bB8rbBjPaJLXRB0hEN)

![Wait for the installation to complete](/files/g1KOE2t5VzFvjRGb8XWa)

![Installation is now complete. Select "Reboot Now" to continue](/files/256LpuuWaaJ46pZ2RFQh)

![Login to your new OS using the username and password created above](/files/rvc9IkWFt0fiKc3NVzKM)

![Make a note of you IP address](/files/6gqmeNzlDt7z0nEbgENR)

![Make sure your SSH server is up and running so you can connect to the node remotely. ](/files/DmVxzXDsqzPXcnywNkzQ)

### SSH Connection

Please continue to the [SSH Connection](/ethernity-node/prerequisites-ethernity-node/installing-linux/ssh-connection) session to find out on how to connect to your node remotely.


# Ubuntu 22.04 LTS (Experimental)

This section describes the necessary steps to perform the installation of Ubuntu 22.04

## Installation

Please find below a step-by-step guide on how to install Ubuntu Server 20.04 LTS with screenshots at every step.

<figure><img src="/files/at5i7WyA6AtM7WNaQLDj" alt=""><figcaption><p>Select first option to begin</p></figcaption></figure>

<figure><img src="/files/oJ8OXB1W1pB3IvU3ycKw" alt=""><figcaption><p>Choose your desired language. Please use English in case any troubleshooting will be required</p></figcaption></figure>

<figure><img src="/files/tNGaJX8q3cTEBE2Fb4Ys" alt=""><figcaption><p>Leave the default option selected (Ubuntu server) and press the <em>Enter</em> button</p></figcaption></figure>

<figure><img src="/files/DJeHCKiQLdzq4bkLoAQP" alt=""><figcaption><p>Choose your Keyboard Layout</p></figcaption></figure>

<figure><img src="/files/Lus2D8lC3DLu0MBV3Yyp" alt=""><figcaption><p>Your ethernet cable should get an IP address automatically through DHCP (in our case we have 192.168.100.234)<br></p></figcaption></figure>

<figure><img src="/files/XE4ppFfhPnSNcJX8YXa6" alt=""><figcaption><p>No proxy needed in our case, but your case could be different<br></p></figcaption></figure>

<figure><img src="/files/wFzm4VuMv48XvMTRlXj7" alt=""><figcaption><p>Leave this option selected as default or change the servers if you need to do that<br></p></figcaption></figure>

<figure><img src="/files/mzrJBpMsR3o6rIvAVzqR" alt=""><figcaption><p>Update to the latest Installer or continue without</p></figcaption></figure>

<figure><img src="/files/J2DILlshbwSKMBTRSX5B" alt=""><figcaption><p>Use the entire disk or choose what option suites you best. The node requires at least 128 GB</p></figcaption></figure>

<figure><img src="/files/4wMxbD3ir0WZWuG0OSEb" alt=""><figcaption><p>Confirm the selection and choose <em>Done</em> to continue<br></p></figcaption></figure>

<figure><img src="/files/VhbWG47DqXkixTtjj0gq" alt=""><figcaption><p><em><strong>All your data on the hard drive will be lost!!!</strong></em> Continue<br></p></figcaption></figure>

<figure><img src="/files/l74kkUcLw4wt9DMUp1Xb" alt=""><figcaption><p>Setup the <em>Profile</em> as you see fit and select <em>Done</em> to continue<br></p></figcaption></figure>

### SSH Connection

<figure><img src="/files/5EwH5tcFaUV5tAczFTOB" alt=""><figcaption><p>Select <em>Install OpenSSH server</em> and continue<br></p></figcaption></figure>

<figure><img src="/files/ZVmVKltvdWrVBLDcLQB6" alt=""><figcaption><p>No selection is required here. Select <em>Done</em> to continue<br></p></figcaption></figure>

<figure><img src="/files/33yBzFy84RPsiW0VkA0Q" alt=""><figcaption><p>Wait for the installation to complete and <em>Reboot Now</em><br></p></figcaption></figure>

<figure><img src="/files/Drr3ajtHirBBzli1StTM" alt=""><figcaption><p>Press <em>Enter</em> to reboot</p></figcaption></figure>

<figure><img src="/files/EJHQM9bizTTee1XF6xdm" alt=""><figcaption><p>Login to your new OS using the username and password created above</p></figcaption></figure>

<figure><img src="/files/ZLrG6XfgjW7hYJE5Ptlq" alt=""><figcaption><p>Make a note of you IPv4 address to use it in the next step</p></figcaption></figure>

### SSH Connection

Please continue to the [SSH Connection](/ethernity-node/prerequisites-ethernity-node/installing-linux/ssh-connection) session to find out on how to connect to your node remotely.


# SSH Connection

## SSH connection

To continue the Ethernity NODE installation, is easier if you connect to the new installed Ubuntu environment using SSH from another computer.

### Connect using Windows

On a Windows computer, you can download PuTTY from here:

<https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html>

![Use the IP address highlighted at the "IP Address" step from above and click on Open.](/files/-MObyGK9U3fCEL15u4Yy)

To login, use the username and the password you configured while installing Ubuntu.

### Connect using Linux or macOS

Inside a console on Linux, or Terminal App on macOS, type:

```bash
ssh username@ip.address
```

Where username is the username you filled in at Ubuntu setup and ip.address is the IP address found at the last step of the installation.

To authenticate, use the password you configured while installing Ubuntu


# Blockchain Wallets

## Creating the wallets

Two Bloxberg wallets(ethereum compatible) are required to run an Ethernity node: a data processor wallet and a result processor wallet.

### **Clone the repository**

If you have not done so already, clone the repostiory

```
git clone https://github.com/ethernity-cloud/mvp-pox-node.git
cd mvp-pox-node
```

ethkey is a tool written in rust coming from the openetherum project. The compiled binary contains modifications that print the checksummed address which is required for configuration.

### Generate the Data Processor wallet

```bash
roles/generate_config_file/files/ethkey generate random

secret:  c7ac47a71c2ff61771ee6xyzxyzxyze8ea32e6ea183ad1547281476a4d503ce5
public:  35cd445cfa98995607622e5bd3aabc507ce717724ff981ff62de4e2cde7c31b9343e81a0910f2b65d750d08389784dc77cd916ddff020a6e3e0a70bb9f6c8add
address: 0x451bD91c141aBa49cD2Be184e647dFfd3Dc3B80C
```

```
The secret represents the private key and is attributed to the PRIVATE_KEY variable inside the config file, like this:
```

```
PRIVATE_KEY=c7ac47a71c2ff61771ee632xyzxyzxyzea32e6ea183ad1547281476a4d503ce5
```

### Testnet

The testnet is using bloxberg as blockchain infrastructure. The bloxberg faucet can be found at:

<https://faucet.bloxberg.org>

Just enter your wallet **address** (including 0x in front)  in the form, fill the captcha and you will receive 0.2 bergs.\
0.2 bergs is enough to run a few million transactions.


# Download

### Clone the repository

```
git clone https://github.com/ethernity-cloud/mvp-pox-node.git
```


# Installing the Node

The node installation could be done as easily as running 3 commands as shown below. The script currently supports Ubuntu 18.04 LTS,  Ubuntu 20.04 LTS and Ubuntu 22.04 LTS.

### Usage Instructions

#### 1. Clone the repository to the home folder and run it

```
$ cd && git clone https://github.com/ethernity-cloud/mvp-pox-node.git 
$ cd mvp-pox-node && sudo ./etny-node-installer.sh
```

#### 2. Run the script again after system restart (if restart is required)

```
$ cd mvp-pox-node && sudo ./etny-node-installer.sh

```

#### 3. Upon executing the script, you will be presented with a prompt to select the network. The interface will look something like this:

<figure><img src="/files/ObtP841pttjetbkdGzEz" alt=""><figcaption></figcaption></figure>

* If you want the node to run automatically on a network where it has gas (Priority: Polygon Mainnet, bloxberg Mainnet), type 1 and press Enter.&#x20;
* If you want to connect to the Polygon Mainnet (ECLD), type 2 and press Enter.&#x20;
* If you want to connect to the Polygon Testnet (tECLD), type 3 and press Enter.&#x20;
* If you want to connect to the bloxberg Mainnet (ETNY), type 4 and press Enter.&#x20;
* If you want to connect to the bloxberg Testnet (tETNY), type 5 and press Enter.&#x20;
* If you want to exit the script, type 6 and press Enter.

**4. During the installation process, the installer script may prompt you with the message:**

A. "Would you like to stop the service? (Y/n)". Y

B. "Do you want to use the default value of 3 ETNY / hour? (Y/n)", you can choose one of the following options (we recommended the default option):

* If you want to use the default value of 3 ETNY / hour, simply type "Y" and press Enter.
* If you want to specify a different value, type "n" and press Enter. The installer script will prompt you to enter a value between 1 and 10 for the ETNY / hour.

<figure><img src="/files/cGLOUrJlDporr9CAuDfY" alt=""><figcaption></figcaption></figure>


# Update the node

Commands to update a node

1. Prepare your Ubuntu system:&#x20;

* sudo apt update && sudo apt upgrade -y && sudo apt autoclean
* sudo reboot&#x20;

2. Update mvp-pox-node to the latest version:

* cd \~/mvp-pox-node  && sudo git pull  && sudo ./etny-node-installer.sh

3. Enjoy


# Configuring the Node

In the sections below you will find the instructions on how to select the proper network, to configure the resources (CPU, HDD, RAM), and also how to change the execution price.


# Select the network

Polygon Mainnet (ECLD) vs bloxberg Mainnet (ETNY)

## Select the network

#### During Installation

To upgrade to the latest git version and run the installer to select the appropriate option for you:

```
$ cd ~/mvp-pox-node && sudo git pull && ./etny-node-installer.sh
```

\*\*\* 0. AUTO = This option will connect to all available networks if the wallet has gas in it

#### After Installation

Make sure you are running the latest version from git

```
$ cd ~/mvp-pox-node && sudo git pull
```

List of networks are available inside networks.ini

```
$ cat networks.ini  | grep shortname | awk -F '=' '{print $2}'
POLYGON_MAINNET
POLYGON_AMOY
BLOXBERG_MAINNET
BLOXBERG_TESTNET
IOTEX_TESTNET
ETHEREUM_SEPOLIA
LITVM_LITEFORGE
```

Export your desired network in the environment

```
$ export NETWORK=BLOXBERG_TESTNET
```

or

```
$ export NETWORK=AUTO
```

Update the configuration inside the vagrant container

```
vagrant ssh -c "sed -i 's/^NETWORK=.*/NETWORK=${NETWORK}/' /home/vagrant/etny/node/config && sudo systemctl restart etny-node"
```


# Mainnet on Bloxberg

MainNet on bloxberg is the production network for staking and research&#x20;

Requirements for running a node on polygon:

* Ubuntu 20.04 server or new
* NETWORK defined into the config file. ( NETWORK=AUTO or NETWORK=BLOXBERG)
* TASK\_EXECUTION\_PRICE defined&#x20;

Config file example:

<div align="left"><figure><img src="/files/ooeBTPAghbaYO3z8uBU2" alt=""><figcaption></figcaption></figure></div>

<figure><img src="/files/MVSRPq5bZUIDtKOusd9k" alt=""><figcaption></figcaption></figure>

#### You can either manually update the settings in the config file or just upgrade to the latest git version and run the installer to select the appropriate option for you:

$ cd \~/mvp-pox-node && sudo git pull && ./etny-node-installer.sh

\*\*\* 1. Automatic = This option will set polygon Mainnet if your wallet has MATIC, otherwise will set bloxberg Mainnet (recommended for most users)

\*\*\* 4. bloxberg Mainnet (ETNY) = This option will set bloxberg Mainnet

<figure><img src="/files/omXmBxJhm0V0c6QhnRFw" alt=""><figcaption></figcaption></figure>

Useful information:

**BLOXBERG\_CONTRACT\_ADDRESS:** 0x549A6E06BB2084100148D50F51CF77a3436C3Ae7 **BLOXBERG\_HEARTBEAT\_CONTRACT\_ADDRESS:** 0x5c190f7253930C473822AcDED40B2eF1936B4075&#x20;

**BLOXBERG\_IMAGE\_REGISTRY:** 0x15D73a742529C3fb11f3FA32EF7f0CC3870ACA31 **BLOXBERG\_RPC\_URL:** <https://bloxberg.ethernity.cloud>

**You can verify if the node makes a contract call on Polygon at this link:** [**https://blockexplorer.bloxberg.org/**](https://blockexplorer.bloxberg.org/)


# ETNY on Bloxberg

Connecting the wallet to the Bloxberg blockchain and adding the Ethernity(ETNY) Token to our wallet.

### Expand View

First step is to expand our view from the Metamask Addon to a full Firefox tab in order for us to be able to copy paste the settings easily.

![](/files/-MZEgQumOLW-w6ptwKpB)

### Add Network

Now that our wallet has been created or restored we have to connect it to the Bloxberg blockchain to be able to access the funds. Please click on the "Add Network" button as shown below.

![](/files/GcrRTglDREQPzuI0kwfq)

### Bloxberg blockchain settings

Please complete the fields as shown in the picture below.

#### Network Name: Bloxberg

#### New RPC URL: [bloxberg.ethernity.cloud](https://bloxberg.ethernity.cloud)

#### Chain ID: 8995 or 0x2323

#### Currency Symbol (optional): bergs

#### Block Explorer URL: <https://blockexplorer.bloxberg.org>

<figure><img src="/files/OJdnpXPNS18ADp9n7T2v" alt=""><figcaption></figcaption></figure>

A confirmation message can be seen below when the Bloxberg network was successfully added as shown below.

![](/files/kilBiUeclSY2gJ4B1hHr)

### Ethernity (ETNY) token

Currently we've created or restored a wallet on the Bloxberg blockchain and we can see that we have 0 bergs in our wallet below. We need bergs to pay for the transaction fee if we want to send our ENTY tokens. Sending ETNY is free we can always request more bergs from the Blockchain faucet as shown [here](/wallet/send-enty). Now it's time to add the Ethernity token to our wallet. In order to do that click on the "Import tokens" button as shown below.

![](/files/Xltg4fSCB8rHRHvplk25)

### Custom Token

Click on "Custom Token" and then fill in the "Token Contract Address" which will automatically fill in the Token Symbol and Decimals of Prevision.

#### Token Contract Address: 0x549A6E06BB2084100148D50F51CF77a3436C3Ae7

![Click on "Add Custom Token"](/files/ejAy2wEkMuWOpvIpnMy3)

### ETNY Token

Visually confirm the ETNY token and add it to our wallet.&#x20;

![Click on "Import Tokens" button to add the ETNY Token to your wallet](/files/dIfcKA5FfSIlUBXHHcYc)

### Done! - You're all set

![Click on Account 1 / ETNY to go back to our wallet](/files/-MZIcnvZUGV21Rk6myZP)

***Optionally, you can continue below to "Receive ETNY" and "Sent ETNY" but these steps are not required!***


# Testnet on Bloxberg

Introduction

**TestNet:** As the name suggests, the Testnet is a network intended strictly for testing and development. Developers use it to try out new features, run tests, and fix bugs without the fear of causing disruption, as it is entirely separate from the Mainnet. This environment typically uses tokens with no real value, allowing developers to simulate transactions and interactions with the system freely. Testnets are crucial for preventing untested or unstable updates from reaching the Mainnet, thereby maintaining system stability and user trust.

**TESTNET\_CONTRACT\_ADDRESS:** 0x02882F03097fE8cD31afbdFbB5D72a498B41112c **TESTNET\_HEARTBEAT\_CONTRACT\_ADDRESS:** 0x9B105aefF69Cd26050798d575db17ffc2eAC4E4d&#x20;

**TESTNET\_IMAGE\_REGISTRY:** 0x15D73a742529C3fb11f3FA32EF7f0CC3870ACA31 **TESTNET\_RPC\_URL:** <https://bloxberg.ethernity.cloud>


# Data Processors

The following data processors are vetted and part of our Testnet. They are expected to run all the time.

| Node Name | Country        | NODE Address                               |
| --------- | -------------- | ------------------------------------------ |
| Baldr     | Deutschland    | 0xC4134D4f59947D3d36c01029845616B71C4206ef |
| Morrigan  | Deutschland    | 0x02B143Fe76f4F8C4A2E792311664d24759c49d52 |
| Isis      | United Kingdom | 0xff8C9e2E073882d676F72c06f9f7604eC3d8E01d |
| Helios    | Romania        | 0x2a08DD32491b0305cCEa882F1daD9b9Bec2Da96b |
| Ra        | Romania        | 0xfe6851BCe8edf041adbb5C2134660816a4F8683D |
| Odin      | Netherlands    | 0xeceD2227f5f8522D887087F5BDBDFB2684Fd93e8 |
| Osiris    | United Kingdom | 0x2bBe5c575F59809DA2a9E24d81B3DBBf9bcDaF74 |


# Bloxberg (BERGS)

\
To obtain bergs, kindly use the following link: <https://faucet.bloxberg.org/>

The testnet is using at the blockchain layer bloxberg - The Trusted Research Infrastructure

bloxberg is a PoA Ethereum compatible blockchain ran by over 50 research organizations spread around the whole world.

To find out more about bloxberg, please visit their website:

{% embed url="<https://bloxberg.org/>" %}


# tETNY on Bloxberg

Connecting the wallet to the Bloxberg blockchain and adding the Ethernity TestNet (tETNY) Token to our wallet.

**TestNet contract address is 0x02882F03097fE8cD31afbdFbB5D72a498B41112c**

## Login to your MetaMask wallet

![](/files/MBxr60qZhGYoJCq02cbR)

## Import TestNet contract

![Click on "Import Tokens"](/files/gNP37FAYhsMHCCqhljLb)

## TestNet Contract Address

**TestNet contract address is 0x02882F03097fE8cD31afbdFbB5D72a498B41112c**

## Confirm

<figure><img src="/files/qCOruuxDt3Tw3XOIRVLz" alt=""><figcaption></figcaption></figure>

## Done!

<figure><img src="/files/2NZnS8H7EJauaqBIhabd" alt=""><figcaption></figcaption></figure>


# tETNY Faucet

Claim tETNY from faucet.ethernity.cloud for testing on the Ethernity Cloud testnet

Getting started:

1. Open the faucet: <https://faucet.ethernity.cloud>
2. Select the **Bloxberg** network tab.
3. Connect your wallet (make sure MetaMask is on the Bloxberg network).
4. Click **Claim** to receive **1000 tETNY**.

Once the transaction is confirmed, the tokens arrive at your connected address.

The same faucet also dispenses **tECLD** on Ethereum Sepolia, LitVM LiteForge and Polygon Amoy — see [Testnet Faucet](https://docs.ethernity.cloud/testnet/testnet-faucet) for all networks and their gas-token prerequisites.

Note: these tokens are for testing on the Ethernity Cloud testnet only and cannot be used for any real-world transactions or value exchanges.

> The old single-network faucet at `testnet-faucet.ethernity.cloud` is superseded by `faucet.ethernity.cloud`.


# Mainnet on Polygon

Introduction

MainNet on Polygon is the production network for processing tasks in a secure, decentralized, and confidential cloud environment.

Requirements for running a node on polygon:

* MATIC (recommended 10 MATIC/node)
* NETWORK defined into the config file. ( NETWORK=AUTO or NETWORK=POLYGON)
* TASK\_EXECUTION\_PRICE defined&#x20;

Config file example:

<div align="left"><figure><img src="/files/ooeBTPAghbaYO3z8uBU2" alt=""><figcaption></figcaption></figure></div>

<figure><img src="/files/MVSRPq5bZUIDtKOusd9k" alt=""><figcaption></figcaption></figure>

#### You can either manually update the settings in the config file or just upgrade to the latest git version and run the installer to select the appropriate option for you:

$ cd \~/mvp-pox-node && sudo git pull && ./etny-node-installer.sh

\*\*\* 1. Automatic = This option will set polygon Mainnet if your wallet has MATIC, otherwise will set bloxberg Mainnet (recommended for most users)

\*\*\* 2. Polygon Mainnet (ECLD) = This option will set polygon Mainnet and you should ensure that your wallet contains MATIC for gas fee

<figure><img src="/files/omXmBxJhm0V0c6QhnRFw" alt=""><figcaption></figcaption></figure>

Useful information:

**POLYGON\_CONTRACT\_ADDRESS:** 0x439945BE73fD86fcC172179021991E96Beff3Cc4&#x20;

**POLYGON\_HEARTBEAT\_CONTRACT\_ADDRESS:** 0x2baddae93fdb8fae61a60587b789f27bf407406f&#x20;

**POLYGON\_IMAGE\_REGISTRY:** 0x689f3806874d3c8A973f419a4eB24e6fBA7E830F&#x20;

**POLYGON\_RPC\_URL:** <https://polygon-rpc.com>

**You can verify if the node makes a contract call on Polygon at this link:  <https://polygonscan.com>**


# ECLD on Polygon

Connecting the wallet to the Polygon blockchain and adding the Ethernity (ECLD) Token to our wallet.

### Expand View

The first step is to expand our view from the Metamask Addon to a full Firefox tab in order for us to be able to copy and paste the settings easily.

![](/files/-MZEgQumOLW-w6ptwKpB)

### Add Network

Now that our wallet has been created or restored we have to connect it to the Polygon blockchain to be able to access the funds. Please click on the "Add Network" button as shown below.

![](/files/GcrRTglDREQPzuI0kwfq)

### Polygon blockchain settings

Please complete the fields as shown in the picture below.

#### Network Name: Polygon Mainnet

#### New RPC URL:[ ](https://polygon-rpc.com/)<https://polygon-rpc.com/>

#### Chain ID: 137

#### Currency Symbol (optional): MATIC

#### Block Explorer URL: [https://polygonscan.com/ ](<https://polygonscan.com/ >)

<figure><img src="/files/jf4CUCRNz8d3D33dy452" alt=""><figcaption></figcaption></figure>

Press the save button and a confirmation message can be seen below when the Polygon network was successfully added as shown below:

<figure><img src="/files/4ceQevBQXYz090HGIN6j" alt=""><figcaption></figcaption></figure>

Ethernity (ECLD) token

Custom Token

Click on "Import tokens" and then fill in the "Token Contract Address", "Token Symbol" and "Token Decimals"

<figure><img src="/files/mETH8RQlqexkIVKTKbfh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4YBcV8MSTsJUYwM9Ru0L" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/2MocPkQK7SO7ObBaDUPX" alt=""><figcaption></figcaption></figure>

#### Token Contract Address: 0xc6920888988cAcEeA7ACCA0c96f2D65b05eE22Ba

### ECLD Token

Visually confirm the ECLD token and add it to our wallet.&#x20;

<figure><img src="/files/Ez6kdHcppA6uWI6tsEfM" alt=""><figcaption></figcaption></figure>

Done! - You're all set


# Testnet on Polygon Amoy

## Testnet on Polygon Amoy

Polygon Amoy is the current Polygon **testnet** for Ethernity Cloud. It replaces the deprecated Mumbai testnet (Mumbai has been sunset by Polygon).

**Network:** Polygon Amoy

**Chain ID:** 80002

**RPC URL:** <https://polygon-amoy-bor-rpc.publicnode.com>

**Protocol (PoX) contract:** 0x1579b37C5a69ae02dDd23263A2b1318DE66a27C3

**Image Registry contract:** 0xeFA33c3976f31961285Ae4f5D10188616C912728

**Network shortname (node `networks.ini`):** `POLYGON_AMOY`

**Faucet:** <https://faucet.polygon.technology> (select the Amoy network)


# Task execution price

The default task execution price is 1 ETNY per one hour of processing power regardless. It is recommended to have this price for a node with average resources. If you'd like to change the price per task you can do so during installation. You will be prompted to change and set a new price:

When asked "Do you want to use the default value of 1 ETNY / hour? (Y/n)", you can choose one of the following options (we recommended the default option):

* If you want to use the default value of 1 ETNY / hour, simply type "Y" and press Enter.
* If you want to specify a different value, type "n" and press Enter. The installer script will prompt you to enter a value between 1 and 10 for the ETNY / hour.


# Resources configuration

To modify the memory (RAM), CPU, and HDD/SSD space for your node in the Vagrantfile, you can follow these steps:

&#x20;1\. Open the terminal on your system or connect via SSH

2. Navigate to the directory where the Vagrantfile is located. In this case, it's `~/mvp-pox-node/`. You can use the `cd` command to change directories. For example:

```bash
cd ~/mvp-pox-node/
```

3. Open the Vagrantfile using your favorite text editor, such as "vi" or "nano". For example, to open it with nano:

```bash
nano Vagrantfile
```

4. Locate the lines in the Vagrantfile that define the memory, CPU, and HDD/SSD space:

* The `domain.memory` line sets the amount of memory (RAM) in megabytes (MB). In this example, it's set to 4096 MB (4 GB).
* The `domain.cpus` line sets the number of CPUs. In this example, it's set to 2.
* The `domain.machine_virtual_size` line sets the HDD/SSD space in gigabytes (GB). In this example, it's set to 128 GB.

<figure><img src="/files/S72LWDsi8VR7Oodcj3V5" alt=""><figcaption></figcaption></figure>

5\. Modify the values according to your requirements. For example, if you want to increase the memory to 8192 MB (8 GB), change the line to:

<figure><img src="/files/cO6Pzg6SAXZPauoEKEdC" alt=""><figcaption></figcaption></figure>

6\. Save the changes and exit the text editor. In nano, you can press Ctrl+X, followed by Y and Enter to save the changes.

After updating the configuration settings, the node has to be redeployed by running the following

```bash
$ sudo vagrant reload
```

Running this command will reload the VM, applying any changes made to the Vagrantfile without destroying the VM's current state. It will provision any necessary changes and update the VM accordingly.

Make sure you are in the same directory as the Vagrantfile when running the command from above.


# Monitoring the Node

To check the service status run:

```bash
sudo systemctl status etny-vagrant
```

To read the node logs run:

```bash
sudo journalctl -f -u etny-vagrant
```


# Troubleshooting issues

Common Troubleshooting Steps for Node Setup

## 1. Node Installation Successful, But No Contract Calls:

If your node is installed but you do not see any contract calls on the <https://blockexplorer.bloxberg.org/> or <https://polygonscan.com/>:

* Check your configuration file to ensure the wallet address is correct:

$ cd \~/mvp-pox-node $ cat config

* Check and restart the etny service

$ sudo systemctl status etny-vagrant

## 2. Error: SGX Not Enabled or Properly Configured:

<figure><img src="/files/r3BORShZ51RIvotxWsxd" alt=""><figcaption></figcaption></figure>

If you encounter an SGX-related error:

* Make sure you have the latest BIOS update and your processor has the latest microcode update. More information can be found here: <https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/best-practices/microcode-update-guidance.html>
* In some cases, it is required to disable Hyper-threading, as a workaround to fix underlying hardware security issues. Intel periodically releases information on how to fix the microcode/firmware for their chipsets. Please check for the latest security updates and notes here: <https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/blob/main/releasenote.md>
* If you're operating a node within a virtual environment, ensure that you have an appropriate configuration for DCAP. Consult your Hardware Affiliate or intel to setup HAP properly.
* Mutual attestation for SGX requires low-latency network connectivity (less than 50ms) attestation which does not reset connections. A busy/congested network leads to irrecoverable errors during the attestation process.

## 3. Installer Error - UFW:

<figure><img src="/files/miLmSWHLlgWeOuMuz1go" alt=""><figcaption></figcaption></figure>

If you're receiving the error:

"Ftaller error: ufw allow out from any to SIP port 4001" command failed with exit code 1

It's possible there's a DNS issue:

1. Ensure your DNS server is able to resolve the domain names:

* "ipfs.ethernity.cloud"
* "core.bloxberg.org"
* "bloxberg.ethernity.cloud"

2. Test DNS resolution using ping:

$ ping ipfs.ethernity.cloud

Repeat the ping command for the other domains to verify they can be resolved.

## 4. Cleanup VM Not Working:

<figure><img src="/files/S7FR0lBYmjiCeh8ktCUy" alt=""><figcaption></figcaption></figure>

If you try to destroy the VM with the command:

**$ sudo vagrant destroy -f**

and it doesn't work, you might need to remove Vagrant completely and then reinstall it. To do this:

1. Remove Vagrant's data directory:

**$ sudo rm -rf \~/.vagrant.d**

2. Remove Vagrant from your system:

**$ sudo apt-get remove vagrant**

3. Run your installer script:

**$ sudo ./etny-node-installer.sh**

## 5. Collect the logs and share them as a text file on Discord.

$ cd \~/mvp-pox-node && sudo vagrant ssh -c "cat /var/log/etny-node.log && cat /home/vagrant/etny/node/config | grep -v KEY && cd /home/vagrant/etny/node/etny-repo && sudo git branch && sudo git log --pretty=format:%H -n 1 && sudo git log --pretty=format:%B -n 1"

{% embed url="<https://discord.com/channels/183867536931160064/790542509167738921>" %}


# Firewall Rules

No special firewall rules are required for an Ethernity node.

For a better performance of the underlying IPFS component, is recommended to allow port 4001.

Also if your node is behind a router, is recommended to forward port 4001.


# Proof of eXecution

The main behavior of the client and the server python implementation is to handle Proof of eXecution (PoX) request written in Python.

PoX is a method of running computational tasks in a decentralized way.  While the tasks run various metadata information is stored on the blockchain, and actual data is transferred using IPFS. Using this method computational tasks are certified on the blockchain while improving research reproducibility. The docker image that runs the Python task inside a TEE enclave is based on [SCONE Community Version](https://scontain.com).

The smart contract permits any type computational tasks, and we encourage the community to discuss the possibilities of expanding the current implementation to other use cases.

The main purpose of the Testnet is to allow such tasks to run occasionally and to provide a layer of support for further developing both the server side (Ethernity NODE) and client side (Ethernity CLIENT) components.


# Blockchain Metadata

There are 3 transactions that handle metadata.

### The Data Owner request

This transaction contains the following metadata:

* The hardware resources required to run the task
* The docker template IPFS hash
* The python script IPFS hash
* The python fileset IPFS hash

### The Data Processor request

This transaction contains the following metadata:

* The hardware resources allocated for a request

### The Results Processor request

This transactions contains the following metadata:

* The results string IPFS hash


# IPFS

In order to facilitate fluent IPFS communications, all the clients, nodes and docker containers have the following bootstrap node configured and attempt to make this server part of their swarm: ipfs.ethernity.cloud

This will eventually become unnecessary when the network gets populated with nodes and they all connect to each other and pin the relevant content.


# Node Reset

Configure your giveaway node

### <mark style="color:green;">**Please note this documentation applies only for those who won a node and received it from Ethernity Cloud!**</mark>

For any info or questions about the node please join our Discord Community at and reach out to Andrei B#8089


# Node Connect

You must connect to your node to change the existing password and wallets. There are several ways to connect to your node:

* [DHCP](/ethernity-node/node-reset/node-connect/dhcp) (ssh)
* [Static IP](/ethernity-node/node-reset/node-connect/static-ip) (ssh)
* [Console](/ethernity-node/node-reset/node-connect/console) (hdmi or vga cable)


# DHCP

SSH connection

In order to connect to your node via ssh (port 22) you'd need to find out your node ip address and use a tool like [Putty](https://www.putty.org/) for Windows or "ssh" from the terminal on Linux or Mac

The IP address can be seen on the interface of your router. Usually it's something like 192.168.1.xyz or 192.168.0.xyz.

Please reach out to us on Discord if you cannot manage to find it.


# Static IP

ssh connection to 192.168.1.123

In case you you are not using DHCP the node accepts ssh connections on 192.168.1.123/24. You will have to connect your node to a computer through the cable provided and set a static ip address on the same subnet on  the device you would like to connect from


# Console

Video connection to the node

Connect the node to a monitor via hdmi or vga cable and login by using the keyboard


# Change Password

In order to change your password you have to login to the node by connecting through(ssh or monitor) and use the "passwd" command.

For more details please follow the link at <https://itsfoss.com/change-password-ubuntu/>


# Node wallets

Change the predefined wallets

Your node came already configured with wallets for the testnet. So it's plug & play. But you should change the wallet address to make it your own specially for the mainnet launch!

Edit the config file found in mvp-pox-node with your wallet addresses and private keys. Afterwards you have to run the below command.

sudo ansible-playbook -i localhost, playbook.yml -e "ansible\_python\_interpreter=/usr/bin/python3"


# Mainnet on Bloxberg

MainNet on bloxberg is the production network for staking and research&#x20;

Requirements for running a node on polygon:

* Ubuntu 20.04 server or new
* NETWORK defined into the config file. ( NETWORK=AUTO or NETWORK=BLOXBERG)
* TASK\_EXECUTION\_PRICE defined&#x20;

Config file example:

<div align="left"><figure><img src="/files/ooeBTPAghbaYO3z8uBU2" alt=""><figcaption></figcaption></figure></div>

<figure><img src="/files/MVSRPq5bZUIDtKOusd9k" alt=""><figcaption></figcaption></figure>

#### You can either manually update the settings in the config file or just upgrade to the latest git version and run the installer to select the appropriate option for you:

$ cd \~/mvp-pox-node && sudo git pull && ./etny-node-installer.sh

\*\*\* 1. Automatic = This option will set polygon Mainnet if your wallet has MATIC, otherwise will set bloxberg Mainnet (recommended for most users)

\*\*\* 4. bloxberg Mainnet (ETNY) = This option will set bloxberg Mainnet

<figure><img src="/files/omXmBxJhm0V0c6QhnRFw" alt=""><figcaption></figcaption></figure>

Useful information:

**BLOXBERG\_CONTRACT\_ADDRESS:** 0x549A6E06BB2084100148D50F51CF77a3436C3Ae7 **BLOXBERG\_HEARTBEAT\_CONTRACT\_ADDRESS:** 0x5c190f7253930C473822AcDED40B2eF1936B4075&#x20;

**BLOXBERG\_IMAGE\_REGISTRY:** 0x15D73a742529C3fb11f3FA32EF7f0CC3870ACA31 **BLOXBERG\_RPC\_URL:** <https://bloxberg.ethernity.cloud>

**You can verify if the node makes a contract call on Polygon at this link:** [**https://blockexplorer.bloxberg.org/**](https://blockexplorer.bloxberg.org/)


# ETNY on Bloxberg

Connecting the wallet to the Bloxberg blockchain and adding the Ethernity(ETNY) Token to our wallet.

### Expand View

First step is to expand our view from the Metamask Addon to a full Firefox tab in order for us to be able to copy paste the settings easily.

![](/files/-MZEgQumOLW-w6ptwKpB)

### Add Network

Now that our wallet has been created or restored we have to connect it to the Bloxberg blockchain to be able to access the funds. Please click on the "Add Network" button as shown below.

![](/files/GcrRTglDREQPzuI0kwfq)

### Bloxberg blockchain settings

Please complete the fields as shown in the picture below.

#### Network Name: Bloxberg

#### New RPC URL: [bloxberg.ethernity.cloud](https://bloxberg.ethernity.cloud)

#### Chain ID: 8995 or 0x2323

#### Currency Symbol (optional): bergs

#### Block Explorer URL: <https://blockexplorer.bloxberg.org>

<figure><img src="/files/OJdnpXPNS18ADp9n7T2v" alt=""><figcaption></figcaption></figure>

A confirmation message can be seen below when the Bloxberg network was successfully added as shown below.

![](/files/kilBiUeclSY2gJ4B1hHr)

### Ethernity (ETNY) token

Currently we've created or restored a wallet on the Bloxberg blockchain and we can see that we have 0 bergs in our wallet below. We need bergs to pay for the transaction fee if we want to send our ENTY tokens. Sending ETNY is free we can always request more bergs from the Blockchain faucet as shown [here](/wallet/send-enty). Now it's time to add the Ethernity token to our wallet. In order to do that click on the "Import tokens" button as shown below.

![](/files/Xltg4fSCB8rHRHvplk25)

### Custom Token

Click on "Custom Token" and then fill in the "Token Contract Address" which will automatically fill in the Token Symbol and Decimals of Prevision.

#### Token Contract Address: 0x549A6E06BB2084100148D50F51CF77a3436C3Ae7

![Click on "Add Custom Token"](/files/ejAy2wEkMuWOpvIpnMy3)

### ETNY Token

Visually confirm the ETNY token and add it to our wallet.&#x20;

![Click on "Import Tokens" button to add the ETNY Token to your wallet](/files/dIfcKA5FfSIlUBXHHcYc)

### Done! - You're all set

![Click on Account 1 / ETNY to go back to our wallet](/files/-MZIcnvZUGV21Rk6myZP)

***Optionally, you can continue below to "Receive ETNY" and "Sent ETNY" but these steps are not required!***


# Mainnet on Polygon

Introduction

MainNet on Polygon is the production network for processing tasks in a secure, decentralized, and confidential cloud environment.

Requirements for running a node on polygon:

* MATIC (recommended 10 MATIC/node)
* NETWORK defined into the config file. ( NETWORK=AUTO or NETWORK=POLYGON)
* TASK\_EXECUTION\_PRICE defined&#x20;

Config file example:

<div align="left"><figure><img src="/files/ooeBTPAghbaYO3z8uBU2" alt=""><figcaption></figcaption></figure></div>

<figure><img src="/files/MVSRPq5bZUIDtKOusd9k" alt=""><figcaption></figcaption></figure>

#### You can either manually update the settings in the config file or just upgrade to the latest git version and run the installer to select the appropriate option for you:

$ cd \~/mvp-pox-node && sudo git pull && ./etny-node-installer.sh

\*\*\* 1. Automatic = This option will set polygon Mainnet if your wallet has MATIC, otherwise will set bloxberg Mainnet (recommended for most users)

\*\*\* 2. Polygon Mainnet (ECLD) = This option will set polygon Mainnet and you should ensure that your wallet contains MATIC for gas fee

<figure><img src="/files/omXmBxJhm0V0c6QhnRFw" alt=""><figcaption></figcaption></figure>

Useful information:

**POLYGON\_CONTRACT\_ADDRESS:** 0x439945BE73fD86fcC172179021991E96Beff3Cc4&#x20;

**POLYGON\_HEARTBEAT\_CONTRACT\_ADDRESS:** 0x2baddae93fdb8fae61a60587b789f27bf407406f&#x20;

**POLYGON\_IMAGE\_REGISTRY:** 0x689f3806874d3c8A973f419a4eB24e6fBA7E830F

**POLYGON\_RPC\_URL:** <https://polygon-rpc.com>

**You can verify if the node makes a contract call on Polygon at this link:  <https://polygonscan.com>**


# ECLD on Polygon

Connecting the wallet to the Polygon blockchain and adding the Ethernity (ECLD) Token to our wallet.

### Expand View

The first step is to expand our view from the Metamask Addon to a full Firefox tab in order for us to be able to copy and paste the settings easily.

![](/files/-MZEgQumOLW-w6ptwKpB)

### Add Network

Now that our wallet has been created or restored we have to connect it to the Polygon blockchain to be able to access the funds. Please click on the "Add Network" button as shown below.

![](/files/GcrRTglDREQPzuI0kwfq)

### Polygon blockchain settings

Please complete the fields as shown in the picture below.

#### Network Name: Polygon Mainnet

#### New RPC URL:[ ](https://polygon-rpc.com/)<https://polygon-rpc.com/>

#### Chain ID: 137

#### Currency Symbol (optional): MATIC

#### Block Explorer URL: [https://polygonscan.com/ ](<https://polygonscan.com/ >)

<figure><img src="/files/jf4CUCRNz8d3D33dy452" alt=""><figcaption></figcaption></figure>

Press the save button and a confirmation message can be seen below when the Polygon network was successfully added as shown below:

<figure><img src="/files/4ceQevBQXYz090HGIN6j" alt=""><figcaption></figcaption></figure>

Ethernity (ECLD) token

Custom Token

Click on "Import tokens" and then fill in the "Token Contract Address", "Token Symbol" and "Token Decimals"

<figure><img src="/files/mETH8RQlqexkIVKTKbfh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4YBcV8MSTsJUYwM9Ru0L" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/2MocPkQK7SO7ObBaDUPX" alt=""><figcaption></figcaption></figure>

#### Token Contract Address: 0xc6920888988cAcEeA7ACCA0c96f2D65b05eE22Ba

### ECLD Token

Visually confirm the ECLD token and add it to our wallet.&#x20;

<figure><img src="/files/Ez6kdHcppA6uWI6tsEfM" alt=""><figcaption></figcaption></figure>

Done! - You're all set


# Data Processors

The following data processors are vetted and part of our Testnet. They are expected to run all the time.

| Node Name | Country        | NODE Address                               |
| --------- | -------------- | ------------------------------------------ |
| Baldr     | Deutschland    | 0xC4134D4f59947D3d36c01029845616B71C4206ef |
| Morrigan  | Deutschland    | 0x02B143Fe76f4F8C4A2E792311664d24759c49d52 |
| Isis      | United Kingdom | 0xff8C9e2E073882d676F72c06f9f7604eC3d8E01d |
| Helios    | Romania        | 0x2a08DD32491b0305cCEa882F1daD9b9Bec2Da96b |
| Ra        | Romania        | 0xfe6851BCe8edf041adbb5C2134660816a4F8683D |
| Odin      | Netherlands    | 0xeceD2227f5f8522D887087F5BDBDFB2684Fd93e8 |
| Osiris    | United Kingdom | 0x2bBe5c575F59809DA2a9E24d81B3DBBf9bcDaF74 |


# Bloxberg (BERGS)

\
To obtain bergs, kindly use the following link: <https://faucet.bloxberg.org/>

The testnet is using at the blockchain layer bloxberg - The Trusted Research Infrastructure

bloxberg is a PoA Ethereum compatible blockchain ran by over 50 research organizations spread around the whole world.

To find out more about bloxberg, please visit their website:

{% embed url="<https://bloxberg.org/>" %}


# tETNY on Bloxberg

Connecting the wallet to the Bloxberg blockchain and adding the Ethernity TestNet (tETNY) Token to our wallet.

**TestNet contract address is 0x02882F03097fE8cD31afbdFbB5D72a498B41112c**

## Login to your MetaMask wallet

![](/files/MBxr60qZhGYoJCq02cbR)

## Import TestNet contract

![Click on "Import Tokens"](/files/gNP37FAYhsMHCCqhljLb)

## TestNet Contract Address

**TestNet contract address is 0x02882F03097fE8cD31afbdFbB5D72a498B41112c**

## Confirm

<figure><img src="/files/qCOruuxDt3Tw3XOIRVLz" alt=""><figcaption></figcaption></figure>

## Done!

<figure><img src="/files/2NZnS8H7EJauaqBIhabd" alt=""><figcaption></figcaption></figure>


# Testnet Faucet

faucet tETNY for Testing Ethenrity Cloud Environment

## Testnet Faucet

The Ethernity Cloud faucet dispenses free testnet tokens so you can pay for tasks and try out dApps on the Ethernity Cloud testnets — no real value required. One faucet now serves all supported testnets:

{% hint style="info" %}
**Faucet:** <https://faucet.ethernity.cloud>
{% endhint %}

Each claim sends **1000 tokens** to your address on the selected network.

> The old single-network faucet at `testnet-faucet.ethernity.cloud` (Bloxberg only) is superseded by this multi-network faucet.

### Supported networks

| Network          | Token     | Gas token   | Amount per claim |
| ---------------- | --------- | ----------- | ---------------- |
| Bloxberg Testnet | **tETNY** | BERGS       | 1000             |
| Ethereum Sepolia | **tECLD** | Sepolia ETH | 1000             |
| LitVM LiteForge  | **tECLD** | zkLTC       | 1000             |
| Polygon Amoy     | **tECLD** | POL         | 1000             |

**Token contracts**

* Bloxberg tETNY — `0x02882F03097fE8cD31afbdFbB5D72a498B41112c`
* Sepolia tECLD — `0x95Aa17fCFaAB75e8ed7d7DF218045795dCeB9c50`
* LitVM tECLD — `0x95Aa17fCFaAB75e8ed7d7DF218045795dCeB9c50`
* Polygon Amoy tECLD — `0x9927809B61122B2af3f3b3A3303875e0687b8eE3`

### Getting your tokens

1. Open the faucet: <https://faucet.ethernity.cloud>
2. Select the network you want tokens on — **Bloxberg**, **Sepolia**, **LitVM** or **Amoy**.
3. Connect your wallet. The faucet prompts you to add or switch to the selected network automatically (use **Add … to your wallet** if it is missing).
4. Click **Mint / Claim** to send the tokens to your connected address.
5. When the transaction confirms, the tokens arrive at your address. The confirmation links straight to the transaction on that network's block explorer.

{% hint style="warning" %}
Claiming is an on-chain transaction, so you need a small amount of the network's **gas token first** — BERGS on Bloxberg, Sepolia ETH on Sepolia, zkLTC on LitVM, POL on Polygon Amoy. On Sepolia, LitVM and Amoy, use that network's public gas faucet before claiming (for Amoy: <https://faucet.polygon.technology>, select Amoy).
{% endhint %}

### Adding the token to your wallet

After a claim, add the token contract (above) to your wallet to see the balance: in MetaMask choose **Import tokens**, paste the contract address for your network, and the symbol (**tETNY** or **tECLD**) and 18 decimals fill in automatically.

{% hint style="info" %}
These are testnet tokens for development and testing on the Ethernity Cloud testnets only. They carry no real-world value and cannot be exchanged for mainnet tokens.
{% endhint %}


# Polygon Amoy

## Polygon Amoy

Polygon Amoy is the current Polygon **testnet** for Ethernity Cloud. It replaces the deprecated Mumbai testnet (Mumbai has been sunset by Polygon).

**Network:** Polygon Amoy

**Chain ID:** 80002

**RPC URL:** <https://polygon-amoy-bor-rpc.publicnode.com>

**Protocol (PoX) contract:** 0x1579b37C5a69ae02dDd23263A2b1318DE66a27C3

**Image Registry contract:** 0xeFA33c3976f31961285Ae4f5D10188616C912728

**Network shortname (node `networks.ini`):** `POLYGON_AMOY`

**Faucet:** <https://faucet.polygon.technology> (select the Amoy network)


# IoTeX Testnet

IoTeX Testnet is an EVM-compatible testnet supported by Ethernity Cloud.

**Network:** IoTeX Testnet

**Chain ID:** 4690

**RPC URL:** <https://babel-api.testnet.iotex.io>

**Protocol (PoX) contract:** 0xD56385A97413Ed80E28B1b54A193b98F2C49c975

**Image Registry contract:** 0xa7467A6391816be9367a1cC52E0ef0c15FfE3cCC

**Network shortname (node `networks.ini`):** `IOTEX_TESTNET`

**Faucet:** <https://developers.iotex.io/faucet>


# Ethereum Sepolia

Ethereum Sepolia is the standard Ethereum testnet, supported by Ethernity Cloud.

**Network:** Ethereum Sepolia

**Chain ID:** 11155111

**RPC URL:** <https://ethereum-sepolia-rpc.publicnode.com>

**Protocol (PoX) contract:** 0x29D3eC870565B6A1510232bd950A8Bc8336f0EB2

**Image Registry contract:** 0x55e0ad455Be85162b71a790f00Fc305680E3CE53

**Network shortname (node `networks.ini`):** `ETHEREUM_SEPOLIA`

**Faucet:** <https://sepoliafaucet.com> (or any public Sepolia faucet)


# LitVM LiteForge

LitVM (LiteForge) is a Litecoin EVM ZK-rollup (Arbitrum Orbit) testnet, gas token zkLTC, supported by Ethernity Cloud.

**Network:** LitVM LiteForge

**Chain ID:** 4441

**RPC URL:** <https://liteforge.rpc.caldera.xyz/infra-partner-http>

**Protocol (PoX) contract:** 0x29D3eC870565B6A1510232bd950A8Bc8336f0EB2

**Image Registry contract:** 0x55e0ad455Be85162b71a790f00Fc305680E3CE53

**Network shortname (node `networks.ini`):** `LITVM_LITEFORGE`

> The PoX and Image Registry contract addresses match Ethereum Sepolia because the same deployer deployed the same contracts in the same order (deterministic CREATE). They are distinct on-chain deployments, keyed by chain ID and RPC.

**Faucet / bridge:** see the LiteForge (Caldera) network portal.


# Introduction

Ethernity Cloud runs your code inside sealed hardware enclaves (Intel SGX) on a decentralized network — nobody, not even the node operator, can see your code's data while it runs, and every execution is proven on-chain. A **confidential dApp** is exactly that: backend functions that execute in an enclave, callable from any client, with results (and optionally persistent state) you can trust.

This guide is a build journey:

1. [How it works](https://docs.ethernity.cloud/developer-guide/the-ec-protocol) — the enclaves, the task lifecycle, and what "sealed" buys you (enough to make the rest make sense).
2. [Set up your environment](https://docs.ethernity.cloud/developer-guide/the-guide/environment-prerequisites) — the toolchain: Python or Node, Docker, a wallet, testnet tokens.
3. [Build & publish your first dApp](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp) — scaffold, write a function, bake it into an enclave, register it on-chain.
4. [Run it](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp) — locally for free with `ecld-test`, then on the network with `ecld-run`.
5. [Add persistent state](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr) — encrypted, on-chain-anchored state with ownership and permissions.
6. [Inspect and troubleshoot](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp) — free, read-only diagnostics with `ecld-info`, plus the [reference](https://docs.ethernity.cloud/developer-guide/the-guide/reference-and-troubleshooting) of commands and status codes.

You will build and publish a working confidential dApp in the next few pages — no prior blockchain experience required.


# How it works

The Ethernity Cloud (EC) Protocol lets a Web3 dApp run confidential computation on untrusted, decentralized nodes while keeping user data private and producing a verifiable **Proof of eXecution** on-chain. Client code runs inside a hardware **Trusted Execution Environment** — concretely **Intel SGX**, hardened by the **SCONE** runtime — so neither the node operator nor anyone else can read the data or tamper with the computation. This page is the concept map: enough to make the hands-on chapters make sense, no node internals.

### Actors and components

```mermaid
graph TD
    Dev["Web3 dApp Developer"] -->|writes backend + frontend| DApp["dApp"]
    User["Web3 dApp User"] -->|submits task| DApp
    DApp -->|addDORequest / read result| SC["EC Smart Contract (PoX)"]
    DApp -->|upload encrypted challenge/payload/input| IPFS["Decentralized Storage (IPFS)"]

    SC <-->|match order, advertise resources, submit proof| Node["EC Node"]
    Node -->|download image + encrypted data| IPFS
    Node -->|resolve enclave cert + MRENCLAVE by name,'v3'| IR["On-chain Image Registry"]

    subgraph TEE["EC Node -- SGX enclaves (SCONE)"]
        TZ["trustedzone (gatekeeper)"]
        SL["securelock (executor)"]
        VAL["validator (attester)"]
    end
    Node --> TEE
    TZ <-->|payload / input / result / transaction objects| SS["SwiftStream (MinIO object store)"]
    SL <-->|payload / input / result objects| SS

    TZ -.->|mainnet: attest| CAS["CAS (Config & Attestation Service)"]
    SL -.->|mainnet: attest| CAS
    TZ -.->|testnet: self-sign from MR_ENCLAVE| Self["[TESTNET-INSECURE] self-signed cert"]
```

* **Web3 dApp Developer** — builds the dApp with the SDK, packaging the backend into an attestable enclave image.
* **Web3 dApp User** — uses the dApp; their sensitive data stays encrypted end-to-end.
* **EC Smart Contract (Proof of eXecution)** — takes task requests, matches them to nodes, and receives the on-chain proof.
* **IPFS** — carries the encrypted payload, input, and result; nothing readable ever touches it.
* **EC Node** — advertises resources, downloads tasks, and orchestrates the SGX enclaves that do the confidential work.
* **On-chain Image Registry** — stores each enclave image's certificate and `MRENCLAVE` measurement, keyed by image name and protocol version `v3`. This is how the network verifies a node runs your exact, untampered code — and how one enclave obtains another's public key.
* **CAS** — on **mainnet**, provisions enclave certificates only after a real SGX **DCAP** attestation. Not used on testnet (see below).

### The v3 enclaves

A task is processed by cooperating SGX enclaves that **communicate only through a shared object store (SwiftStream)** — they never call each other directly, and each decrypts only what was encrypted for its own key.

* **trustedzone — the gatekeeper.** Decrypts the client challenge, derives a per-task wallet, validates the payload/input checksums against the data owner's signature, re-encrypts them for securelock's on-chain-registered key, and — after execution — signs the `_addResultToOrder` transaction: the **Proof of eXecution**. It is the only enclave that holds the task wallet and the only one that writes on-chain.
* **securelock — the executor.** Decrypts the payload and input with its own key and **runs your code** inside SGX, producing an encrypted result plus a status code. It never talks to the blockchain.
* **validator — the attester.** Verifies a node's enclaves; its `MRENCLAVE` is pinned into the trustedzone attestation session.

> **Security boundary.** Client code runs **only** in securelock. trustedzone never executes client code — it validates, brokers keys, and signs — so a malicious payload cannot forge a Proof of eXecution or reach the on-chain wallet. Because enclaves exchange data only through SwiftStream, and each decrypts only what was encrypted for its own registered key, a compromised host cannot read task data or tamper with results.

### Attestation: mainnet vs testnet

* **Mainnet** — enclaves are production-signed and attested through **CAS** with a real SGX **DCAP** quote; certificates are provisioned only after the quote verifies. This is the secure path.
* **Testnet** — enclaves **self-sign** their certificate deterministically from their own `MR_ENCLAVE` (`[TESTNET-INSECURE]`). No CAS dependency for development — but not a production security guarantee.

### The life of a task

```mermaid
sequenceDiagram
    autonumber
    actor User as dApp User
    participant IPFS as IPFS
    participant SC as EC Smart Contract
    participant Node as EC Node
    participant TZ as trustedzone
    participant SS as SwiftStream
    participant SL as securelock

    User->>IPFS: upload encrypted challenge, payload, input
    User->>SC: addDORequest(imageMetadata, codeMetadata, inputMetadata)
    Node->>SC: advertise resources
    SC-->>Node: match order to this node
    Node->>IPFS: download image + encrypted challenge/payload/input
    Node->>TZ: start enclaves
    TZ->>TZ: validate payload/input checksums vs owner signature
    TZ->>SS: re-encrypt payload+input for securelock's key
    SL->>SS: read payload+input, decrypt with own key
    SL->>SL: execute client code in SGX
    SL->>SS: write encrypted result + status code
    TZ->>SS: read result
    TZ->>SC: sign & submit _addResultToOrder (Proof of eXecution)
    User->>SC: read result reference from the order
    User->>IPFS: download encrypted result, decrypt with private key
```

In words: the user encrypts and uploads the payload/input, then places an on-chain request. A node matches the order, downloads the encrypted data, and starts the enclaves. trustedzone validates and re-encrypts for securelock; securelock executes the code and returns an encrypted result; trustedzone signs the Proof of eXecution and the node writes it on-chain. The user reads the proof from the order, downloads the encrypted result, and decrypts it with their own key. The data is encrypted at every hop — the only place it is ever clear is inside the enclave.

### DO-request metadata (v3)

`addDORequest` submits three colon-delimited metadata strings:

| Field          | Format                                                                                            | Notes                                    |
| -------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------- |
| Image metadata | `v3:<image_ipfs_hash>:<image_name>:<docker_compose_ipfs_hash>:<challenge_ipfs_hash>:<public_key>` | The **challenge** IPFS hash is required. |
| Code metadata  | `v3:<payload_ipfs_hash>:<code_checksum>`                                                          | The **payload** IPFS hash is required.   |
| Input metadata | `v3:<input_ipfs_hash>:<fileset_checksum>`                                                         | The input IPFS hash is optional.         |

If a required hash is missing the request cannot be fulfilled; the SDKs validate uploads before submitting, so a failed IPFS upload aborts the request instead of producing an un-runnable order.

The execution status code carried in every Proof of eXecution is listed in [Reference & troubleshooting](https://docs.ethernity.cloud/developer-guide/the-guide/reference-and-troubleshooting).

Ready to build? Continue to [Set up your environment](https://docs.ethernity.cloud/developer-guide/the-guide/environment-prerequisites).


# The GUIDE

The hands-on chapters. Read them in this order and you go from an empty folder to a published, stateful confidential dApp with a web UI:

1. [Environment Prerequisites](https://docs.ethernity.cloud/developer-guide/the-guide/environment-prerequisites) — IDE, Python or Node, Docker, the SDK, tokens, wallet.
2. [Build & publish your first dApp](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp) — scaffold → backend → enclave → on-chain.
3. [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp) — `ecld-test` locally for free, `ecld-run` on the network.
4. [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr) — encrypted persistent state, ownership, exactly-once commits.
5. [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp) — free on-chain diagnostics with `ecld-info`.
6. [Step-by-Step dApp](https://docs.ethernity.cloud/developer-guide/the-guide/step-by-step-dapp) — a React frontend on the dApp you published.
7. [Reference & troubleshooting](https://docs.ethernity.cloud/developer-guide/the-guide/reference-and-troubleshooting) — commands, status codes, the result envelope.

New here? Read [How it works](https://docs.ethernity.cloud/developer-guide/how-it-works) first — ten minutes of concepts that make everything else obvious.


# Environment Prerequisites

**1. IDE**

For a streamlined development process, we recommend using Visual Studio Code—a powerful and versatile code editor that offers a seamless experience for developers. You can download Visual Studio Code from the official [website](https://code.visualstudio.com/).

After running the IDE, a new workspace will be created, where you can start developing the framework and code.

**2. Language runtime — Python or Node.js**

Your backend runs inside the enclave in the language of your template: **Python 3.10+** (Pynithy) or **Node.js 16+** (Nodenithy). Install the one you will write in:

* Python: <https://www.python.org/downloads/>
* Node.js: <https://nodejs.org/en/download>

(React is only needed later, if you put a web frontend on your dApp — see [Step-by-Step dApp](https://docs.ethernity.cloud/developer-guide/the-guide/step-by-step-dapp).)

**3. Docker**

`ecld-build` bakes your backend into attestable enclave images using Docker. Install Docker Desktop and make sure `docker` runs: <https://www.docker.com/products/docker-desktop/>

**4. The SDK**

```sh
pip install ethernity-cloud-sdk-py      # Python
npm install @ethernity-cloud/sdk-js     # JavaScript
```

Verify the install with `ecld-init --help`.

**5. Testnet tokens**

Publishing and running on the testnet costs testnet tokens — claim them free at the [Testnet Faucet](https://docs.ethernity.cloud/testnet/testnet-faucet) once your wallet (next step) is set up.

**6. Wallet Setup**

A wallet is a crucial tool within the Ethernity Cloud ecosystem, empowering users to securely store and transfer their data for processing. As a developer, having a Web3 dApp testing wallet is necessary.

The wallet setup process with Metamask is detailed here: [Getting started with MetaMask](https://support.metamask.io/hc/en-us/articles/360015489531-Getting-started-with-MetaMask).

Currently, there are two networks for using Ethernity Cloud. Please set up your wallet for the desired network following one of the articles below:

**TestNet Network on bloxberg**

{% content-ref url="/pages/D1In0HHWu8bTmw9N2zy5" %}
[tETNY on Bloxberg](/ethernity-node/configuring-the-node/select-the-network/testnet-on-bloxberg/tetny-on-bloxberg)
{% endcontent-ref %}

**Mainnet Network on bloxberg**

{% content-ref url="/pages/-MZ-JJzm5J\_p6v6tZ0Y6" %}
[ETNY on Bloxberg](/ethernity-node/configuring-the-node/select-the-network/mainnet-on-bloxberg/connect-to-the-bloxberg-blockchain)
{% endcontent-ref %}

### The SDK commands

Installing the SDK gives you six commands. You'll use them roughly in this order:

| Command        | What it does                                                       |
| -------------- | ------------------------------------------------------------------ |
| `ecld-init`    | scaffold a new dApp project                                        |
| `ecld-build`   | bake your backend into the enclave images                          |
| `ecld-publish` | register the enclaves on-chain                                     |
| `ecld-test`    | run a payload locally, with no gas — see **Running your dApp**     |
| `ecld-run`     | run a payload on the network — see **Running your dApp**           |
| `ecld-info`    | inspect your enclaves and ESR state — see **Inspecting your dApp** |

In the JavaScript SDK, prefix each with `npx` (e.g. `npx ecld-test`). Verify your install with `ecld-init --help`.

Next: [Step-by-Step dApp](https://docs.ethernity.cloud/developer-guide/the-guide/step-by-step-dapp) walks you through building your first dApp. [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp) covers `ecld-test` and `ecld-run`; [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp) covers `ecld-info`.


# Step-by-Step dApp

Now put a web UI on the dApp you published. This chapter builds a React frontend that calls your enclave's functions through the runner — the browser submits a payload, the network executes it in your enclave, and the decrypted result comes back to the page. If you haven't published a dApp yet, start with [Build & publish your first dApp](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp).

**Project Setup**

To initiate the creation of a new React app using `npx create-react-app`, follow these steps:

1. Ensure that you have Node.js and npm (Node Package Manager) installed on your system.
2. Open your terminal or command prompt.
3. Execute the following command:

```
npx create-react-app my-app
```

Replace "my-app" with your desired name for the React app. This command will establish a new directory named "my-app" and configure a basic React application structure within it.

4. After the process completes, navigate to the newly created directory:

```
cd my-app
```

5. Launch the development server:

```
npm start
```

This action will start the development server and automatically open your React app in a web browser. You can now commence building your React application by making changes to the files within the "src" directory.

Utilizing `npx create-react-app` presents a swift and straightforward method for initializing a new React project with all the essential configurations and dependencies, freeing you to concentrate on developing your app without concerning yourself with the initial setup.

**Ethernity Cloud Runner package installation**

To begin developing with the Ethernity Cloud Runner, you can easily set up your environment by installing the package using npm:

```
$ npm install @ethernity-cloud/runner --save
```

This command will install the Ethernity Cloud Runner package and save it as a dependency in your project. With the package installed, you're ready to start utilizing the Ethernity Cloud Runner functionality and explore its capabilities for your application development.

**Ethernity Cloud Runner usage and integration**

This comprehensive guide explains the seamless integration of the Ethernity Cloud Runner module into your React application, empowering developers to execute Python tasks. The following sections elaborate on the integration process:

1. **Import Statements:**

   Begin by editing /src/App.js and by importing the essential modules and styles. Import `./App.css` for styling, and the pivotal pieces from the `@ethernity-cloud/runner` package: the default `EthernityCloudRunner` class plus `ECRunner`, `ECStatus`, and `ECAddress` from the enums entry point.

   These are what you use to interact with the runner, pick the enclave image, react to task status, and select the network.

```javascript
import './App.css';
import EthernityCloudRunner from "@ethernity-cloud/runner";
import { ECRunner, ECStatus, ECAddress } from "@ethernity-cloud/runner/enums";
```

2. **Defining Code to be Executed:**

   The Ethernity Cloud Runner allows users to execute tasks using different programming languages and frameworks. Currently, the runner supports two main templates: Python and Node.js. Users can define the code to be executed within these templates to perform specific tasks on the Ethernity Cloud ecosystem.<br>

   **Python Template:**

   In the Python template, users can write their code in Python programming language.

   Below there is an example of Python code that returns

   ```javascript
   str = "Hello World!";

   ___etny_result___("Hello, World!");
   ```

   \
   **Node.js Template:**\
   For those who prefer JavaScript, the Node.js template offers a powerful option.

   Below there is an example of Node.js code that computes the sum of two numbers:

   ```javascript
   const string = "Hello World!";

   ___etny_result___(string);
   ```

   \
   To use either template, users need to provide the code in the corresponding programming language that defines the specific task they want to execute.\
   \
   As you can see, the`___etny_result___` function is specially used inside a Ethernity Cloud Runner tasks. When executing a task, this function allows the task code to send the result back to the Ethernity Cloud ecosystem.
3. `___etny_result___` is the legacy result API and keeps working unchanged. New code should return through `ecldResult(...)` (Python: `ecld_result`) instead — it encodes any value automatically (JSON / text / base64) and can attach your dApp's persistent state to the result. See [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr).

   Because there is no output console of the code that is being process, this special function plays a crucial role in ensuring that the results of executed tasks are safely recorded and sent to the user performing the task request.\
   \
   For our example we are using the following nodejs code:

   ```javascript
   const code = `___etny_result___("Hello, World!")`;
   ```
4. **App Function Component:**

   Define the `App` function component, which plays a pivotal role in rendering the entire application.

```javascript
function App() {
}

export default App;
```

4. **Execute Task Function:**

Within the `App` function, define the `executeTask` function as an asynchronous function that triggers upon clicking the "Execute task" button.

```javascript
const executeTask = async () => {
};
```

5. **Runner Initialization:**

The first crucial step involves creating an instance of the `EthernityCloudRunner`. Initialize the runner by constructing:

```javascript
const runner = new EthernityCloudRunner();
```

Called with no arguments, the runner targets the **Bloxberg testnet** and uses the browser wallet (MetaMask via `window.ethereum`).

**Selecting a network.** The constructor takes the network's token contract address as its first argument (import the addresses from `@ethernity-cloud/runner/enums`). Ethernity Cloud supports the following networks:

| Network          | Type    | Chain ID | Address enum                         |
| ---------------- | ------- | -------- | ------------------------------------ |
| Bloxberg         | mainnet | 8995     | `ECAddress.BLOXBERG.MAINNET_ADDRESS` |
| Bloxberg         | testnet | 8995     | `ECAddress.BLOXBERG.TESTNET_ADDRESS` |
| Polygon          | mainnet | 137      | `ECAddress.POLYGON.MAINNET_ADDRESS`  |
| Polygon Amoy     | testnet | 80002    | `ECAddress.POLYGON.TESTNET_ADDRESS`  |
| IoTeX            | testnet | 4690     | `ECAddress.IOTEX.TESTNET_ADDRESS`    |
| Ethereum Sepolia | testnet | 11155111 | `ECAddress.SEPOLIA.TESTNET_ADDRESS`  |
| LitVM LiteForge  | testnet | 4441     | `ECAddress.LITVM.TESTNET_ADDRESS`    |

```javascript
import { ECAddress } from "@ethernity-cloud/runner/enums";

// e.g. run on Polygon Amoy
const runner = new EthernityCloudRunner(ECAddress.POLYGON.TESTNET_ADDRESS);
```

The IoTeX, Sepolia, and LitVM testnets share a single ECLD token address, so the runner reads the chain ID from your wallet/provider to tell them apart. When you connect a browser wallet or pass a `provider`, this is automatic. If you drive the runner with a raw private key instead, pass the network's chain ID as the third constructor argument (and an `rpcUrl` in the wallet options) so the correct chain is selected:

```javascript
const runner = new EthernityCloudRunner(
    ECAddress.IOTEX.TESTNET_ADDRESS,
    { privateKey: "0x…", rpcUrl: "https://babel-api.testnet.iotex.io" },
    4690 // IoTeX Testnet chain ID
);
```

Make sure the enclave image you pass to `runner.run(...)` (step 8) belongs to the same network — the `ECRunner` enum is keyed by network, e.g. `ECRunner.IOTEX.PYNITHY_RUNNER_TESTNET` for IoTeX or `ECRunner.BLOXBERG.PYNITHY_RUNNER_TESTNET` for Bloxberg.

6. **Decentralized Storage Initialization:**

Next, initialize the Ethernity Cloud Runner's decentralized storage by specifying the IPFS address where it will communicate with the IPFS network.

```javascript
// this is a server provided by Ethernity CLOUD, please bear in mind that you can use your own Decentralized Storage server
const ipfsAddress = 'https://ipfs.ethernity.cloud';
runner.initializeStorage(ipfsAddress);
```

For this integration, you have multiple options to initialize the storage:

* **Ethernity Cloud IPFS Server (Recommended for Development):**

Utilize the default IPFS address '[https://ipfs.ethernity.cloud](https://ipfs.ethernity.cloud/)' provided by Ethernity Cloud, which serves as an efficient option for development purposes. It ensures seamless initialization with the specified IPFS address, allowing you to focus on task execution without managing your own IPFS infrastructure.

* **Custom IPFS Server:**

Alternatively, if you have your own IPFS server set up or prefer to use a different IPFS address, you can provide the desired IPFS address to the runner.initializeStorage(ipfsAddress) method. This option empowers you to leverage any IPFS infrastructure that suits your specific requirements.

* **Other Decentralized Storage Solutions:**

Ethernity Cloud Runner offers the flexibility to integrate with various decentralized storage solutions beyond IPFS. While IPFS is the default and recommended option, you can explore other decentralized storage systems based on your needs and preferences.

7. **Events subscription:**

The runner is an `EventTarget`. As a task moves through its lifecycle it dispatches `CustomEvent`s **named by the task status**, so you subscribe using the `ECStatus` values:

* `ECStatus.DEFAULT` (`"Running"`) — progress updates while the task is encrypting, being submitted, matched, and processed.
* `ECStatus.SUCCESS` (`"Success"`) — the task finished and a result is available.
* `ECStatus.ERROR` (`"Error"`) — something failed.

Each event's `detail` carries `{ message, status, progress }`, where `progress` is a human-readable phase label (one of the `ECEvent` values, e.g. `"In Progress"`, `"Downloading result"`, `"Finished"`).

```javascript
const onProgress = (e) => {
    console.log(`[${e.detail.progress}] ${e.detail.message}`);
};

const onSuccess = async (e) => {
    // The result is available on the runner once the Success event fires.
    const result = await runner.getResult();
    console.log(`Task Result: ${result}`);
};

const onError = (e) => {
    console.error(e.detail.message);
};

runner.addEventListener(ECStatus.DEFAULT, onProgress); // "Running" progress updates
runner.addEventListener(ECStatus.SUCCESS, onSuccess);
runner.addEventListener(ECStatus.ERROR, onError);
```

By subscribing to these three status events, developers can follow the execution phase-by-phase (via `e.detail.progress`) and fetch the final result with `await runner.getResult()` once `ECStatus.SUCCESS` fires.

8. **Task Execution:**

```javascript
// Resource requirements for the task.
const resources = { taskPrice: 10, cpu: 1, memory: 1, storage: 40, bandwidth: 1, duration: 1, validators: 1 };

await runner.run(resources, ECRunner.BLOXBERG.PYNITHY_RUNNER_TESTNET, code);
```

The heart of the integration is the `await runner.run(...)` line, which initiates task execution. The function signature is `run(resources, secureLockEnclave, code, nodeAddress = '', trustedZoneEnclave)`:

* **Resources:** An object describing the resources the task needs — `taskPrice` (in the network's token), `cpu`, `memory` (GB), `storage` (GB), `bandwidth`, `duration`, and `validators`.
* **Enclave image (`secureLockEnclave`):** The enclave image to execute the task, taken from the network-keyed `ECRunner` enum. Two templates are available per network:
  * Python: `ECRunner.<NETWORK>.PYNITHY_RUNNER_TESTNET`
  * Node.js: `ECRunner.<NETWORK>.NODENITHY_RUNNER_TESTNET`

    where `<NETWORK>` matches the network you selected in step 5 (`BLOXBERG`, `POLYGON`, `IOTEX`, `SEPOLIA`, `LITVM`). Mainnet variants drop the `_TESTNET` suffix.
* **Code:** The code to execute as the task (preserve proper indentation for Python).
* **Node Address (Optional):** Provide an EC node's wallet address to auto-approve the order on that node; omit it (empty string) to have the order matched and manually approved by any available node.
  * **Manual Approval:** Omitting the node address lets the network match and approve the task.
  * **Automatic Approval:** Passing a node address targets that node for a seamless, quick execution.

9. **Rendering the Button**

```javascript
return (
    <div className="container">
        <button className="centeredButton" onClick={executeTask}>Execute Task</button>
    </div>
);
```

10. **Final application code**

```javascript
import './App.css';
import EthernityCloudRunner from "@ethernity-cloud/runner";
import { ECRunner, ECStatus, ECAddress } from "@ethernity-cloud/runner/enums";

const code = `___etny_result___("Hello, World!")`;

// example of a Node.js script
// const jsCode = `function add(a, b) { return a + b; }\n ___etny_result___(add(1, 10).toString());`;

function App() {
    const executeTask = async () => {
        // No network address -> Bloxberg testnet with the browser wallet.
        // To target another network, pass its address, e.g.
        //   new EthernityCloudRunner(ECAddress.POLYGON.TESTNET_ADDRESS);
        const runner = new EthernityCloudRunner();

        // Ethernity CLOUD Decentralized Storage server (you may use your own).
        const ipfsAddress = 'https://ipfs.ethernity.cloud';
        runner.initializeStorage(ipfsAddress);

        const onProgress = (e) => {
            console.log(`[${e.detail.progress}] ${e.detail.message}`);
        };
        const onSuccess = async () => {
            const result = await runner.getResult();
            console.log(`Task Result: ${result}`);
        };
        const onError = (e) => {
            console.error(e.detail.message);
        };

        runner.addEventListener(ECStatus.DEFAULT, onProgress); // "Running" updates
        runner.addEventListener(ECStatus.SUCCESS, onSuccess);
        runner.addEventListener(ECStatus.ERROR, onError);

        const resources = { taskPrice: 10, cpu: 1, memory: 1, storage: 40, bandwidth: 1, duration: 1, validators: 1 };

        // Pick the enclave image for your network and language:
        //   - Python : ECRunner.<NETWORK>.PYNITHY_RUNNER_TESTNET
        //   - Node.js: ECRunner.<NETWORK>.NODENITHY_RUNNER_TESTNET
        // We use the Bloxberg Python testnet enclave here.
        await runner.run(resources, ECRunner.BLOXBERG.PYNITHY_RUNNER_TESTNET, code);
        // For Node.js instead:
        // await runner.run(resources, ECRunner.BLOXBERG.NODENITHY_RUNNER_TESTNET, code);
    };

    return (
        <div className="container">
            <button className="centeredButton" onClick={executeTask}>Execute Task</button>
        </div>
    );
}

export default App;
```

11. **Application styling**

Now, navigate to the src/App.css file and proceed to enhance its content by adding the following CSS classes:

```css
.container {
    /* Set the container to flex to align the button horizontally and vertically */
    display: flex;
    justify-content: center; /* Center horizontally */
    align-items: center; /* Center vertically */
    height: 100vh; /* Adjust the container's height based on your requirement */
}

.centeredButton {
    /* Add your button styles here */
    padding: 10px 20px;
    background-color: #007bff;
    color: #fff;
    border: none;
    cursor: pointer;
    font-size: 16px;
    border-radius: 5px;
}
```

In conclusion, the above-mentioned code elegantly integrates the Ethernity Cloud Runner into your React app, enabling seamless execution of Python/Node.js code snippets while facilitating interaction with the IPFS network for efficient data storage and retrieval. As a professional developer, you can now leverage this integration to enhance your React applications with powerful decentralized task execution capabilities.


# Build & publish your first dApp

This is the full path from an empty folder to a confidential dApp registered on the network: scaffold, write a backend function, prove it locally, bake it into an enclave, publish. Every step uses one command, and nothing costs gas until the very last one.

Before starting, make sure your toolchain is ready — see [Environment Prerequisites](https://docs.ethernity.cloud/developer-guide/the-guide/environment-prerequisites).

### 1. Scaffold — `ecld-init`

Install the SDK and initialize the project. Python:

```sh
pip install ethernity-cloud-sdk-py
ecld-init
```

JavaScript:

```sh
npm install @ethernity-cloud/sdk-js
npx ecld-init
```

Answer the prompts: a project name (this becomes your enclave's on-chain name), the network (default **Bloxberg Testnet** — the right place to start), the service type, and whether to enable the **Enclave State Registry** (say yes if your dApp needs state that persists between tasks — see [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr)).

This writes your project config and scaffolds `src/serverless/` — the code that will run inside the enclave.

### 2. Write your backend

Your dApp's functions live in `src/serverless/backend.py` (or `backend.js`). Every exported function becomes callable from a task payload — the string a client submits.

```python
# src/serverless/backend.py
def hello(msg="World"):
    return "Hello " + msg
```

```javascript
// src/serverless/backend.js
function hello(msg = 'World') {
  return 'Hello ' + msg;
}
module.exports = { hello };
```

Return plain data — it is encoded automatically (JSON for objects, text for strings, base64 for bytes). To attach persistent state to the result, return through `ecld_result(...)` — see the [ESR page](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr).

### 3. Prove the call locally — `ecld-test`

Before building anything, run your function with the enclave's own executor — instant, no SGX, no gas:

```sh
ecld-test 'hello("World")'
```

This catches wrong names, bad arguments, and broken imports **before** anything is paid for. If your backend uses ESR, the state registry is emulated locally, on by default. Full reference: [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp).

### 4. Bake the enclave — `ecld-build`

```sh
ecld-build
```

This bakes your backend into the securelock enclave image (Docker required). It also refuses unsafe patterns — dynamic execution of task input — and, for ESR projects, fills in the correct registry contract for your network. The result is an attestable image whose measurement will be registered on-chain, so the network can verify a node runs your exact, untampered code.

### 5. Publish — `ecld-publish`

```sh
ecld-publish
```

This registers your enclaves in the on-chain Image Registry: certificates are extracted, the image goes to IPFS, and the registration transaction is paid by your wallet — so you need testnet tokens first: grab them free at the [Testnet Faucet](https://docs.ethernity.cloud/testnet/testnet-faucet).

Confirm it landed — free, read-only:

```sh
ecld-info
```

Both enclaves should show **published** and **validated** — see [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp).

### 6. Run it on the network

```sh
ecld-run 'hello("World")'
```

Your code executes inside a real SGX enclave on a network node, and the decrypted result comes back to your terminal. From here:

* [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp) — the full `ecld-test` / `ecld-run` reference
* [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr) — give your dApp durable, encrypted state
* [Step-by-Step dApp](https://docs.ethernity.cloud/developer-guide/the-guide/step-by-step-dapp) — put a web frontend on what you just published


# Running your dApp

You have two commands for running a payload. They take the same payload — a code string, or `--file`, with input via `--input` / `--input-text` — so you move from one to the other without rewriting anything.

| Command     | Where it runs                                | Costs gas?               | Answers                                                         |
| ----------- | -------------------------------------------- | ------------------------ | --------------------------------------------------------------- |
| `ecld-test` | locally, in the enclave's own executor       | no                       | *Does my call work?* — function names, arguments, result wiring |
| `ecld-run`  | on the network, on the enclave you published | yes (needs a funded key) | *Does it work on the network, on my published enclave?*         |

Start with `ecld-test` — it is instant and free, and catches almost every mistake. Reach for `ecld-run` once the call is correct and you want a real end-to-end run.

### Test locally — `ecld-test`

Runs your payload with the same executor that is baked into the securelock enclave: same backend reflection, same `___etny_result___` / `___etny_data_set___` scope, same task-status codes. No SGX, no gas, no wallet.

```sh
ecld-test 'hello("World")'
ecld-test --file payload.py
ecld-test --input data.json 'process(___etny_data_set___)'
```

(In the JavaScript SDK, prefix with `npx`: `npx ecld-test 'hello("World")'`.)

Exit code is 0 on `SUCCESS`, 1 otherwise, so it drops straight into CI.

#### ESR is emulated locally, on by default

If your dApp uses the Enclave State Registry, `ecld-test` emulates it in-process: `StateRegistry` get/commit, the ownership/ACL API, and `task_caller()` all behave exactly as they do on-chain, against an in-memory registry and store — zero orders, zero gas. State **persists between runs** in `.ecld-esr-local.*.json`, so a counter advances across invocations just like real state:

```sh
ecld-test 'esr_increment()'   # -> before {}      after {"n": 1}  version 1
ecld-test 'esr_increment()'   # -> before {"n":1} after {"n": 2}  version 2
```

The task caller (the data-owner address the trustedzone attests on the real network) defaults to your developer address and is set for every task. Override it to test the ACL from another identity:

```sh
ecld-test --caller 0xabc...def 'esr_increment()'   # a stranger -> denied if not granted
```

#### Drive your real integration — `ecld-test serve`

```sh
ecld-test serve            # local API on http://127.0.0.1:8745
```

Starts a local API that speaks the same protocol as the network. Point your runner at LOCAL mode and every `run()` executes against this API instead of the blockchain — so you exercise your actual frontend/runner integration end to end, still with no gas.

### Run on the network — `ecld-run`

Submits the payload to the network and prints the decrypted result. It drives the full path — encrypt → IPFS → on-chain request → wait for a node → download and decrypt — and **costs gas**, so it needs a funded key.

```sh
ecld-run 'hello("World")'
ecld-run --file payload.py
ecld-run --input data.json 'process(___etny_data_set___)'
ecld-run --json 'esr_increment()'      # machine-readable result
```

Network and enclaves are read from your project config, exactly as `ecld-publish` wired them:

* **network** — `BLOCKCHAIN_NETWORK` (e.g. `Bloxberg_Testnet`)
* **securelock** — `PROJECT_NAME`
* **trustedzone** — `TRUSTED_ZONE_IMAGE`

Override any of them with `--network`, `--securelock`, `--trustedzone`.

The signing key pays for the order:

* **Python** — `ECLD_PRIVATE_KEY` (a plaintext `0x` key), or the encrypted `ENC_PRIVATE_KEY` unlocked with `ECLD_KEY_PASSWORD` (or an interactive prompt).
* **JavaScript** — `PRIVATE_KEY` (or `ECLD_PRIVATE_KEY`), a funded `0x` key.

Tune the task resources with `--task-price`, `--cpu`, `--memory`, `--storage`, `--bandwidth`, `--duration`, `--validators`. Other flags: `--node <addr>` to target a specific operator, `--ipfs <url>`, `--timeout <seconds>`, `--json`.

Exit code is 0 on a `SUCCESS` task result, and 1 on a runner error, a timeout, or a non-zero enclave task code — so a failed run is never mistaken for a pass.

> ESR state is enclave-private: a client cannot decrypt it. Anything the caller should see must be returned explicitly by the payload — which is the intended pattern. `ecld-run --json` shows the full result envelope, including the `esr` attachment metadata when present.

Next: give your dApp durable state in [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr) — `ecld-test` emulates it locally by default — and confirm what actually landed on-chain with [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp). New to the toolchain? Start at [Environment Prerequisites](https://docs.ethernity.cloud/developer-guide/the-guide/environment-prerequisites).


# Managing dApp State (ESR)

By default a task is stateless: it receives an input, computes, returns a result, and forgets everything. The **Enclave State Registry (ESR)** gives your dApp durable state that persists between tasks — encrypted inside the enclave, stored on IPFS, and pointed to on-chain.

The enclave is the only thing that can read it. That is the point: your state is not visible to the node running your task, to other dApps, or to anyone reading the blockchain.

### How it works

```
your backend            enclave (SGX)              chain
------------            -------------              -----
state.commit(...)  -->  encrypt state
                        compute the CID
                        publish to storage   -->   commit(key, cid, version)
```

Only a **pointer** goes on-chain — the content stays encrypted. Each key has a version that increments on every commit.

State is available network-wide: your next task can run anywhere and still read what the last task committed.

### Enabling it

Run `ecld-init` and answer **yes** at the Enclave State Registry step, or add this to `.config.json`:

```json
"ESR": {
  "enabled": true,
  "contract_address": ""
}
```

Leave `contract_address` empty. `ecld-build` fills in the correct registry for your network automatically, and refuses to build for a network where no registry is deployed.

### Using it in your backend

```python
from ecld_state import StateRegistry

def get_profile(user_id):
    return StateRegistry().get(f"profile-{user_id}")

def add_score(user_id, points):
    state = StateRegistry()
    return state.commit(
        f"profile-{user_id}",
        lambda s: {**s, "score": s.get("score", 0) + points},
    )
```

For Nodenithy (JavaScript) the API is the same:

```javascript
const { StateRegistry } = require('../ecld_state');

async function addScore(userId, points) {
  const state = new StateRegistry();
  return state.commit(`profile-${userId}`, (s) => ({
    ...s,
    score: (s.score || 0) + points,
  }));
}
```

#### The API

| Call                  | What it does                                                                   |
| --------------------- | ------------------------------------------------------------------------------ |
| `get(key)`            | Returns the decrypted state, or `{}` if nothing was ever stored                |
| `commit(key, mutate)` | Read-modify-write: `mutate` receives the current state and returns the new one |
| `get_version(key)`    | The current version number; `0` means never written                            |
| `wallet_address`      | The enclave's on-chain identity address — the namespace your state lives under |

`commit` uses optimistic concurrency. If another task commits between your read and your write, it re-reads and retries automatically, so parallel tasks cannot silently overwrite each other.

Two things in that table deserve a plain-language definition:

* **`mutate` is a function you supply.** It receives the current state (a dict / object — `{}` on first write) and returns the new state to store. You transform what is there instead of overwriting blindly, which is what makes concurrent commits safe.
* **`wallet_address` is the enclave's address — think of it as the&#x20;*****enclave address*****.** It is the enclave's own on-chain identity, derived inside the enclave; it is not your wallet and not the node's. Every state key you write lives under this address, and it is the address you pass to `ecld-info esr state --enclave <A>` to inspect your commits.

### Returning results: `ecld_result`

`ecld_result(...)` is the way to return a task's result. It replaces the older `___etny_result___` (which still works, unchanged) and adds two things:

* **Automatic encoding.** Return anything — a `dict`/`list`/number rides as JSON, a string as text, `bytes` as base64. You never encode by hand, and a result never fails on encoding.
* **State attached by default.** The result carries the ESR state of every key the task touched, so the caller gets the fresh state in the same result — no separate read task needed.

```python
def add_score(user_id, points):
    state = StateRegistry()
    new = state.commit(f"profile-{user_id}",
                       lambda s: {**s, "score": s.get("score", 0) + points})
    return ecld_result(new)               # value + attached state

def render_chart(match_id):
    png = draw(match_id)                   # bytes
    return ecld_result(png)                # auto base64

def cheap_ping():
    return ecld_result("ok", state=False)  # suppress the state attachment
```

```javascript
return ecldResult(next);                       // value + attached state
return ecldResult(buffer, { state: false });   // binary, no state
```

`state=True` (default) attaches full state for every key touched; `state="meta"` attaches only `{key, version, cid}`; `state=False` attaches nothing.

### The task caller

Inside the enclave, `task_caller()` returns the wallet that submitted the task (the DO-request owner). Use it to scope state per user without trusting anything the client sends:

```python
def my_profile():
    return StateRegistry().get(f"profile-{task_caller()}")
```

### State ownership and permissions

The first task to commit a key becomes its **owner** (the task caller at that moment). Only the owner can grant or revoke access; by default nobody else can read or write it.

```python
esr_grant(key, address, "read")      # let address read this key
esr_grant(key, address, "write")     # let address write this key
esr_revoke(key, address, "read")     # take it back
esr_set_public_read(key, True)       # anyone may read (writes still restricted)
esr_transfer(key, new_owner)         # hand ownership to another address
esr_owner(key)                       # the owner address, or None if unowned
esr_acl(key)                         # owner-only: the full permission list
```

```javascript
await esrGrant(key, address, 'write');
await esrSetPublicRead(key, true);
await esrTransfer(key, newOwner);
```

`get`/`commit` enforce these automatically: a caller with no permission gets a permission error, never the state. A granted **writer** can commit a key it does not own; a granted **reader** can read but not write.

### Exactly-once commits — the nonce

Every commit advances the key's nonce by exactly 1 — a public, on-chain counter (a free eth\_call reads it; no task, no gas). If you don't pass a nonce, the registry assigns the next value automatically. If the same task might be submitted twice (client retries, impatient users), pin the nonce yourself: read it and pass exactly the last accepted value + 1. A duplicate, stale, or skipped-ahead nonce fails the commit and the state is untouched.

```python
n = esr_nonce("orders")                     # last accepted nonce (0 if none)
state.commit("orders", apply_order, nonce=n + 1)
```

```javascript
const n = await esrNonce('orders');
await state.commit('orders', applyOrder, { nonce: n + 1 });
```

A duplicate returns task code 36 (ESR\_NONCE\_VIOLATION) — meaning "already applied", not a failure: the first submission did the work. Passing nonce=0 explicitly is refused by the SDK: 0 is only a wire-level sentinel for "no nonce given" — it never binds the commit to the value 0; the registry auto-assigns the next number instead, and pinned nonces start at 1. You can also pre-plan a batch: submit tasks with n+1, n+2, n+3 and they apply strictly in that order. Inspect the sequence any time with ecld-info esr nonce --enclave ADDRESS --key KEY.

### Reading state without paying for a task

Getting an enclave's current state normally means submitting a read task — a full order. The runner avoids that automatically: `esr_read` serves unchanged state straight from a cache after a **free** on-chain check, and places an order only when the state has actually changed. **The cache is on by default** — you don't enable anything.

```python
r = runner.esr_read(enclave="my_enclave", key=f"profile-{user}", node=NODE)
# r.state, r.version, r.from_cache
```

```javascript
const r = await runner.esrRead({ key: `profile-${user}`, registryAddress });
// r.state, r.version, r.fromCache
```

The cache refreshes automatically from every task result (results carry attached state), so right after a write the next read is a free cache hit. On a miss the runner runs one read task and re-caches. The free on-chain check means it never serves stale state.

Controls, if you need them: `enable_state_cache(file=...)` to persist across restarts (default is in-memory), and `disable_state_cache()` to turn it off. For an authenticated read (e.g. a per-user membership check), point it at your own read function with `read_code=` instead of the built-in fetch.

To wait for a state change to actually land — say, right after submitting a state-writing task — the runner polls the on-chain version for free (eth\_calls, no orders) instead of you guessing at a delay:

```python
v = runner.esr_version("dashboard", enclave_wallet=W)["version"]
# ... submit the state-writing task ...
runner.esr_wait_for_version("dashboard", v, enclave_wallet=W)   # returns when version > v
```

```javascript
const { version } = await runner.esrVersion({ key: 'dashboard', registryAddress, enclaveAddress });
// ... submit the state-writing task ...
await runner.esrWaitForVersion({ key: 'dashboard', sinceVersion: version, registryAddress, enclaveAddress });
```

### Designing your keys

A key is any string — keccak256 of it identifies the slot on-chain. Use one key per independent thing so unrelated writes never conflict:

* `profile-<user_id>` — one slot per user
* `game-<match_id>` — one slot per match
* `config` — a single global slot

Everything under one key is read and written together, so avoid putting unrelated data in the same key: two tasks touching different parts of it will contend over the same version.

### Testing it locally — free

`ecld-test` emulates the full ESR locally, **on by default**: `StateRegistry` get/commit, ownership and permissions, and `task_caller()` all behave exactly as on-chain, against an in-memory registry — zero orders, zero gas. State persists between runs in `.ecld-esr-local.*.json`, so a counter advances across invocations just like real state. Use `--caller` to test the ACL from another identity. See [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp).

To confirm a commit actually landed on-chain (the CID and version advanced), use `ecld-info esr state` — free, no task. See [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp).

### Testnet warning

On testnet there is no enclave attestation, which means the enclave identity — and therefore its wallet and its state encryption key — can be reproduced by anyone who runs your published image.

Treat testnet state as functional testing only:

* do not fund testnet enclave wallets with real value
* do not store real user data in testnet state

### Troubleshooting

| What you see                                                  | What it means                                                                                                                                                |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ESR is enabled but no ESR registry is deployed on <network>` | That network has no registry. Build for a supported network.                                                                                                 |
| Task returns `CONFIG_ERROR` (32)                              | The enclave was built without a required value. Re-run `ecld-build`.                                                                                         |
| Task returns `ESR_GAS_LIMIT_EXCEEDED` (34)                    | The task's commits exceeded its gas budget. Commit less often or batch state changes under fewer keys.                                                       |
| Task returns `SECURITY_VIOLATION` (35)                        | A state commit ran under a caller that was not the task submitter — the ownership check was bypassed. Do not forge the caller; commit as the real submitter. |
| Task fails with a stack trace as the result                   | Your backend raised during execution. The full traceback is returned as the task result — read it; the enclave is fine and the order completed.              |
| `holds a pointer that is not a CID`                           | A previous version of your code wrote an invalid pointer.                                                                                                    |

### A complete example

The SDK ships a working end-to-end example at `examples/esr-counter`. Its `esr_selftest()` function needs no gas and no chain access, so it is the fastest way to confirm your enclave is built correctly before you start debugging.


# Inspecting your dApp

`ecld-info` is the read-only diagnostic for your dApp. It answers "what is actually registered on-chain, and is it healthy?" — the network, both enclaves, and your ESR state — **without a task, a private key, or any gas**. It is pure `eth_call` and event logs, so run it as often as you like.

It reads your project's identity from `.config.json` (network, image name, IPFS hash), so from your project root you can just run:

```sh
ecld-info
```

(In the JavaScript SDK, prefix with `npx`: `npx ecld-info`.)

### What it reports

| Section         | Tells you                                                                                                                                      |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **NETWORK**     | name, type, chain id, RPC, contract addresses, and the live block / health — is the chain reachable and are you pointed at the right one       |
| **TRUSTEDZONE** | the gatekeeper enclave's Image Registry record: published, validated, image hash, MRENCLAVE session, reward address                            |
| **SECURELOCK**  | the executor enclave's Image Registry record — the same fields                                                                                 |
| **ESR**         | the registry address, the total number of keys, and — with `--enclave <wallet>` — this enclave's state keys and recent `StateCommitted` events |

Run a single section by name when that's all you need:

```sh
ecld-info network
ecld-info trustedzone
ecld-info securelock
ecld-info esr
```

### Inspecting ESR state

ESR queries live under the `esr` subcommand. They read the on-chain registry directly — no order, no gas — so you can confirm what your enclave actually committed:

```sh
ecld-info esr address                          # the ESR registry contract address
ecld-info esr count                            # total keys registered
ecld-info esr state   --enclave <A> --key <K>  # the CID + version for one key
ecld-info esr version --enclave <A> --key <K>  # just the current version
ecld-info esr list    [--start N] [--limit M]  # enumerate registered entries
```

`<A>` is the enclave's ESR wallet — the address its commits are filed under (the one `StateRegistry().wallet_address` returns, and that `ecld-info esr` prints). Because ESR state is encrypted for the enclave, `ecld-info` shows the **pointer and version**, not the plaintext — proof that a commit landed and advanced, without exposing what only the enclave can read.

### Finding the right registration

The Image Registry is keyed by the image's **IPFS hash**. `ecld-info` resolves which record to read in this order:

* `--ipfs <hash>` — read that exact record.
* `--name <name>` — resolve the latest registered version of that image name.
* neither — use `IPFS_HASH` / `PROJECT_NAME` from `.config.json`.

Network resolution follows the same convenience chain: `--network NAME`, else the `ESR_NETWORK` environment variable, else `.config.json`'s `BLOCKCHAIN_NETWORK`, else Bloxberg testnet.

### When to reach for it

* After `ecld-publish` — confirm both enclaves show **published** and **validated**, with a real image hash and MRENCLAVE session.
* When a run fails to match a node — check you're on the right **network** and that the **securelock** you expect is the one registered.
* After an ESR write — `ecld-info esr state` confirms the CID and version advanced on-chain.
* Any time you need an enclave's addresses, reward address, or IPFS hashes for a support request — it's the one lookup page that has them all.

See also: [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp) for `ecld-test` / `ecld-run`, and [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr) for how state gets committed in the first place.


# Reference & troubleshooting

The lookup page: every command, every task status code, and the result envelope — with pointers to the page that explains each in depth.

### The SDK commands

| Command        | What it does                                 | Details                                                                                                     |
| -------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `ecld-init`    | scaffold a new dApp project                  | [Build & publish](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp) |
| `ecld-build`   | bake your backend into the enclave images    | [Build & publish](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp) |
| `ecld-publish` | register the enclaves on-chain               | [Build & publish](https://docs.ethernity.cloud/developer-guide/the-guide/build-and-publish-your-first-dapp) |
| `ecld-test`    | run a payload locally — no gas, ESR emulated | [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp)               |
| `ecld-run`     | run a payload on the network                 | [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp)               |
| `ecld-info`    | read-only enclave & on-chain diagnostics     | [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp)         |

In the JavaScript SDK, prefix each with `npx`.

### Task status codes

Every task returns a status code with its result. `ecld-test` and `ecld-run` print the name; the runner exposes it on the result object.

| Code  | Name                     | Meaning                                                                                                                   |
| ----- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| 0     | `SUCCESS`                | The task ran and returned a result.                                                                                       |
| 1     | `SYSTEM_ERROR`           | The executor failed outside your code.                                                                                    |
| 2     | `KEY_ERROR`              | The payload referenced a missing key/name.                                                                                |
| 3     | `SYNTAX_WARNING`         | The payload did not parse.                                                                                                |
| 4     | `BASE_EXCEPTION`         | Your backend raised — the full traceback IS the result; read it.                                                          |
| 5     | `PAYLOAD_NOT_DEFINED`    | No payload was supplied.                                                                                                  |
| 6     | `PAYLOAD_CHECKSUM_ERROR` | The payload failed its integrity check.                                                                                   |
| 7     | `INPUT_CHECKSUM_ERROR`   | The input failed its integrity check.                                                                                     |
| 28    | `IMPORT_ERROR`           | The serverless backend failed to load inside the enclave (missing dependency, bad import).                                |
| 32    | `CONFIG_ERROR`           | The enclave was built without a required value — re-run `ecld-build`.                                                     |
| 33    | `EXECUTION_TIMEOUT`      | The task produced no result within the order duration.                                                                    |
| 34    | `ESR_GAS_LIMIT_EXCEEDED` | State commits exceeded the per-order relayed-gas budget — commit less often or batch keys.                                |
| 35    | `SECURITY_VIOLATION`     | A state commit ran under a caller that was not the task submitter — the ownership check was bypassed.                     |
| 36    | `ESR_NONCE_VIOLATION`    | A commit's idempotency nonce was already used — duplicate suppressed, state unchanged ("already applied", not a failure). |
| 40–49 | operator faults          | The node, not your code, failed; the runner resubmits these automatically.                                                |

### The result envelope

Every result is a structured envelope; the runner decodes it for you:

```json
{ "ecld": 1, "type": "json|text|base64", "data": "...", "esr": { "wallet": "0x...", "entries": [ { "key": "...", "version": 2, "cid": "bafk...", "state": { } } ] } }
```

* Return plain data from your backend and it is encoded automatically — objects as `json`, strings as `text`, bytes as `base64`.
* `ecld_result(data)` (JS: `ecldResult`) attaches the ESR state of every key the task touched (`esr`); `state=False` suppresses it, and the legacy `___etny_result___` still works with no attachment.
* The runner's state cache refreshes from every envelope, which is what makes `esr_read` free for unchanged state — see [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr).

### When something fails

* **Locally first.** Reproduce with `ecld-test` — same executor, same codes, no gas. [Running your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/running-your-dapp)
* **Check what is registered.** `ecld-info` shows the network, both enclaves (published / validated / hashes), and ESR state — free. [Inspecting your dApp](https://docs.ethernity.cloud/developer-guide/the-guide/inspecting-your-dapp)
* **Code 4 with a traceback?** That traceback is your backend's real error — the enclave is fine and the order completed.
* **ESR-specific failures** (broken pointer, gas budget, permissions, nonce) — the troubleshooting table on [Managing dApp State (ESR)](https://docs.ethernity.cloud/developer-guide/the-guide/managing-dapp-state-esr).
* **Out of testnet tokens?** [Testnet Faucet](https://docs.ethernity.cloud/testnet/testnet-faucet).


# Introduction

This guide provides detailed steps to register an ENS domain on the **Polygon** and **Bloxberg** blockchains. The ENS implementation on these blockchains has been modified to simplify payment processes and domain duration settings. The payment is fixed at 100 coins (ECLD for Polygon and ETNY for Bloxberg), and the registration duration is effectively infinite (584,554 years). However, the input duration must be more than 28 days (in seconds) for validation purposes.

&#x20;


# ENS Smart Contract Details


# Polygon Mainnet

·       ENSRegistry Contract Address: 0xE99cc021C7A8A357808eC36F292d37ce6031C8af

·       ENSRegistrarController Contract Address: 0x6b2e4Ab8092A5CEA6cF90efca00d0ECB859FfFDc

·       ReverseRegistrar Contract Address: 0x8b21694042cFEcafAB48De8577BFC90A50DaB372

·       PublicResolver Contract Address: 0xc306d6e4A5A33fe37524e20565e1235C2844133d

·       OwnedResolver Contract Address: 0xf5739Bf7B91f74cec24fd4B23Cf2b99D4731e546

·       BaseRegistrar Contract Address: 0x04E43b8526E9481d105910b7503411E7FfCFffeB

·       NameWrapper Contract Address: 0x85bf052E5B98fC84Aad90cd9C5726a31aB0c6E35


# Bloxberg Mainnet

·       ENSRegistry Contract Address: 0x05CF7B224a0B5162C7eFaC5f7A4D7063f02E0E44

·       ENSRegistrarController Contract Address: 0x1564DB645054BC9302E148d059cA7F86C5095d31

·       ReverseRegistrar Contract Address: 0x0AD5a53A8e4DF32Bd35964b1Aef1f67f2a1cb998

·       PublicResolver Contract Address: 0x44088e1e87DFe2B751347347b01C1aCcd8665F09

·       OwnedResolver Contract Address: 0x824a98ca21c01a0942449f44ed53f5c8aee88dfd

·       BaseRegistrar Contract Address: 0xA7D797864fD5e59e8c14561ee7B24492DE980DDe

·       NameWrapper Contract Address: 0xC433C30522615f2f00421dacdF291c47D8C3A824


# Registration Steps (ENSRegistrarController)

## 1. Commit Reveal Process

The ENSRegistrarController uses a commit-reveal scheme to prevent front-running. Here’s how to perform the commit and reveal process:

**1.1. Make Commitment**

First, generate a commitment hash using the makeCommitment function. This hash is opaque and is revealed during the registration process.

`Function:`

`function makeCommitment(`\
&#x20;   `string memory name,`\
&#x20;   `address owner,`\
&#x20;   `uint256 duration,`\
&#x20;   `bytes32 secret,`\
&#x20;   `address resolver,`\
&#x20;   `bytes[] memory data,`\
&#x20;   `bool reverseRecord,`\
&#x20;   `uint16 ownerControlledFuses`\
`) public pure returns (bytes32)`

`Example:`

`makeCommitment(`\
&#x20;   `"myname",                // Domain label`\
&#x20;   `0x1234567890abcdef,      // Owner address`\
&#x20;   `31536000,                // Duration (1 year in seconds)`\
&#x20;   `0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890, // Secret (32 bytes)`\
&#x20;   `0x1234567890abcdef,      // Resolver address`\
&#x20;   `[],                      // Data`\
&#x20;   `false,                   // Set as primary name`\
&#x20;   `0                        // Owner-controlled fuses`\
`);`

&#x20;

**1.2. Commit**

Once you have the commitment hash, call the commit function.

`Function:`

`function commit(bytes32 commitment) public`

`Example:`

`commit(0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890);`

Notes:\
\- This requires an on-chain transaction.\
\- Wait at least MIN\_COMMITMENT\_AGE (\~60 seconds) before proceeding to register.

## 2. Register Domain

After the commitment period, you can proceed to register your domain.

**2.1. Register**

Ensure the domain name is available and meets the duration requirement. The actual duration is set to 584,554 years, but the input duration must be more than 28 days for validation. It should contain the same informations inputed during make commitment.

Make sure to approve an allowance of 100 ecld/etny to the controller address before registering, otherwise, the transfer will not be possible.

Function:

`function register(`\
&#x20;   `string memory name,`\
&#x20;   `address owner,`\
&#x20;   `uint256 duration,`\
&#x20;   `bytes32 secret,`\
&#x20;   `address resolver,`\
&#x20;   `bytes[] memory data,`\
&#x20;   `bool reverseRecord,`\
&#x20;   `uint16 ownerControlledFuses`\
`) public payable`

`Example:`

`register(`\
&#x20;   `"myname",                // Domain label`\
&#x20;   `0x1234567890abcdef,      // Owner address`\
&#x20;   `31536000,                // Duration (1 year in seconds)`\
&#x20;   `0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890, // Secret (32 bytes)`\
&#x20;   `0x1234567890abcdef,      // Resolver address`\
&#x20;   `[],                      // Data`\
&#x20;   `false,                   // Set as primary name`\
&#x20;   `0                        // Owner-controlled fuses`\
`);`

Notes:\
\- Ensure the domain is available: available(name) == true.\
\- Input duration must be >= MIN\_REGISTRATION\_DURATION (28 days).\
\- Commitments must be between 1 minute and 24 hours old.\
\- The cost is fixed at 100 ECLD/ETNY.

## 3. Transfer NFT Token using NameWrapper

Once the domain is registered, you may need to transfer the NFT token associated with the domain to your account.

`Function:`

`function safeTransferFrom(`\
&#x20;   `address from,`\
&#x20;   `address to,`\
&#x20;   `uint256 tokenId`\
`) public`

`Example:`

`transferFrom(`\
&#x20;   `0xOriginalOwner,        // Current owner's address`\
&#x20;   `0xNewOwner,             // New owner's address`\
&#x20;   `123456                  // Token ID of the domain`\
`);`


# Prerequisites


# Python 3.6+

### Windows

On Windows 10, Before installing official python binaries, the Python version from Windows Store has to be disabled by following the next steps:

1. Run **manage app execution aliases**
2. Disable app installer for **python.exe** and manage app execution aliases

After this is done, the official binaries can be installed.

The official Python Windows binaries can be found on python.org website:

{% embed url="<https://www.python.org/downloads/windows/>" %}

For our setup, please download and install the latest stable windows installer package. Make sure to check the box "Add Python 3.x to PATH." on the first screen of the setup.

### macOS

The macOS binaries can be found on the python.org website:

{% embed url="<https://www.python.org/downloads/mac-osx/>" %}

For our setup, please download and install the latest stable macOS universal2 installer.

### Linux

Depending on your distribution, Python 3.6+ might be already installed and part of the base setup. **Ubuntu 18.04** and **Debian 10** come with Python 3.6 and 3.7 respectively. **Ubuntu  20.04** comes with Python 3.8.

The following packages are required for the client to start: **python3** and **python3-pip**

Please check with the community developing your preferred distribution for proper way of upgrading Python to version 3.6+ if is not part of the base OS.


# git

### Windows

The windows git installer can be downloaded here:

{% embed url="<https://gitforwindows.org/>" %}

While running the installer, please enable experimental support for pseduo consoles like in the screenshot:

![](/files/-MOtMATkMFQgdFBrij3Q)

All the other settings defaults are OK.

### macOS

Install homebrew.

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

Install git

```bash
brew install git
```

### Linux

Debian/Ubuntu:

```bash
apt-get install git
```

RedHat/Fedora:

```bash
yum install git
```


# Blockchain Wallet

## Creating the wallet

One Ethereum wallets is required to run the Ethernity client.

For Windows, open "Git Bash" and run the commands inside that window.

### **Clone the repository**

If you have not done so already, clone the repository.

```
git clone https://github.com/ethernity-cloud/mvp-pox-client.git
cd mvp-pox-client
```

ethkey is a tool written in rust coming from the openetherum project. The compiled binary contains modifications that print the checksummed address which is required for configuration.

### Generate the wallet

#### On Windows

```bash
utils/windows/ethkey.exe generate random

secret:  ecc73d25230fa2b8eb6fxyzxyzxyz00ad9e19ce1c58a620fcad41d4eefa986bf
public:  ae66dd48e2fbaba48954af77cb21ca78b9bc666609a00528604655f4e0aade060931151551736a2e70b6ca39e83d886c5a98db159be7ba847d7fab2633d394bb
address: 0x1602562d4xyzxyzxyz1D357f0111963431AdBca68
```

#### On Linux

```bash
utils/linux/ethkey generate random

secret:  ecc73d25230fa2b8eb6f8dxyzxyzxyzad9e19ce1c58a620fcad41d4eefa986bf
public:  ae66dd48e2fbaba48954af77cb21ca78b9bc666609a00528604655f4e0aade060931151551736a2e70b6ca39e83d886c5a98db159be7ba847d7fab2633d394bb
address: 0x1602562dxyzxyzxyz51D357f0111963431AdBca68
```

The value of **address**  is attributed to the ADDRESS variable inside the config file, like this:

```
ADDRESS=0xF6fcb0C937F9Bd9761B92FF6cE4eE22CA1D7b75a
```

The secret represents the private key and is attributed to the PRIVATE\_KEY variable inside the config file, like this:

```
PRIVATE_KEY=fd5b017ede91c5b6823901xyzxyzxyzf422b29e09f6f77f84408006fdf82fc69
```

The content of the file 'config' at the end should be like this:

```
ADDRESS=0xf17f52151ExyzxyzxyzFAD080c5704D77216b732
PRIVATE_KEY=ec925a30a6c7408dae06fb6xyzxyzxyza5aa74a9fd5cb38fcfe112416b0c6476
```

### Store the keypair

The keypair you are generating represent the identity of your client and you are fully responsible to keep it safe. Do not share this information, or store it unencrypted outside your client environment.

## Funding the wallet

Various options exist to fund the wallet, depending on the network the Ethernity client runs on.

### Testnet

The testnet is using bloxberg as blockchain infrastructure. The bloxberg faucet can be found at:

<https://faucet.bloxberg.org>

Just enter your wallet address (including 0x in front)  in the form, fill the captcha and you will receive 0.2 bergs.\
0.2 bergs is enough to run a few million transactions.


# Download

### Clone the repository

For Windows start 'Git Bash' for the terminal.

```bash
git clone https://github.com/ethernity-cloud/mvp-pox-client.git
```


# Running the Client

The client takes 2 parameters:

-s is the script that should run inside the remote enclave\
-f is the fileset that is uploaded together with the script

Included in the repository there are two scripts:

cos-bench.py and uppercase.py

```
./pox-do -s scripts/cos-bench/cos-bench.py -f scripts/cos-bench/fileset

./pox-do was not initialized yet
Requirements fot the ./pox-do are the following:
1. ipfs daemon running and listening on localhost:5000
2. python3 with pip
3. ipfshttpclient python module
4. web3 python module
Proceed with automated initalization [Y/n]: y
Initializing... done
2020-12-19 10:37:17.132170 Submitting transaction for DO request
2020-12-19 10:37:24.624422 Request 377 created successfuly!
2020-12-19 10:37:24.625400 TX Hash: 0x7fe587cc6b04c12a801e9963cecda35ddb0367266d225f02ecd441176221ac41
.......................................................
```

Some errors might show during Initialization, however if the client submits a request and a transaction is created, the errors can be ignored.

The initialization occurs only the first time the client it started. What the initialization does is install the required python modules and then download and start the ipfs daemon. It connects the ipfs daemon to ipfs.ethernity.cloud for faster hash propagation.

### Your own python script

Using the -s and -f parameters you can run your own python scripts. Currently there are some limitations on what python modules and libraries are included on the python enclave. If you need specific python libraries or modules, please contact us.


# Configuring the Client

In side the file 'config' you can find the wallet keypair. You can update it and at the next run the transactions will run with the new wallet.

Make sure enough gas is available in the wallet.


# Proof of eXecution

The main behavior of the client and the server python implementation is to handle Proof of eXecution (PoX) request written in Python.

PoX is a method of running computational tasks in a decentralized way.  While the tasks run various metadata information is stored on the blockchain, and actual data is transferred using IPFS. Using this method computational tasks are certified on the blockchain while improving research reproducibility. The docker image that runs the Python task inside a TEE enclave is based on [SCONE Community Version](https://scontain.com).

The smart contract permits any type computational tasks, and we encourage the community to discuss the possibilities of expanding the current implementation to other use cases.

The main purpose of the Testnet is to allow such tasks to run occasionally and to provide a layer of support for further developing both the server side (Ethernity NODE) and client side (Ethernity CLIENT) components.


# Blockchain metadata

There are 3 transactions that handle metadata.

### The Data Owner request

This transaction contains the following metadata:

* The hardware resources required to run the task
* The docker template IPFS hash
* The python script IPFS hash
* The python fileset IPFS hash

### The Data Processor request

This transaction contains the following metadata:

* The hardware resources allocated for a request

### The Results Processor request

This transactions contains the following metadata:

* The results string IPFS hash


# IPFS

In order to facilitate fluent IPFS communications, all the clients, nodes and docker containers have the following bootstrap node configured and attempt to make this server part of their swarm: ipfs.ethernity.cloud

This will eventually become unnecessary when the network gets populated with nodes and they all connect to each other and pin the relevant content.


# Data Owner API

{% tabs %}
{% tab title="Methods" %}

### `_addDORequest` `92b93774`

**Adds new Data Owner Request**

|         |         |                     |                                                   |
| ------- | ------- | ------------------- | ------------------------------------------------- |
| inputs  |         |                     |                                                   |
| 0       | uint8   | `_cpuRequest`       | The number of CPU cores                           |
| 1       | uint8   | `_memRequest`       | The amount of RAM in GB                           |
| 2       | uint8   | `_storageRequest`   | The amount of storage in GB                       |
| 3       | uint8   | `_bandwidthRequest` | The bandwidth amount                              |
| 4       | uint16  | `_duration`         | The amount of time the resource can be offered    |
| 5       | uint8   | `_instances`        | How many instances should be run                  |
| 6       | uint8   | `_maxPrice`         | The maximum price accepted for processing request |
| 7       | string  | `_metadata1`        | Metadata to store in request                      |
| 8       | string  | `_metadata2`        | Metadata to store in request                      |
| 9       | string  | `_metadata3`        | Metadata to store in request                      |
| 10      | string  | `_metadata4`        | Metadata to store in request                      |
| outputs |         |                     |                                                   |
| 0       | uint256 | `_rowNumber`        | Data owner request id                             |

### `_cancelDORequest` `9ecbec41`

**Cancels a data owner request**

|        |         |                    |                |
| ------ | ------- | ------------------ | -------------- |
| inputs |         |                    |                |
| 0      | uint256 | `_requestListItem` | the request id |

### `_approveOrder` `efa09d85`

**Approves order - orders can be processed only after being approved by other part(do/dp)**

|         |         |              |                     |
| ------- | ------- | ------------ | ------------------- |
| inputs  |         |              |                     |
| 0       | uint256 | `_orderItem` | the order id        |
| outputs |         |              |                     |
| 0       | bool    | `success`    | Status of operation |

### `_getDORequest` `4f74787b`

**Gets details of a specific data owner request**

|         |         |                    |                                                          |
| ------- | ------- | ------------------ | -------------------------------------------------------- |
| inputs  |         |                    |                                                          |
| 0       | uint256 | `_requestListItem` | the request id                                           |
| outputs |         |                    |                                                          |
| 0       | address | downer             | Data owner address                                       |
| 1       | uint8   | `cpuRequest`       | The number of cpu cores\[maximum 255]                    |
| 2       | uint8   | `memoryRequest`    | The amount of ram in GB\[maximum 255]                    |
| 3       | uint8   | `storageRequest`   | The amount of storage in GB\[maximum 255]                |
| 4       | uint8   | `bandwidthRequest` | The bandwidth amount\[maximum 255]                       |
| 5       | uint16  | `duration`         | The amount of time the resource can be offered           |
| 6       | uint8   | `maxPrice`         | The maximum price accepted for processing request        |
| 7       | uint256 | `status`           | The request status \[values in Available/Booked/Canceled |

### `_getDORequestMetadata` `d9edc139`

**Gets metadata of a data owner request**

|         |         |                    |                |
| ------- | ------- | ------------------ | -------------- |
| inputs  |         |                    |                |
| 0       | uint256 | `_requestListItem` | the request id |
| outputs |         |                    |                |
| 0       | address | `downer`           |                |
| 1       | string  | `metadata1`        |                |
| 2       | string  | `metadata2`        |                |
| 3       | string  | `metadata3`        |                |
| 4       | string  | `metadata4`        |                |

### `_getDORequestsCount` `7aed1214`

**Gets total count of Data Owner Requests**

|         |         |           |                            |
| ------- | ------- | --------- | -------------------------- |
| outputs |         |           |                            |
| 0       | uint256 | `_length` | The counter of do requests |

### `_getMyDOOrders` `a8203abb`

**Gets the list of orders**

|         |            |       |             |
| ------- | ---------- | ----- | ----------- |
| outputs |            |       |             |
| 0       | uint256\[] | `req` | Orders list |

### `_getMyDORequests` `93132366`

**Gets all data owner request id list**

|         |            |       |                                             |
| ------- | ---------- | ----- | ------------------------------------------- |
| outputs |            |       |                                             |
| 0       | uint256\[] | `req` | An array containing all data owner requests |

### `_getOrder` `b3bb3da3`

**Gets order info**

|         |         |              |                           |
| ------- | ------- | ------------ | ------------------------- |
| inputs  |         |              |                           |
| 0       | uint256 | `_orderItem` | the order id              |
| outputs |         |              |                           |
| 0       | address | `downer`     | Data owner address        |
| 1       | address | `dproc`      | Data processor address    |
| 2       | uint256 | `doRequest`  | Data owner request id     |
| 3       | uint256 | `dpRequest`  | Data processor request id |
| 4       | uint256 | `status`     | Order status              |

### `_getOrdersCount` `246439e6`

**Gets order count**

|         |         |           |             |
| ------- | ------- | --------- | ----------- |
| outputs |         |           |             |
| 0       | uint256 | `_length` | Order count |

### `_getResultFromOrder` `008a81a6`

**Gets result from order**

|         |         |              |              |
| ------- | ------- | ------------ | ------------ |
| inputs  |         |              |              |
| 0       | uint256 | `_orderItem` | Order number |
| outputs |         |              |              |
| 0       | string  | `_Result`    | Order Result |

### `_placeOrder` `9818e66c`

**Places new order - this can placed by DO and DP**

|              |         |                  |                               |
| ------------ | ------- | ---------------- | ----------------------------- |
| inputs       |         |                  |                               |
| 0            | uint256 | `_doRequestItem` | the data owner request id     |
| 1            | uint256 | `_dpRequestItem` | the data processor request id |
| outputs      |         |                  |                               |
| 0            | uint256 | `_orderNumber`   | Order number                  |
| {% endtab %} |         |                  |                               |

{% tab title="ABI" %}

```bash
"[{\"constant\":true,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_getResultFromOrder\",\"outputs\":[{\"name\":\"_Result\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDPRequest\",\"outputs\":[{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"cpuRequest\",\"type\":\"uint8\"},{\"name\":\"memoryRequest\",\"type\":\"uint8\"},{\"name\":\"storageRequest\",\"type\":\"uint8\"},{\"name\":\"bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"duration\",\"type\":\"uint16\"},{\"name\":\"minPrice\",\"type\":\"uint8\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"},{\"name\":\"_result\",\"type\":\"string\"}],\"name\":\"_addResultToOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_metadataItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataValueForDPRequest\",\"outputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getOrdersCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cpuRequest\",\"type\":\"uint8\"},{\"name\":\"_memRequest\",\"type\":\"uint8\"},{\"name\":\"_storageRequest\",\"type\":\"uint8\"},{\"name\":\"_bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"_duration\",\"type\":\"uint16\"},{\"name\":\"_minPrice\",\"type\":\"uint8\"},{\"name\":\"_metadata1\",\"type\":\"string\"},{\"name\":\"_metadata2\",\"type\":\"string\"},{\"name\":\"_metadata3\",\"type\":\"string\"},{\"name\":\"_metadata4\",\"type\":\"string\"}],\"name\":\"_addDPRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"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\":\"_newProxy\",\"type\":\"address\"}],\"name\":\"transferProxy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"_addMetadataToRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"},{\"name\":\"processor\",\"type\":\"address\"}],\"name\":\"_addProcessorToOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDPRequests\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDORequest\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"cpuRequest\",\"type\":\"uint8\"},{\"name\":\"memoryRequest\",\"type\":\"uint8\"},{\"name\":\"storageRequest\",\"type\":\"uint8\"},{\"name\":\"bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"duration\",\"type\":\"uint16\"},{\"name\":\"maxPrice\",\"type\":\"uint8\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataCountForRequest\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_cancelDPRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenOwner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementationPro\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getDORequestsCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cpuRequest\",\"type\":\"uint8\"},{\"name\":\"_memRequest\",\"type\":\"uint8\"},{\"name\":\"_storageRequest\",\"type\":\"uint8\"},{\"name\":\"_bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"_duration\",\"type\":\"uint16\"},{\"name\":\"_instances\",\"type\":\"uint8\"},{\"name\":\"_maxPrice\",\"type\":\"uint8\"},{\"name\":\"_metadata1\",\"type\":\"string\"},{\"name\":\"_metadata2\",\"type\":\"string\"},{\"name\":\"_metadata3\",\"type\":\"string\"},{\"name\":\"_metadata4\",\"type\":\"string\"}],\"name\":\"_addDORequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDORequests\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_doRequestItem\",\"type\":\"uint256\"},{\"name\":\"_dpRequestItem\",\"type\":\"uint256\"}],\"name\":\"_placeOrder\",\"outputs\":[{\"name\":\"_orderNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDPRequestMetadata\",\"outputs\":[{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"metadata1\",\"type\":\"string\"},{\"name\":\"metadata2\",\"type\":\"string\"},{\"name\":\"metadata3\",\"type\":\"string\"},{\"name\":\"metadata4\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_cancelDORequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"FixedSupplyToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDOOrders\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_getOrder\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"doRequest\",\"type\":\"uint256\"},{\"name\":\"dpRequest\",\"type\":\"uint256\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"_addMetadataToDPRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDORequestMetadata\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"metadata1\",\"type\":\"string\"},{\"name\":\"metadata2\",\"type\":\"string\"},{\"name\":\"metadata3\",\"type\":\"string\"},{\"name\":\"metadata4\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transferAnyERC20Token\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenOwner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataCountForDPRequest\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getDPRequestsCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_approveOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_metadataItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataValueForRequest\",\"outputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"caller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"ProxyTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"tokenOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]"
```

{% endtab %}

{% tab title="Bytecode" %}

```bash
6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040805190810160405280600f81526020017f45746865726e69747920546f6b656e000000000000000000000000000000000081525060049080519060200190620000d292919062000255565b506040805190810160405280600481526020017f45544e5900000000000000000000000000000000000000000000000000000000815250600390805190602001906200012092919062000255565b506012600560006101000a81548160ff021916908360ff160217905550600560009054906101000a900460ff1660ff16600a0a633b9aca0002600681905550600654600760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040518082815260200191505060405180910390a362000304565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029857805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c8578251825591602001919060010190620002ab565b5b509050620002d89190620002dc565b5090565b6200030191905b80821115620002fd576000816000905550600101620002e3565b5090565b90565b617a6880620003146000396000f300608060405260043610610239576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680628a81a61461023e578062d74970146102e457806306fdde03146103a8578063095ea7b31461043857806314e9f3841461049d57806318160ddd146105285780632118c02c1461055357806323b872dd1461066f578063246439e6146106f4578063313ce5671461071f5780633701f582146107505780633eaaf86b146108ee578063438787d01461091957806344cc3c7f1461095c5780634509b7e014610a295780634c1782e514610a8e5780634f74787b14610afa5780635c60da1b14610bbe5780635d87b6e614610c15578063676a96d814610c5657806370a0823114610c8357806374ed9ae414610cda57806379ba509714610d315780637aed121414610d485780638da5cb5b14610d7357806392b9377414610dca5780639313236614610f7557806395d89b4114610fe15780639818e66c1461107157806398455999146110bc5780639ecbec41146112d9578063a1183d5014611306578063a8203abb1461131d578063a9059cbb14611389578063b3bb3da3146113ee578063b5d11dfa146114a3578063cae9ca5114611570578063d4ee1d901461161b578063d9edc13914611672578063dc39d06d1461188f578063dd62ed3e146118f4578063e2eef9c31461196b578063e780ada1146119ac578063efa09d85146119d7578063f2fde38b14611a1c578063f4de530514611a5f578063fc9c8d3914611b7b575b600080fd5b34801561024a57600080fd5b5061026960048036038101908080359060200190929190505050611bd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f057600080fd5b5061030f60048036038101908080359060200190929190505050611f0b565b604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018860ff1660ff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018360ff1660ff1681526020018281526020019850505050505050505060405180910390f35b3480156103b457600080fd5b506103bd6121ac565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103fd5780820151818401526020810190506103e2565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b50610483600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061224a565b604051808215151515815260200191505060405180910390f35b3480156104a957600080fd5b5061050e60048036038101908080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061233c565b604051808215151515815260200191505060405180910390f35b34801561053457600080fd5b5061053d6125f3565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b50610588600480360381019080803590602001909291908035906020019092919050505061263e565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156105cc5780820151818401526020810190506105b1565b50505050905090810190601f1680156105f95780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610632578082015181840152602081019050610617565b50505050905090810190601f16801561065f5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561067b57600080fd5b506106da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612975565b604051808215151515815260200191505060405180910390f35b34801561070057600080fd5b50610709612c20565b6040518082815260200191505060405180910390f35b34801561072b57600080fd5b50610734612c89565b604051808260ff1660ff16815260200191505060405180910390f35b34801561075c57600080fd5b506108d8600480360381019080803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803561ffff169060200190929190803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612c9c565b6040518082815260200191505060405180910390f35b3480156108fa57600080fd5b50610903613288565b6040518082815260200191505060405180910390f35b34801561092557600080fd5b5061095a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061328e565b005b34801561096857600080fd5b50610a1360048036038101908080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133bc565b6040518082815260200191505060405180910390f35b348015610a3557600080fd5b50610a7460048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061362e565b604051808215151515815260200191505060405180910390f35b348015610a9a57600080fd5b50610aa361390f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610ae6578082015181840152602081019050610acb565b505050509050019250505060405180910390f35b348015610b0657600080fd5b50610b2560048036038101908080359060200190929190505050613a00565b604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018860ff1660ff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018360ff1660ff1681526020018281526020019850505050505050505060405180910390f35b348015610bca57600080fd5b50610bd3613ca1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c2157600080fd5b50610c4060048036038101908080359060200190929190505050613cc7565b6040518082815260200191505060405180910390f35b348015610c6257600080fd5b50610c8160048036038101908080359060200190929190505050613dd6565b005b348015610c8f57600080fd5b50610cc4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140d4565b6040518082815260200191505060405180910390f35b348015610ce657600080fd5b50610cef61411d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d3d57600080fd5b50610d46614143565b005b348015610d5457600080fd5b50610d5d6142e2565b6040518082815260200191505060405180910390f35b348015610d7f57600080fd5b50610d8861434b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dd657600080fd5b50610f5f600480360381019080803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803561ffff169060200190929190803560ff169060200190929190803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050614370565b6040518082815260200191505060405180910390f35b348015610f8157600080fd5b50610f8a614a55565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610fcd578082015181840152602081019050610fb2565b505050509050019250505060405180910390f35b348015610fed57600080fd5b50610ff6614b46565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561103657808201518184015260208101905061101b565b50505050905090810190601f1680156110635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561107d57600080fd5b506110a66004803603810190808035906020019092919080359060200190929190505050614be4565b6040518082815260200191505060405180910390f35b3480156110c857600080fd5b506110e76004803603810190808035906020019092919050505061562d565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561116557808201518184015260208101905061114a565b50505050905090810190601f1680156111925780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b838110156111cb5780820151818401526020810190506111b0565b50505050905090810190601f1680156111f85780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015611231578082015181840152602081019050611216565b50505050905090810190601f16801561125e5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561129757808201518184015260208101905061127c565b50505050905090810190601f1680156112c45780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156112e557600080fd5b50611304600480360381019080803590602001909291905050506159f4565b005b34801561131257600080fd5b5061131b615cec565b005b34801561132957600080fd5b50611332615eb3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561137557808201518184015260208101905061135a565b505050509050019250505060405180910390f35b34801561139557600080fd5b506113d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050615fa4565b604051808215151515815260200191505060405180910390f35b3480156113fa57600080fd5b506114196004803603810190808035906020019092919050505061613f565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156114af57600080fd5b5061155a60048036038101908080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061633c565b6040518082815260200191505060405180910390f35b34801561157c57600080fd5b50611601600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506165d4565b604051808215151515815260200191505060405180910390f35b34801561162757600080fd5b50611630616823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561167e57600080fd5b5061169d60048036038101908080359060200190929190505050616849565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561171b578082015181840152602081019050611700565b50505050905090810190601f1680156117485780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b83811015611781578082015181840152602081019050611766565b50505050905090810190601f1680156117ae5780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156117e75780820151818401526020810190506117cc565b50505050905090810190601f1680156118145780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561184d578082015181840152602081019050611832565b50505050905090810190601f16801561187a5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b34801561189b57600080fd5b506118da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050616c7d565b604051808215151515815260200191505060405180910390f35b34801561190057600080fd5b50611955600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050616e70565b6040518082815260200191505060405180910390f35b34801561197757600080fd5b5061199660048036038101908080359060200190929190505050616ef7565b6040518082815260200191505060405180910390f35b3480156119b857600080fd5b506119c1617006565b6040518082815260200191505060405180910390f35b3480156119e357600080fd5b50611a026004803603810190808035906020019092919050505061706f565b604051808215151515815260200191505060405180910390f35b348015611a2857600080fd5b50611a5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050617454565b005b348015611a6b57600080fd5b50611a946004803603810190808035906020019092919080359060200190929190505050617582565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ad8578082015181840152602081019050611abd565b50505050905090810190601f168015611b055780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611b3e578082015181840152602081019050611b23565b50505050905090810190601f168015611b6b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015611b8757600080fd5b50611b906178b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3257600080fd5b60008310158015611c47575060108054905083105b1515611cbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b601083815481101515611cca57fe5b90600052602060002090600c020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c79206f776e65722063616e20726561642074686520726573756c74730081525060200191505060405180910390fd5b60026003811115611dae57fe5b81600b0160009054906101000a900460ff166003811115611dcb57fe5b141515611e66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6f6e6c7920636c6f736564206f7264657273206861766520746865207265737581526020017f6c7400000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806009018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efe5780601f10611ed357610100808354040283529160200191611efe565b820191906000526020600020905b815481529060010190602001808311611ee157829003601f168201915b5050505050915050919050565b600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7357600080fd5b60008910158015611f885750600f8054905089105b1515611ffc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c696420696e6465782070726f76696465642e00000000000000000081525060200191505060405180910390fd5b600f8981548110151561200b57fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750600f8981548110151561204e57fe5b906000526020600020906008020160070160009054906101000a900460ff16600281111561207857fe5b905087600f8a81548110151561208a57fe5b906000526020600020906008020160000160149054906101000a900460ff16600f8b8154811015156120b857fe5b906000526020600020906008020160000160159054906101000a900460ff16600f8c8154811015156120e657fe5b906000526020600020906008020160000160169054906101000a900460ff16600f8d81548110151561211457fe5b906000526020600020906008020160000160179054906101000a900460ff16600f8e81548110151561214257fe5b906000526020600020906008020160000160189054906101000a900461ffff16600f8f81548110151561217157fe5b9060005260206000209060080201600001601a9054906101000a900460ff168797509750975097509750975097509750919395975091939597565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b505050505081565b600081600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561239b57600080fd5b600084101580156123b0575060108054905084105b1515612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108481548110151561243357fe5b90600052602060002090600c020190508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792070726f636573736f722063616e20616464206120726573756c740081525060200191505060405180910390fd5b6001600381111561251757fe5b81600b0160009054906101000a900460ff16600381111561253457fe5b1415156125a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b828160090190805190602001906125c1929190617917565b50600281600b0160006101000a81548160ff021916908360038111156125e357fe5b0217905550600191505092915050565b6000600760008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460065403905090565b606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561269d57600080fd5b600084101580156126b25750600f8054905084105b1515612726576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600083101580156127565750600f8481548110151561274157fe5b90600052602060002090600802016006015483105b15156127ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e76616c6964206d657461646174614974656d20696e64657800000000000081525060200191505060405180910390fd5b600f848154811015156127d957fe5b90600052602060002090600802016005016000848152602001908152602001600020600001600f8581548110151561280d57fe5b90600052602060002090600802016005016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128c75780601f1061289c576101008083540402835291602001916128c7565b820191906000526020600020905b8154815290600101906020018083116128aa57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129635780601f1061293857610100808354040283529160200191612963565b820191906000526020600020905b81548152906001019060200180831161294657829003601f168201915b50505050509050915091509250929050565b60006129c982600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9b82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b6d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178fb90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7e57600080fd5b601080549050905090565b600560009054906101000a900460ff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cfa57600080fd5b60008b60ff16118015612d13575060ff80168b60ff1611155b1515612d87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6370755265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008a60ff16118015612da0575060ff80168a60ff1611155b1515612e14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6d656d5265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008860ff16118015612e2d575060ff80168860ff1611155b1515612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f62616e6477696474685265717565737420697320696e76616c6964000000000081525060200191505060405180910390fd5b60008960ff16118015612eba575060ff80168960ff1611155b1515612f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f73746f726167655265717565737420697320696e76616c69640000000000000081525060200191505060405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600f8054905090806001815401808255809150509060018203906000526020600020016000909192909190915055506001600f6101e0604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b60ff1681526020018a61ffff1681526020018960ff1681526020014263ffffffff168152602001600060ff168152602001888152602001878152602001868152602001858152602001600081526020016000600281111561304257fe5b8152509080600181540180825580915050906001820390600052602060002090600802016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600001601f6101000a81548160ff021916908360ff1602179055506101208201518160010190805190602001906131e5929190617997565b50610140820151816002019080519060200190613203929190617997565b50610160820151816003019080519060200190613221929190617997565b5061018082015181600401908051906020019061323f929190617997565b506101a082015181600601556101c08201518160070160006101000a81548160ff0219169083600281111561327057fe5b021790555050500390509a9950505050505050505050565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561341b57600080fd5b600085101580156134305750600e8054905085105b15156134a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e858154811015156134b357fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792064617461206f776e65722063616e206d6f6469667920746869730081525060200191505060405180910390fd5b600e8581548110151561359657fe5b90600052602060002090600902019050838160060160008360070154815260200190815260200160002060000190805190602001906135d6929190617917565b5082816006016000836007015481526020019081526020016000206001019080519060200190613607929190617917565b50806007016000815480929190600101919050555060018160070154039150509392505050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561368d57600080fd5b600084101580156136a2575060108054905084105b1515613716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108481548110151561372557fe5b90600052602060002090600c020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f6f6e6c7920646174612070726f636573736f722063616e20616464206120707281526020017f6f636573736f720000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600381111561382f57fe5b81600b0160009054906101000a900460ff16600381111561384c57fe5b1415156138c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600191505092915050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561396d57600080fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156139f657602002820191906000526020600020905b8154815260200190600101908083116139e2575b5050505050905090565b600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a6857600080fd5b60008910158015613a7d5750600e8054905089105b1515613af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e89815481101515613b0057fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750600e89815481101515613b4357fe5b906000526020600020906009020160080160009054906101000a900460ff166002811115613b6d57fe5b905087600e8a815481101515613b7f57fe5b906000526020600020906009020160000160149054906101000a900460ff16600e8b815481101515613bad57fe5b906000526020600020906009020160000160159054906101000a900460ff16600e8c815481101515613bdb57fe5b906000526020600020906009020160000160169054906101000a900460ff16600e8d815481101515613c0957fe5b906000526020600020906009020160000160179054906101000a900460ff16600e8e815481101515613c3757fe5b906000526020600020906009020160000160189054906101000a900461ffff16600e8f815481101515613c6657fe5b906000526020600020906009020160010160009054906101000a900460ff168797509750975097509750975097509750919395975091939597565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613d2557600080fd5b60008210158015613d3a5750600e8054905082105b1515613dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e82815481101515613dbd57fe5b9060005260206000209060090201600701549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e3457600080fd5b60008210158015613e495750600f8054905082105b1515613ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f82815481101515613ecc57fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f6f6e6c792064656c6567617465642070726f636573736f722063616e206d6f6481526020017f696679207468697300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f82815481101515613fd557fe5b9060005260206000209060080201905060006002811115613ff257fe5b8160070160009054906101000a900460ff16600281111561400f57fe5b1415156140aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652063616e81526020017f63656c656400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028160070160006101000a81548160ff021916908360028111156140cb57fe5b02179055505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561419f57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561434057600080fd5b600e80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156143ce57600080fd5b60008760ff161180156143e85750600a60ff168760ff1611155b151561445c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e7374616e636520697320696e76616c69640000000000000000000000000081525060200191505060405180910390fd5b60008c60ff16118015614475575060ff80168c60ff1611155b15156144e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6370755265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008b60ff16118015614502575060ff80168b60ff1611155b1515614576576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6d656d5265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008960ff1611801561458f575060ff80168960ff1611155b1515614603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f62616e6477696474685265717565737420697320696e76616c6964000000000081525060200191505060405180910390fd5b60008a60ff1611801561461c575060ff80168a60ff1611155b1515614690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f73746f726167655265717565737420697320696e76616c69640000000000000081525060200191505060405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600e8054905090806001815401808255809150509060018203906000526020600020016000909192909190915055506001600e610220604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018f60ff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b61ffff1681526020018a60ff168152602001600060ff1681526020014263ffffffff1681526020018960ff1681526020018b8b8b0260ff160261ffff1663ffffffff16815260200188815260200187815260200186815260200185815260200160008152602001600060028111156147c457fe5b8152509080600181540180825580915050906001820390600052602060002090600902016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548160ff021916908360ff16021790555061010082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160006101000a81548160ff021916908360ff1602179055506101408201518160010160016101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160020190805190602001906149b1929190617997565b506101808201518160030190805190602001906149cf929190617997565b506101a08201518160040190805190602001906149ed929190617997565b506101c0820151816005019080519060200190614a0b929190617997565b506101e082015181600701556102008201518160080160006101000a81548160ff02191690836002811115614a3c57fe5b021790555050500390509b9a5050505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614ab357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015614b3c57602002820191906000526020600020905b815481526020019060010190808311614b28575b5050505050905090565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614bdc5780601f10614bb157610100808354040283529160200191614bdc565b820191906000526020600020905b815481529060010190602001808311614bbf57829003601f168201915b505050505081565b600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614c4657600080fd5b60008610158015614c5b5750600e8054905086105b1515614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c696420646f207265717565737420696e646578000000000000000081525060200191505060405180910390fd5b60008510158015614ce45750600f8054905085105b1515614d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206470207265717565737420696e646578000000000000000081525060200191505060405180910390fd5b600e86815481101515614d6757fe5b9060005260206000209060090201925060006002811115614d8457fe5b8360080160009054906101000a900460ff166002811115614da157fe5b141515614e3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652072657181526020017f756573746564000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f85815481101515614e4b57fe5b9060005260206000209060080201915060006002811115614e6857fe5b8260070160009054906101000a900460ff166002811115614e8557fe5b141515614f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652072657181526020017f756573746564000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480614fcd57503373ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b151561508d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f4f6e6c7920646174612f70726f63657373206f776e6572206f722064656c656781526020017f617465642070726f63657373736f722063616e20706c6163652074686973206f81526020017f726465720000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615111578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050615139565b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600183600001601b9054906101000a900460ff160183600001601b6101000a81548160ff021916908360ff16021790555082600001601a9054906101000a900460ff1660ff1683600001601b9054906101000a900460ff1660ff1614156151c15760018360080160006101000a81548160ff021916908360028111156151bb57fe5b02179055505b60018260070160006101000a81548160ff021916908360028111156151e257fe5b0217905550601360008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206010805490509080600181540180825580915050906001820390600052602060002001600090919290919091505550601360008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206010805490509080600181540180825580915050906001820390600052602060002001600090919290919091505550600160106101806040519081016040528086600001601b9054906101000a900460ff1660ff1681526020018560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018981526020014263ffffffff1681526020016000815260200160206040519081016040528060008152508152602001600081526020016000600381111561543857fe5b8152509080600181540180825580915050906001820390600052602060002090600c02016000909192909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005015560e0820151816006015561010082015181600801556101208201518160090190805190602001906155e9929190617997565b5061014082015181600a015561016082015181600b0160006101000a81548160ff0219169083600381111561561a57fe5b0217905550505003935050505092915050565b60006060806060806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561569357600080fd5b600087101580156156a85750600f8054905087105b151561571c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f8781548110151561572b57fe5b906000526020600020906008020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101826002018360030184600401838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156158055780601f106157da57610100808354040283529160200191615805565b820191906000526020600020905b8154815290600101906020018083116157e857829003601f168201915b50505050509350828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156158a15780601f10615876576101008083540402835291602001916158a1565b820191906000526020600020905b81548152906001019060200180831161588457829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561593d5780601f106159125761010080835404028352916020019161593d565b820191906000526020600020905b81548152906001019060200180831161592057829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156159d95780601f106159ae576101008083540402835291602001916159d9565b820191906000526020600020905b8154815290600101906020018083116159bc57829003601f168201915b50505050509050955095509550955095505091939590929450565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615a5257600080fd5b60008210158015615a675750600e8054905082105b1515615adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e82815481101515615aea57fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792064617461206f776e65722063616e206d6f6469667920746869730081525060200191505060405180910390fd5b600e82815481101515615bcd57fe5b9060005260206000209060090201905060006002811115615bea57fe5b8160080160009054906101000a900460ff166002811115615c0757fe5b148015615c285750600081600001601b9054906101000a900460ff1660ff16145b1515615cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652063616e81526020017f63656c656400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028160080160006101000a81548160ff02191690836002811115615ce357fe5b02179055505050565b6040805190810160405280600581526020017f464958454400000000000000000000000000000000000000000000000000000081525060039080519060200190615d37929190617917565b506040805190810160405280601a81526020017f4578616d706c6520466978656420537570706c7920546f6b656e00000000000081525060049080519060200190615d83929190617917565b506012600560006101000a81548160ff021916908360ff160217905550600560009054906101000a900460ff1660ff16600a0a620f424002600681905550600654600760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040518082815260200191505060405180910390a3565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615f1157600080fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015615f9a57602002820191906000526020600020905b815481526020019060010190808311615f86575b5050505050905090565b6000615ff882600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061608d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178fb90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000806000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156161a357600080fd5b600086101580156161b85750600e8054905086105b151561622c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b60108681548110151561623b57fe5b90600052602060002090600c020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660108781548110151561627c57fe5b90600052602060002090600c020160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166010888154811015156162bd57fe5b90600052602060002090600c0201600501546010898154811015156162de57fe5b90600052602060002090600c02016004015460108a8154811015156162ff57fe5b90600052602060002090600c0201600b0160009054906101000a900460ff16600381111561632957fe5b9450945094509450945091939590929450565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561639b57600080fd5b600085101580156163b05750600f8054905085105b1515616424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f8581548110151561643357fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561652d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f6f6e6c79207468652064656c6567617465642070726f636573736f722063616e81526020017f206d6f646966792074686973000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f8581548110151561653c57fe5b906000526020600020906008020190508381600501600083600601548152602001908152602001600020600001908051906020019061657c929190617917565b50828160050160008360060154815260200190815260200160002060010190805190602001906165ad929190617917565b50806006016000815480929190600101919050555060018160060154039150509392505050565b600082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338530866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156167b1578082015181840152602081019050616796565b50505050905090810190601f1680156167de5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561680057600080fd5b505af1158015616814573d6000803e3d6000fd5b50505050600190509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606080606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156168ad57600080fd5b600086101580156168c25750600e8054905086105b1515616936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e8681548110151561694557fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16945084600e8781548110151561698957fe5b9060005260206000209060090201600201600e888154811015156169a957fe5b9060005260206000209060090201600301600e898154811015156169c957fe5b9060005260206000209060090201600401600e8a8154811015156169e957fe5b9060005260206000209060090201600501838054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616a8f5780601f10616a6457610100808354040283529160200191616a8f565b820191906000526020600020905b815481529060010190602001808311616a7257829003601f168201915b50505050509350828054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616b2b5780601f10616b0057610100808354040283529160200191616b2b565b820191906000526020600020905b815481529060010190602001808311616b0e57829003601f168201915b50505050509250818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616bc75780601f10616b9c57610100808354040283529160200191616bc7565b820191906000526020600020905b815481529060010190602001808311616baa57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616c635780601f10616c3857610100808354040283529160200191616c63565b820191906000526020600020905b815481529060010190602001808311616c4657829003601f168201915b505050505090509450945094509450945091939590929450565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515616d69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015616e2d57600080fd5b505af1158015616e41573d6000803e3d6000fd5b505050506040513d6020811015616e5757600080fd5b8101908080519060200190929190505050905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515616f5557600080fd5b60008210158015616f6a5750600f8054905082105b1515616fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f82815481101515616fed57fe5b9060005260206000209060080201600601549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561706457600080fd5b600f80549050905090565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156170ce57600080fd5b600083101580156170e3575060108054905083105b1515617157576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108381548110151561716657fe5b90600052602060002090600c020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061722357508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156172bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f6f6e6c792064617461206f776e6572206f7220646174612070726f636573736f81526020017f722063616e20617070726f76652074686973000000000000000000000000000081525060400191505060405180910390fd5b8060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515617385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f746865206f746865722070617274792073686f756c6420617070726f7665000081525060200191505060405180910390fd5b6000600381111561739257fe5b81600b0160009054906101000a900460ff1660038111156173af57fe5b141515617424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b600181600b0160006101000a81548160ff0219169083600381111561744557fe5b02179055506001915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561753e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156175e157600080fd5b600084101580156175f65750600e8054905084105b151561766a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b6000831015801561769a5750600e8481548110151561768557fe5b90600052602060002090600902016007015483105b151561770e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e76616c6964206d657461646174614974656d20696e64657800000000000081525060200191505060405180910390fd5b600e8481548110151561771d57fe5b90600052602060002090600902016006016000848152602001908152602001600020600001600e8581548110151561775157fe5b90600052602060002090600902016006016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561780b5780601f106177e05761010080835404028352916020019161780b565b820191906000526020600020905b8154815290600101906020018083116177ee57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156178a75780601f1061787c576101008083540402835291602001916178a7565b820191906000526020600020905b81548152906001019060200180831161788a57829003601f168201915b50505050509050915091509250929050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111515156178f057600080fd5b818303905092915050565b6000818301905082811015151561791157600080fd5b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061795857805160ff1916838001178555617986565b82800160010185558215617986579182015b8281111561798557825182559160200191906001019061796a565b5b5090506179939190617a17565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106179d857805160ff1916838001178555617a06565b82800160010185558215617a06579182015b82811115617a055782518255916020019190600101906179ea565b5b509050617a139190617a17565b5090565b617a3991905b80821115617a35576000816000905550600101617a1d565b5090565b905600a165627a7a72305820c83b839f50fbb3be3d13b774e7febbe3c68cc931ddf606430b3e0bf9963fe4df0029

Opcodes

PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP CALLER PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x45746865726E69747920546F6B656E0000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xD2 SWAP3 SWAP2 SWAP1 PUSH3 0x255 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x45544E5900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x120 SWAP3 SWAP2 SWAP1 PUSH3 0x255 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH4 0x3B9ACA00 MUL PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH3 0x304 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 PUSH3 0x298 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x2C9 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x2C9 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x2C8 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x2AB JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x2D8 SWAP2 SWAP1 PUSH3 0x2DC JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x301 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x2FD JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x2E3 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7A68 DUP1 PUSH3 0x314 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x239 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH3 0x8A81A6 EQ PUSH2 0x23E JUMPI DUP1 PUSH3 0xD74970 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x438 JUMPI DUP1 PUSH4 0x14E9F384 EQ PUSH2 0x49D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x528 JUMPI DUP1 PUSH4 0x2118C02C EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x66F JUMPI DUP1 PUSH4 0x246439E6 EQ PUSH2 0x6F4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0x3701F582 EQ PUSH2 0x750 JUMPI DUP1 PUSH4 0x3EAAF86B EQ PUSH2 0x8EE JUMPI DUP1 PUSH4 0x438787D0 EQ PUSH2 0x919 JUMPI DUP1 PUSH4 0x44CC3C7F EQ PUSH2 0x95C JUMPI DUP1 PUSH4 0x4509B7E0 EQ PUSH2 0xA29 JUMPI DUP1 PUSH4 0x4C1782E5 EQ PUSH2 0xA8E JUMPI DUP1 PUSH4 0x4F74787B EQ PUSH2 0xAFA JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0xBBE JUMPI DUP1 PUSH4 0x5D87B6E6 EQ PUSH2 0xC15 JUMPI DUP1 PUSH4 0x676A96D8 EQ PUSH2 0xC56 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xC83 JUMPI DUP1 PUSH4 0x74ED9AE4 EQ PUSH2 0xCDA JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0xD31 JUMPI DUP1 PUSH4 0x7AED1214 EQ PUSH2 0xD48 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD73 JUMPI DUP1 PUSH4 0x92B93774 EQ PUSH2 0xDCA JUMPI DUP1 PUSH4 0x93132366 EQ PUSH2 0xF75 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xFE1 JUMPI DUP1 PUSH4 0x9818E66C EQ PUSH2 0x1071 JUMPI DUP1 PUSH4 0x98455999 EQ PUSH2 0x10BC JUMPI DUP1 PUSH4 0x9ECBEC41 EQ PUSH2 0x12D9 JUMPI DUP1 PUSH4 0xA1183D50 EQ PUSH2 0x1306 JUMPI DUP1 PUSH4 0xA8203ABB EQ PUSH2 0x131D JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1389 JUMPI DUP1 PUSH4 0xB3BB3DA3 EQ PUSH2 0x13EE JUMPI DUP1 PUSH4 0xB5D11DFA EQ PUSH2 0x14A3 JUMPI DUP1 PUSH4 0xCAE9CA51 EQ PUSH2 0x1570 JUMPI DUP1 PUSH4 0xD4EE1D90 EQ PUSH2 0x161B JUMPI DUP1 PUSH4 0xD9EDC139 EQ PUSH2 0x1672 JUMPI DUP1 PUSH4 0xDC39D06D EQ PUSH2 0x188F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x18F4 JUMPI DUP1 PUSH4 0xE2EEF9C3 EQ PUSH2 0x196B JUMPI DUP1 PUSH4 0xE780ADA1 EQ PUSH2 0x19AC JUMPI DUP1 PUSH4 0xEFA09D85 EQ PUSH2 0x19D7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1A1C JUMPI DUP1 PUSH4 0xF4DE5305 EQ PUSH2 0x1A5F JUMPI DUP1 PUSH4 0xFC9C8D39 EQ PUSH2 0x1B7B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1BD2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2A9 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x28E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2D6 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x30F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1F0B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BD PUSH2 0x21AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3E2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x42A 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x444 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x483 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x224A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x50E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x233C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53D PUSH2 0x25F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x588 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x263E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 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 0x5CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x5F9 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 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 0x632 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x617 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x65F 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 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2975 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x700 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x709 PUSH2 0x2C20 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x734 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x75C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH2 0xFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2C9C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x903 PUSH2 0x3288 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x925 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x328E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x968 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA13 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x33BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA74 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x362E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAA3 PUSH2 0x390F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xAE6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xACB JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB25 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3A00 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD3 PUSH2 0x3CA1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC40 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3CC7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC81 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3DD6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCC4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x40D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCEF PUSH2 0x411D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD46 PUSH2 0x4143 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD5D PUSH2 0x42E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD88 PUSH2 0x434B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH2 0xFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x4370 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF8A PUSH2 0x4A55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xFCD JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xFB2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF6 PUSH2 0x4B46 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1036 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x101B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1063 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x107D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x4BE4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10E7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x562D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP10 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 0x1165 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x114A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1192 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 DUP6 DUP2 SUB DUP5 MSTORE DUP9 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 0x11CB JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x11B0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11F8 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 DUP6 DUP2 SUB DUP4 MSTORE DUP8 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 0x1231 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1216 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x125E 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 DUP6 DUP2 SUB DUP3 MSTORE DUP7 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 0x1297 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x127C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12C4 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 SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1304 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x59F4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x131B PUSH2 0x5CEC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1332 PUSH2 0x5EB3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1375 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x135A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5FA4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1419 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x613F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x633C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1601 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x65D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1627 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1630 PUSH2 0x6823 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x167E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x169D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6849 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP10 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 0x171B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1700 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1748 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 DUP6 DUP2 SUB DUP5 MSTORE DUP9 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 0x1781 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1766 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17AE 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 DUP6 DUP2 SUB DUP4 MSTORE DUP8 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 0x17E7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x17CC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1814 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 DUP6 DUP2 SUB DUP3 MSTORE DUP7 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 0x184D JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1832 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x187A 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 SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x189B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6C7D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1955 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6E70 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1977 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1996 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6EF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C1 PUSH2 0x7006 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A02 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x706F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A5D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7454 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A94 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7582 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 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 0x1AD8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1ABD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B05 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 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 0x1B3E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B23 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B6B 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 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B90 PUSH2 0x78B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1C32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x1C47 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x1CBB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CCA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F776E65722063616E20726561642074686520726573756C747300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1DAE JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1DCB JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x1E66 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C7920636C6F736564206F72646572732068617665207468652072657375 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6C74000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x9 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1EFE JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1ED3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EFE 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 0x1EE1 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1F73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP10 LT ISZERO DUP1 ISZERO PUSH2 0x1F88 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP10 LT JUMPDEST ISZERO ISZERO PUSH2 0x1FFC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E76616C696420696E6465782070726F76696465642E000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x200B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP8 POP PUSH1 0xF DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x204E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2078 JUMPI INVALID JUMPDEST SWAP1 POP DUP8 PUSH1 0xF DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x208A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP12 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20B8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP13 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20E6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP14 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2114 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x17 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP15 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2142 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH2 0xFFFF AND PUSH1 0xF DUP16 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2171 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x1A SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP8 SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2242 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2217 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2242 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 0x2225 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x8 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x239B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x23B0 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x2424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2433 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x2 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x250A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792070726F636573736F722063616E20616464206120726573756C7400 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2517 JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2534 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x25A9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 DUP2 PUSH1 0x9 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x25C1 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x2 DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x25E3 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x7 PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x6 SLOAD SUB SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x269D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x26B2 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x2726 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x2756 JUMPI POP PUSH1 0xF DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2741 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x6 ADD SLOAD DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x27CA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206D657461646174614974656D20696E646578000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x27D9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x5 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x280D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x5 ADD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x28C7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x289C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x28C7 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 0x28AA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2963 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2938 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2963 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 0x2946 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29C9 DUP3 PUSH1 0x7 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x2A9B DUP3 PUSH1 0x8 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x8 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x2B6D DUP3 PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78FB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2C7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP12 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2D13 JUMPI POP PUSH1 0xFF DUP1 AND DUP12 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2D87 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6370755265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP11 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2DA0 JUMPI POP PUSH1 0xFF DUP1 AND DUP11 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2E14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6D656D5265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP9 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2E2D JUMPI POP PUSH1 0xFF DUP1 AND DUP9 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2EA1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x62616E6477696474685265717565737420697320696E76616C69640000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP10 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2EBA JUMPI POP PUSH1 0xFF DUP1 AND DUP10 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2F2E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73746F726167655265717565737420697320696E76616C696400000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x12 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xF DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0xF PUSH2 0x1E0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP13 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3042 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x16 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x17 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH2 0xFFFF MUL NOT AND SWAP1 DUP4 PUSH2 0xFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1A PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1F PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x31E5 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3203 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3221 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x323F SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x1C0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3270 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP1 POP SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3378 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x341B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x3430 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x34A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x34B3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3587 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E65722063616E206D6F64696679207468697300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3596 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP1 POP DUP4 DUP2 PUSH1 0x6 ADD PUSH1 0x0 DUP4 PUSH1 0x7 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x35D6 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP3 DUP2 PUSH1 0x6 ADD PUSH1 0x0 DUP4 PUSH1 0x7 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3607 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP1 PUSH1 0x7 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x1 DUP2 PUSH1 0x7 ADD SLOAD SUB SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x368D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x36A2 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x3716 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3725 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3822 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C7920646174612070726F636573736F722063616E206164642061207072 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6F636573736F7200000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x382F JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x384C JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x38C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 DUP2 PUSH1 0x2 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x396D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x12 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x39F6 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 0x39E2 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3A68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP10 LT ISZERO DUP1 ISZERO PUSH2 0x3A7D JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP10 LT JUMPDEST ISZERO ISZERO PUSH2 0x3AF1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B00 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP8 POP PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B43 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3B6D JUMPI INVALID JUMPDEST SWAP1 POP DUP8 PUSH1 0xE DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP12 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BAD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP13 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BDB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP14 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C09 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x17 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP15 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C37 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH2 0xFFFF AND PUSH1 0xE DUP16 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C66 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP8 SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3D25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x3D3A JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x3DAE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3DBD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x7 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3E34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x3E49 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x3EBD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3ECC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3FC6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064656C6567617465642070726F636573736F722063616E206D6F64 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6966792074686973000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3FD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3FF2 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x400F JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x40AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E2062652063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x63656C6564000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x40CB JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x7 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x419F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x43CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP8 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x43E8 JUMPI POP PUSH1 0xA PUSH1 0xFF AND DUP8 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x445C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E7374616E636520697320696E76616C696400000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP13 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x4475 JUMPI POP PUSH1 0xFF DUP1 AND DUP13 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x44E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6370755265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP12 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x4502 JUMPI POP PUSH1 0xFF DUP1 AND DUP12 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4576 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6D656D5265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP10 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x458F JUMPI POP PUSH1 0xFF DUP1 AND DUP10 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4603 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x62616E6477696474685265717565737420697320696E76616C69640000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP11 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x461C JUMPI POP PUSH1 0xFF DUP1 AND DUP11 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4690 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73746F726167655265717565737420697320696E76616C696400000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x11 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xE DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0xE PUSH2 0x220 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP16 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP13 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP12 DUP12 MUL PUSH1 0xFF AND MUL PUSH2 0xFFFF AND PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x47C4 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x16 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x17 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH2 0xFFFF MUL NOT AND SWAP1 DUP4 PUSH2 0xFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1A PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1C PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49B1 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49CF SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49ED SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1C0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x4A0B SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1E0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE PUSH2 0x200 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4A3C JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP1 POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4AB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x11 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x4B3C 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 0x4B28 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x4BDC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4BB1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4BDC 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 0x4BBF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4C46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x4C5B JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x4CCF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C696420646F207265717565737420696E6465780000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x4CE4 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x4D58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206470207265717565737420696E6465780000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D67 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP3 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4D84 JUMPI INVALID JUMPDEST DUP4 PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4DA1 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x4E3C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E20626520726571 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7565737465640000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4E4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP2 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4E68 JUMPI INVALID JUMPDEST DUP3 PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4E85 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x4F20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E20626520726571 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7565737465640000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x4FCD JUMPI POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x508D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x44 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920646174612F70726F63657373206F776E6572206F722064656C6567 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x617465642070726F63657373736F722063616E20706C6163652074686973206F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7264657200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x60 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x5111 JUMPI DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x5139 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ADD DUP4 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x0 ADD PUSH1 0x1A SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND DUP4 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND EQ ISZERO PUSH2 0x51C1 JUMPI PUSH1 0x1 DUP4 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x51BB JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x51E2 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x13 PUSH1 0x0 DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x13 PUSH1 0x0 DUP5 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0x10 PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x5438 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD SSTORE PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x9 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x55E9 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0xA ADD SSTORE PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x561A JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5693 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP8 LT ISZERO DUP1 ISZERO PUSH2 0x56A8 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP8 LT JUMPDEST ISZERO ISZERO PUSH2 0x571C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x572B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 ADD DUP3 PUSH1 0x2 ADD DUP4 PUSH1 0x3 ADD DUP5 PUSH1 0x4 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x5805 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x57DA JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5805 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 0x57E8 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP4 POP DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x58A1 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x5876 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x58A1 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 0x5884 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP3 POP DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x593D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x5912 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x593D 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 0x5920 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x59D9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x59AE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59D9 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 0x59BC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x5A67 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x5ADB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5AEA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5BBE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E65722063616E206D6F64696679207468697300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5BCD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5BEA JUMPI INVALID JUMPDEST DUP2 PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5C07 JUMPI INVALID JUMPDEST EQ DUP1 ISZERO PUSH2 0x5C28 JUMPI POP PUSH1 0x0 DUP2 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x5CC2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E2062652063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x63656C6564000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5CE3 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4649584544000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5D37 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4578616D706C6520466978656420537570706C7920546F6B656E000000000000 DUP2 MSTORE POP PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5D83 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH3 0xF4240 MUL PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5F11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x13 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x5F9A 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 0x5F86 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5FF8 DUP3 PUSH1 0x7 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x608D DUP3 PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78FB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x61A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x61B8 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x622C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x623B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x10 DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x627C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x10 DUP9 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62BD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x5 ADD SLOAD PUSH1 0x10 DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62DE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x4 ADD SLOAD PUSH1 0x10 DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62FF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x6329 JUMPI INVALID JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x639B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x63B0 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x6424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6433 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x652D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79207468652064656C6567617465642070726F636573736F722063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x206D6F6469667920746869730000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x653C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP DUP4 DUP2 PUSH1 0x5 ADD PUSH1 0x0 DUP4 PUSH1 0x6 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x657C SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP3 DUP2 PUSH1 0x5 ADD PUSH1 0x0 DUP4 PUSH1 0x6 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x65AD SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP1 PUSH1 0x6 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x1 DUP2 PUSH1 0x6 ADD SLOAD SUB SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x8 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x8F4FFCB1 CALLER DUP6 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND 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 0x67B1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6796 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x67DE 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 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6800 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6814 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x68AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x68C2 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x6936 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6945 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 POP DUP5 PUSH1 0xE DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6989 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x2 ADD PUSH1 0xE DUP9 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69A9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x3 ADD PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69C9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x4 ADD PUSH1 0xE DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6A8F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6A64 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6A8F 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 0x6A72 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP4 POP DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6B2B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B00 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B2B 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 0x6B0E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP3 POP DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6BC7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B9C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6BC7 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 0x6BAA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6C63 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6C38 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6C63 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 0x6C46 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x6D69 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND 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 0x6E2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6E41 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 0x6E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x8 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x6F55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x6F6A JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x6FDE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6FED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x6 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x7064 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xF DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x70CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x70E3 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x7157 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7166 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x7223 JUMPI POP DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x72BD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E6572206F7220646174612070726F636573736F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x722063616E20617070726F766520746869730000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x7385 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x746865206F746865722070617274792073686F756C6420617070726F76650000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x7392 JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x73AF JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x7424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x7445 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x753E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x75E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x75F6 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x766A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x769A JUMPI POP PUSH1 0xE DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7685 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x7 ADD SLOAD DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x770E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206D657461646174614974656D20696E646578000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x771D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x6 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7751 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x6 ADD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x780B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x77E0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x780B 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 0x77EE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x78A7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x787C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x78A7 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 0x788A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x78F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 ADD SWAP1 POP DUP3 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x7911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP 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 0x7958 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x7986 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x7986 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x7985 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x796A JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x7993 SWAP2 SWAP1 PUSH2 0x7A17 JUMP JUMPDEST POP 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 0x79D8 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x7A06 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x7A06 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x7A05 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x79EA JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x7A13 SWAP2 SWAP1 PUSH2 0x7A17 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x7A39 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x7A35 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x7A1D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc8 EXTCODESIZE DUP4 SWAP16 POP CREATE2 0xb3 0xbe RETURNDATASIZE SGT 0xb7 PUSH21 0xE7FEBBE3C68CC931DDF606430B3E0BF9963FE4DF00 0x29 
```

{% endtab %}

{% tab title="Source Code" %}

```
pragma solidity ^0.4.0;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


import "./EthernityStorage.sol";
import "./Models.sol";

contract EthernityImplementationV1 is EthernityStorage {

    /**
    @notice Adds new Data Processor Request
    @param _cpuRequest The number of cpu cores
    @param _memRequest The amount of ram in GB
    @param _storageRequest The amount of storage in GB
    @param _bandwidthRequest The bandwidth amount
    @param _duration The amount of time the resource can be offered
    @param _minPrice The minimum price accepted for processing request
    @param _metadata1 Metadata to store in request
    @param _metadata2 Metadata to store in request
    @param _metadata3 Metadata to store in request
    @param _metadata4 Metadata to store in request

    @return {
          "_rowNumber": "Data processor request id"
    }
*/
    function _addDPRequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _minPrice,
        string _metadata1,
        string _metadata2,
        string _metadata3,
        string _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {

        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpuRequest is invalid");
        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "memRequest is invalid");
        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bandwidthRequest is invalid");
        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "storageRequest is invalid");


        usersDPRequests[msg.sender].push(dpRequestsList.length);
        return dpRequestsList.push(Models.DPRequest({
            dproc : msg.sender,
            cpuRequest : _cpuRequest,
            memoryRequest : _memRequest,
            storageRequest : _storageRequest,
            bandwidthRequest : _bandwidthRequest,
            duration : _duration,
            minPrice : _minPrice,
            createdAt : uint32(now),
            price : 0,
            metadataSize : 0,
            status : Models.RequestStatus.AVAILABLE,
            Metadata1 : _metadata1,
            Metadata2 : _metadata2,
            Metadata3 : _metadata3,
            Metadata4 : _metadata4
            })) - 1;
    }

    /**
        @notice Gets total count of Data Processor Requests
        @return { "_length": "The counter of dp requests" }
    */
    function _getDPRequestsCount() public constant onlyDelegate returns (uint256 _length) {

        return dpRequestsList.length;
    }

    /**
        @notice Gets details of a specific data processor request
        @param _requestListItem the request id
        @return {
              "dproc": "Data processor address",
              "cpuRequest": "The number of cpu cores[maximum 255]",
              "memoryRequest": "The amount of ram in GB[maximum 255]",
              "storageRequest": "The amount of storage in GB[maximum 255]",
              "bandwidthRequest": "The bandwidth amount[maximum 255]",
              "duration": "The amount of time the resource can be offered",
              "minPrice": "The minimum price accepted for processing request",
              "status": "The request status [values in Available/Booked/Canceled"
        }
    */
    function _getDPRequest(uint256 _requestListItem) public constant onlyDelegate returns (
        address dproc,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 minPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "Invalid index provided."
        );
        dproc = dpRequestsList[_requestListItem].dproc;
        status = uint(dpRequestsList[_requestListItem].status);

        return (
        dproc,
        dpRequestsList[_requestListItem].cpuRequest,
        dpRequestsList[_requestListItem].memoryRequest,
        dpRequestsList[_requestListItem].storageRequest,
        dpRequestsList[_requestListItem].bandwidthRequest,
        dpRequestsList[_requestListItem].duration,
        dpRequestsList[_requestListItem].minPrice,
        status
        );
    }

    /**
    @notice Gets  metadata of a data processor request
    @param _requestListItem the request id
    @return {
          "dpproc": "Data processor address",
          "metadata1": "Metadata field",
          "metadata2": "Metadata field",
          "metadata3": "Metadata field",
          "metadata4": "Metadata field",
    }
*/
    function _getDPRequestMetadata(uint256 _requestListItem) public constant onlyDelegate returns (
        address dproc,
        string metadata1,
        string metadata2,
        string metadata3,
        string metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];

        return (
        request.dproc,
        request.Metadata1,
        request.Metadata2,
        request.Metadata3,
        request.Metadata4
        );
    }


    /**
        @notice Cancels a data processor request
        @param _requestListItem the request id
        */
    function _cancelDPRequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");
        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "only delegated processor can modify this");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be canceled");

        request.status = Models.RequestStatus.CANCELED;
    }

    /**
    @notice Gets all data processor request id list
    @return {
          "req": "An array containing all data processor requests"
    }
    */
    function _getMyDPRequests() public constant onlyDelegate returns (uint256[] req){

        return usersDPRequests[msg.sender];
    }

    /**
    ** metadata storage part
    */
    /**
        @notice Adds an extra metadata to the data processor requests as key-value pair
        @param _requestListItem the request id
        @param _key Extra metadata key
        @param _value Extra metadata value
        @return {
                "_rowNumber": "Extra metadata id from dp order"
        }
        */
    function _addMetadataToDPRequest(uint256 _requestListItem, string _key, string _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "only the delegated processor can modify this");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    /**
    @notice Gets the total metadata for data processor request
    @param _requestListItem the request id
    @return {
          "_length": "The total extra metadata for the data processor request"
    }
    */
    function _getMetadataCountForDPRequest(uint256 _requestListItem) public constant onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        return dpRequestsList[_requestListItem].metadataSize;
    }

    /**
    @notice Gets metadata info for a data processor request with metadata id
    @param _requestListItem the request id
    @param _metadataItem the metadata item id
    @return {
          "key": "Metadata key",
          "value": "Metadata value"
    }
    */
    function _getMetadataValueForDPRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public constant returns (
        string key,
        string value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");
        require(
            _metadataItem >= 0 && _metadataItem < dpRequestsList[_requestListItem].metadataSize,
            "invalid metadataItem index");

        return (
        dpRequestsList[_requestListItem].metadata[_metadataItem].key,
        dpRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }

    /**
    * region data owner requests
    */

    /**
        @notice Adds new Data Owner Request
        @param _cpuRequest The number of cpu cores
        @param _memRequest The amount of ram in GB
        @param _storageRequest The amount of storage in GB
        @param _bandwidthRequest The bandwidth amount
        @param _duration The amount of time the resource can be offered
        @param _instances How many instances should be run
        @param _maxPrice The maximum price accepted for processing request
        @param _metadata1 Metadata to store in request
        @param _metadata2 Metadata to store in request
        @param _metadata3 Metadata to store in request
        @param _metadata4 Metadata to store in request

        @return {
              "_rowNumber": "Data owner request id"
        }
        */
    function _addDORequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _instances,
        uint8 _maxPrice,
        string _metadata1,
        string _metadata2,
        string _metadata3,
        string _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {

        require(
            _instances > 0 && _instances <= MAX_INSTANCES,
            "instance is invalid");

        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpuRequest is invalid");

        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "memRequest is invalid");

        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bandwidthRequest is invalid");

        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "storageRequest is invalid");

        usersDORequests[msg.sender].push(doRequestsList.length);
        return doRequestsList.push(Models.DORequest({
            downer : msg.sender,
            cpuRequest : _cpuRequest,
            memoryRequest : _memRequest,
            storageRequest : _storageRequest,
            bandwidthRequest : _bandwidthRequest,
            duration : _duration,
            instances : _instances,
            bookedInstances : 0,
            createdAt : uint32(now),
            maxPrice : _maxPrice,
            tokens : _maxPrice * _instances * _duration,
            metadataSize : 0,
            status : Models.RequestStatus.AVAILABLE,
            Metadata1 : _metadata1,
            Metadata2 : _metadata2,
            Metadata3 : _metadata3,
            Metadata4 : _metadata4
            })) - 1;

    }

    /**
        @notice Gets total count of Data Owner Requests
        @return { "_length": "The counter of do requests" }
        */
    function _getDORequestsCount() public constant onlyDelegate returns (uint256 _length) {

        return doRequestsList.length;
    }

    /**
        @notice Gets details of a specific data owner request
        @param _requestListItem the request id
        @return {
              "downer": "Data owner address",
              "cpuRequest": "The number of cpu cores[maximum 255]",
              "memoryRequest": "The amount of ram in GB[maximum 255]",
              "storageRequest": "The amount of storage in GB[maximum 255]",
              "bandwidthRequest": "The bandwidth amount[maximum 255]",
              "duration": "The amount of time the resource can be offered",
              "maxPrice": "The maximum price accepted for processing request",
              "status": "The request status [values in Available/Booked/Canceled"
        }
    */
    function _getDORequest(uint256 _requestListItem) public constant onlyDelegate returns (
        address downer,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 maxPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        downer = doRequestsList[_requestListItem].downer;
        status = uint(doRequestsList[_requestListItem].status);
        return (
        downer,
        doRequestsList[_requestListItem].cpuRequest,
        doRequestsList[_requestListItem].memoryRequest,
        doRequestsList[_requestListItem].storageRequest,
        doRequestsList[_requestListItem].bandwidthRequest,
        doRequestsList[_requestListItem].duration,
        doRequestsList[_requestListItem].maxPrice,
        status
        );
    }

    /**
        @notice Gets  metadata of a data owner request
        @param _requestListItem the request id
        @return {
              "metadata1": "Metadata field",
              "metadata2": "Metadata field",
              "metadata3": "Metadata field",
              "metadata4": "Metadata field",
        }
        */
    function _getDORequestMetadata(uint256 _requestListItem) public constant onlyDelegate returns (
        address downer,
        string metadata1,
        string metadata2,
        string metadata3,
        string metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        downer = doRequestsList[_requestListItem].downer;
        return (
        downer,
        doRequestsList[_requestListItem].Metadata1,
        doRequestsList[_requestListItem].Metadata2,
        doRequestsList[_requestListItem].Metadata3,
        doRequestsList[_requestListItem].Metadata4
        );
    }

    /**
        @notice Cancels a data owner request
        @param _requestListItem the request id
        */
    function _cancelDORequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");
        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "only data owner can modify this");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE && request.bookedInstances == 0,
            "Only available status can be canceled");

        request.status = Models.RequestStatus.CANCELED;
    }

    /**
        @notice Gets all data owner request id list
        @return {
              "req": "An array containing all data owner requests"
        }
        */
    function _getMyDORequests() public constant onlyDelegate returns (uint256[] req){

        return usersDORequests[msg.sender];
    }

    /**
        @notice Adds an extra metadata to the data owner request as key-value pair
        @param _requestListItem the request id
        @param _key Extra metadata key
        @param _value Extra metadata value
        @return {
              "_rowNumber": "The metadata item id of the data owner request"
        }
        */
    function _addMetadataToRequest(uint256 _requestListItem, string _key, string _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "only data owner can modify this");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    /**
        @notice Gets extra metadata count for order
        @param _requestListItem the request id
        @return {
            "_length": "The extra metadata count"
        }
        */
    function _getMetadataCountForRequest(uint256 _requestListItem) public constant onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        return doRequestsList[_requestListItem].metadataSize;
    }

    /**
        @notice Gets metadata info for a data owner request with metadata id
        @param _requestListItem the request id
        @param _metadataItem the metadata item id
        @return {
              "key": "Metadata key",
              "value": "Metadata value"
        }
        */
    function _getMetadataValueForRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public constant returns (
        string key,
        string value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");
        require(
            _metadataItem >= 0 && _metadataItem < doRequestsList[_requestListItem].metadataSize,
            "invalid metadataItem index");

        return (
        doRequestsList[_requestListItem].metadata[_metadataItem].key,
        doRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }


    /**
    * order region
    */

    /**
        @notice Places new order - this can placed by dp/do
        @param _doRequestItem the data owner request id
        @param _dpRequestItem the data processor request id
        @return {
              "_orderNumber": "Order number"
        }
        */
    function _placeOrder(uint256 _doRequestItem, uint256 _dpRequestItem) public onlyDelegate returns (uint _orderNumber){
        require(
            _doRequestItem >= 0 && _doRequestItem < doRequestsList.length,
            "invalid do request index");

        require(
            _dpRequestItem >= 0 && _dpRequestItem < dpRequestsList.length,
            "invalid dp request index");

        Models.DORequest storage doRequest = doRequestsList[_doRequestItem];
        require(
            doRequest.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be requested");
        Models.DPRequest storage dpRequest = dpRequestsList[_dpRequestItem];
        require(
            dpRequest.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be requested");

        require(
            dpRequest.dproc == msg.sender || doRequest.downer == msg.sender,
            "Only data/process owner or delegated processsor can place this order");

        address placedBy;
        if (dpRequest.dproc == msg.sender)
            placedBy = dpRequest.dproc;
        else
            placedBy = doRequest.downer;

        doRequest.bookedInstances = doRequest.bookedInstances + 1;
        if (doRequest.bookedInstances == doRequest.instances)
            doRequest.status = Models.RequestStatus.BOOKED;

        dpRequest.status = Models.RequestStatus.BOOKED;

        usersOrders[dpRequest.dproc].push(orders.length);
        usersOrders[doRequest.downer].push(orders.length);

        return orders.push(Models.Order({
            instance : doRequest.bookedInstances,
            dproc : dpRequest.dproc,
            downer : doRequest.downer,
            placedBy : placedBy,
            processor : address(0),
            dpRequest : _dpRequestItem,
            doRequest : _doRequestItem,
            timeout : uint32(now),
            metadataSize : 0,
            status : Models.OrderStatus.OPEN,
            price : 0,
            result : ''
            })) - 1;

    }

    /**
        @notice Gets order count
        @return {
              "_length": "Order count"
        }
        */
    function _getOrdersCount() public constant onlyDelegate returns (uint256 _length) {

        return orders.length;
    }

    /**
        @notice Gets the list of orders
        @return {
              "req": "Orders list"
        }
        */
    function _getMyDOOrders() public constant onlyDelegate returns (uint256[] req){

        return usersOrders[msg.sender];
    }


    /**
        @notice Gets order info
        @param _orderItem the order id
        @return {
              "downer": "Data owner address",
              "dproc": "Data processor address",
              "doRequest": "Data owner request id",
              "dpRequest": "Data processor request id",
              "status": "Order status"
        }
        */
    function _getOrder(uint256 _orderItem) public onlyDelegate constant returns (
        address downer,
        address dproc,
        uint doRequest,
        uint dpRequest,
        uint status)
    {
        require(
            _orderItem >= 0 && _orderItem < doRequestsList.length,
            "invalid request index");

        return (
        orders[_orderItem].downer,
        orders[_orderItem].dproc,
        orders[_orderItem].doRequest,
        orders[_orderItem].dpRequest,
        uint(orders[_orderItem].status)
        );
    }


    /**
    * orders can be processed only after being approved
    * by other part(do/dp)
    */
    /**
        @notice Approves order - orders can be processed only after being approved by other part(do/dp)
        @param _orderItem the order id
        @return {
              "success": "Status of operation"
        }
        */
    function _approveOrder(uint256 _orderItem) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.downer || msg.sender == order.dproc,
            "only data owner or data processor can approve this");

        require(
            msg.sender != order.placedBy,
            "the other party should approve");

        require(
            order.status == Models.OrderStatus.OPEN,
            "only open orders can be approved"
        );

        order.status = Models.OrderStatus.PROCESSING;
        return true;
    }

    /**
    * add processor address by data processor
    */
    /**
        @notice Adds a processor to order
        @param _orderItem Order number
        @param processor Processor address
        @return {
              "success": "Status of operation"
        }
        */
    function _addProcessorToOrder(uint256 _orderItem, address processor) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.dproc,
            "only data processor can add a processor");

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "only open orders can be approved"
        );

        order.processor = processor;
        return true;
    }

    /**
    * add result to order
    */
    /**
        @notice Adds result to order
        @param _orderItem Order number
        @param _result processor output after processing
        @return {
              "success": "Status of operation"
        }
        */
    function _addResultToOrder(uint256 _orderItem, string _result) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.processor,
            "only processor can add a result");

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "only open orders can be approved"
        );


        order.result = _result;
        order.status = Models.OrderStatus.CLOSED;
        return true;
    }

    /**
    * get result from order
    */
    /**
        @notice Gets result from order
        @param _orderItem Order number
        @return {
              "_Result": "Order Result"
        }
        */
    function _getResultFromOrder(uint256 _orderItem) public constant onlyDelegate returns (string _Result){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.downer,
            "only owner can read the results");

        require(
            order.status == Models.OrderStatus.CLOSED,
            "only closed orders have the result"
        );

        return order.result;
    }
}
```

{% endtab %}
{% endtabs %}


# Data Processor API

{% tabs %}
{% tab title="Methods" %}

### `_addDPRequest` `3701f582`

**Adds new Data Processor Request**

|         |         |                     |                                                   |
| ------- | ------- | ------------------- | ------------------------------------------------- |
| inputs  |         |                     |                                                   |
| 0       | uint8   | `_cpuRequest`       | The number of cpu cores                           |
| 1       | uint8   | `_memRequest`       | The amount of ram in GB                           |
| 2       | uint8   | `_storageRequest`   | The amount of storage in GB                       |
| 3       | uint8   | `_bandwidthRequest` | The bandwidth amount                              |
| 4       | uint16  | `_duration`         | The amount of time the resource can be offered    |
| 5       | uint8   | `_minPrice`         | The minimum price accepted for processing request |
| 6       | string  | `_metadata1`        | Metadata to store in request                      |
| 7       | string  | `_metadata2`        | Metadata to store in request                      |
| 8       | string  | `_metadata3`        | Metadata to store in request                      |
| 9       | string  | `_metadata4`        | Metadata to store in request                      |
| outputs |         |                     |                                                   |
| 0       | uint256 | `_rowNumber`        | Data processor request id                         |

### `_addProcessorToOrder` `4509b7e0`

**Adds a processor to order**

|         |         |              |                     |
| ------- | ------- | ------------ | ------------------- |
| inputs  |         |              |                     |
| 0       | uint256 | `_orderItem` | Order number        |
| 1       | address | `processor`  | Processor address   |
| outputs |         |              |                     |
| 0       | bool    | `success`    | Status of operation |

### `_addResultToOrder` `14e9f384`

**Adds result to order**

|         |         |              |                                   |
| ------- | ------- | ------------ | --------------------------------- |
| inputs  |         |              |                                   |
| 0       | uint256 | `_orderItem` | Order number                      |
| 1       | string  | `_result`    | processor output after processing |
| outputs |         |              |                                   |
| 0       | bool    | `success`    | Status of operation               |

### `_approveOrder` `efa09d85`

**Approves order - orders can be processed only after being approved by other part(do/dp)**

|         |         |              |                     |
| ------- | ------- | ------------ | ------------------- |
| inputs  |         |              |                     |
| 0       | uint256 | `_orderItem` | the order id        |
| outputs |         |              |                     |
| 0       | bool    | `success`    | Status of operation |

### `_cancelDPRequest` `676a96d8`

**Cancels a data processor request**

|        |         |                    |                |
| ------ | ------- | ------------------ | -------------- |
| inputs |         |                    |                |
| 0      | uint256 | `_requestListItem` | the request id |

### `_getDPRequest` `00d74970`

**Gets details of a specific data processor request**

|         |         |                    |                                                          |
| ------- | ------- | ------------------ | -------------------------------------------------------- |
| inputs  |         |                    |                                                          |
| 0       | uint256 | `_requestListItem` | the request id                                           |
| outputs |         |                    |                                                          |
| 0       | address | `dproc`            | Data processor address                                   |
| 1       | uint8   | `cpuRequest`       | The number of cpu cores\[maximum 255]                    |
| 2       | uint8   | `memoryRequest`    | The amount of ram in GB\[maximum 255]                    |
| 3       | uint8   | `storageRequest`   | The amount of storage in GB\[maximum 255]                |
| 4       | uint8   | `bandwidthRequest` | The bandwidth amount\[maximum 255]                       |
| 5       | uint16  | `duration`         | The amount of time the resource can be offered           |
| 6       | uint8   | `minPrice`         | The minimum price accepted for processing request        |
| 7       | uint256 | `status`           | The request status \[values in Available/Booked/Canceled |

### `_getDPRequestMetadata` `98455999`

**Gets metadata of a data processor request**

|         |         |                    |                |
| ------- | ------- | ------------------ | -------------- |
| inputs  |         |                    |                |
| 0       | uint256 | `_requestListItem` | the request id |
| outputs |         |                    |                |
| 0       | address | `dproc`            |                |
| 1       | string  | `metadata1`        |                |
| 2       | string  | `metadata2`        |                |
| 3       | string  | `metadata3`        |                |
| 4       | string  | `metadata4`        |                |

### `_getDPRequestsCount` `e780ada1`

**Gets total count of Data Processor Requests**

|         |         |           |                            |
| ------- | ------- | --------- | -------------------------- |
| outputs |         |           |                            |
| 0       | uint256 | `_length` | The counter of dp requests |

### `_getMyDOOrders` `a8203abb`

**Gets the list of orders**

|         |            |       |             |
| ------- | ---------- | ----- | ----------- |
| outputs |            |       |             |
| 0       | uint256\[] | `req` | Orders list |

function, constant

#### `_getMyDPRequests` `4c1782e5`

**Gets all data processor request id list**

|         |            |       |                                                 |
| ------- | ---------- | ----- | ----------------------------------------------- |
| outputs |            |       |                                                 |
| 0       | uint256\[] | `req` | An array containing all data processor requests |

### `_getOrder` `b3bb3da3`

**Gets order info**

|         |         |              |                           |
| ------- | ------- | ------------ | ------------------------- |
| inputs  |         |              |                           |
| 0       | uint256 | `_orderItem` | the order id              |
| outputs |         |              |                           |
| 0       | address | `downer`     | Data owner address        |
| 1       | address | `dproc`      | Data processor address    |
| 2       | uint256 | `doRequest`  | Data owner request id     |
| 3       | uint256 | `dpRequest`  | Data processor request id |
| 4       | uint256 | `status`     | Order status              |

### `_getOrdersCount` `246439e6`

**Gets order count**

|         |         |           |             |
| ------- | ------- | --------- | ----------- |
| outputs |         |           |             |
| 0       | uint256 | `_length` | Order count |

### `_getResultFromOrder` `008a81a6`

**Gets result from order**

|         |         |              |              |
| ------- | ------- | ------------ | ------------ |
| inputs  |         |              |              |
| 0       | uint256 | `_orderItem` | Order number |
| outputs |         |              |              |
| 0       | string  | `_Result`    | Order Result |

### `_placeOrder` `9818e66c`

**Places new order - this can placed by dp/do**

|              |         |                  |                               |
| ------------ | ------- | ---------------- | ----------------------------- |
| inputs       |         |                  |                               |
| 0            | uint256 | `_doRequestItem` | the data owner request id     |
| 1            | uint256 | `_dpRequestItem` | the data processor request id |
| outputs      |         |                  |                               |
| 0            | uint256 | `_orderNumber`   | Order number                  |
| {% endtab %} |         |                  |                               |

{% tab title="ABI" %}

```bash
"[{\"constant\":true,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_getResultFromOrder\",\"outputs\":[{\"name\":\"_Result\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDPRequest\",\"outputs\":[{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"cpuRequest\",\"type\":\"uint8\"},{\"name\":\"memoryRequest\",\"type\":\"uint8\"},{\"name\":\"storageRequest\",\"type\":\"uint8\"},{\"name\":\"bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"duration\",\"type\":\"uint16\"},{\"name\":\"minPrice\",\"type\":\"uint8\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"},{\"name\":\"_result\",\"type\":\"string\"}],\"name\":\"_addResultToOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_metadataItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataValueForDPRequest\",\"outputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getOrdersCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cpuRequest\",\"type\":\"uint8\"},{\"name\":\"_memRequest\",\"type\":\"uint8\"},{\"name\":\"_storageRequest\",\"type\":\"uint8\"},{\"name\":\"_bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"_duration\",\"type\":\"uint16\"},{\"name\":\"_minPrice\",\"type\":\"uint8\"},{\"name\":\"_metadata1\",\"type\":\"string\"},{\"name\":\"_metadata2\",\"type\":\"string\"},{\"name\":\"_metadata3\",\"type\":\"string\"},{\"name\":\"_metadata4\",\"type\":\"string\"}],\"name\":\"_addDPRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"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\":\"_newProxy\",\"type\":\"address\"}],\"name\":\"transferProxy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"_addMetadataToRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"},{\"name\":\"processor\",\"type\":\"address\"}],\"name\":\"_addProcessorToOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDPRequests\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDORequest\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"cpuRequest\",\"type\":\"uint8\"},{\"name\":\"memoryRequest\",\"type\":\"uint8\"},{\"name\":\"storageRequest\",\"type\":\"uint8\"},{\"name\":\"bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"duration\",\"type\":\"uint16\"},{\"name\":\"maxPrice\",\"type\":\"uint8\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataCountForRequest\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_cancelDPRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenOwner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"implementationPro\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getDORequestsCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cpuRequest\",\"type\":\"uint8\"},{\"name\":\"_memRequest\",\"type\":\"uint8\"},{\"name\":\"_storageRequest\",\"type\":\"uint8\"},{\"name\":\"_bandwidthRequest\",\"type\":\"uint8\"},{\"name\":\"_duration\",\"type\":\"uint16\"},{\"name\":\"_instances\",\"type\":\"uint8\"},{\"name\":\"_maxPrice\",\"type\":\"uint8\"},{\"name\":\"_metadata1\",\"type\":\"string\"},{\"name\":\"_metadata2\",\"type\":\"string\"},{\"name\":\"_metadata3\",\"type\":\"string\"},{\"name\":\"_metadata4\",\"type\":\"string\"}],\"name\":\"_addDORequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDORequests\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_doRequestItem\",\"type\":\"uint256\"},{\"name\":\"_dpRequestItem\",\"type\":\"uint256\"}],\"name\":\"_placeOrder\",\"outputs\":[{\"name\":\"_orderNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDPRequestMetadata\",\"outputs\":[{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"metadata1\",\"type\":\"string\"},{\"name\":\"metadata2\",\"type\":\"string\"},{\"name\":\"metadata3\",\"type\":\"string\"},{\"name\":\"metadata4\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_cancelDORequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"FixedSupplyToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getMyDOOrders\",\"outputs\":[{\"name\":\"req\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_getOrder\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"dproc\",\"type\":\"address\"},{\"name\":\"doRequest\",\"type\":\"uint256\"},{\"name\":\"dpRequest\",\"type\":\"uint256\"},{\"name\":\"status\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"_addMetadataToDPRequest\",\"outputs\":[{\"name\":\"_rowNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getDORequestMetadata\",\"outputs\":[{\"name\":\"downer\",\"type\":\"address\"},{\"name\":\"metadata1\",\"type\":\"string\"},{\"name\":\"metadata2\",\"type\":\"string\"},{\"name\":\"metadata3\",\"type\":\"string\"},{\"name\":\"metadata4\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\"},{\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"transferAnyERC20Token\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokenOwner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataCountForDPRequest\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_getDPRequestsCount\",\"outputs\":[{\"name\":\"_length\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_orderItem\",\"type\":\"uint256\"}],\"name\":\"_approveOrder\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_requestListItem\",\"type\":\"uint256\"},{\"name\":\"_metadataItem\",\"type\":\"uint256\"}],\"name\":\"_getMetadataValueForRequest\",\"outputs\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"caller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"ProxyTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"tokenOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]"
```

{% endtab %}

{% tab title="Bytecode" %}

```
6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040805190810160405280600f81526020017f45746865726e69747920546f6b656e000000000000000000000000000000000081525060049080519060200190620000d292919062000255565b506040805190810160405280600481526020017f45544e5900000000000000000000000000000000000000000000000000000000815250600390805190602001906200012092919062000255565b506012600560006101000a81548160ff021916908360ff160217905550600560009054906101000a900460ff1660ff16600a0a633b9aca0002600681905550600654600760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040518082815260200191505060405180910390a362000304565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200029857805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c8578251825591602001919060010190620002ab565b5b509050620002d89190620002dc565b5090565b6200030191905b80821115620002fd576000816000905550600101620002e3565b5090565b90565b617a6880620003146000396000f300608060405260043610610239576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680628a81a61461023e578062d74970146102e457806306fdde03146103a8578063095ea7b31461043857806314e9f3841461049d57806318160ddd146105285780632118c02c1461055357806323b872dd1461066f578063246439e6146106f4578063313ce5671461071f5780633701f582146107505780633eaaf86b146108ee578063438787d01461091957806344cc3c7f1461095c5780634509b7e014610a295780634c1782e514610a8e5780634f74787b14610afa5780635c60da1b14610bbe5780635d87b6e614610c15578063676a96d814610c5657806370a0823114610c8357806374ed9ae414610cda57806379ba509714610d315780637aed121414610d485780638da5cb5b14610d7357806392b9377414610dca5780639313236614610f7557806395d89b4114610fe15780639818e66c1461107157806398455999146110bc5780639ecbec41146112d9578063a1183d5014611306578063a8203abb1461131d578063a9059cbb14611389578063b3bb3da3146113ee578063b5d11dfa146114a3578063cae9ca5114611570578063d4ee1d901461161b578063d9edc13914611672578063dc39d06d1461188f578063dd62ed3e146118f4578063e2eef9c31461196b578063e780ada1146119ac578063efa09d85146119d7578063f2fde38b14611a1c578063f4de530514611a5f578063fc9c8d3914611b7b575b600080fd5b34801561024a57600080fd5b5061026960048036038101908080359060200190929190505050611bd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f057600080fd5b5061030f60048036038101908080359060200190929190505050611f0b565b604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018860ff1660ff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018360ff1660ff1681526020018281526020019850505050505050505060405180910390f35b3480156103b457600080fd5b506103bd6121ac565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103fd5780820151818401526020810190506103e2565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b50610483600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061224a565b604051808215151515815260200191505060405180910390f35b3480156104a957600080fd5b5061050e60048036038101908080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061233c565b604051808215151515815260200191505060405180910390f35b34801561053457600080fd5b5061053d6125f3565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b50610588600480360381019080803590602001909291908035906020019092919050505061263e565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156105cc5780820151818401526020810190506105b1565b50505050905090810190601f1680156105f95780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610632578082015181840152602081019050610617565b50505050905090810190601f16801561065f5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561067b57600080fd5b506106da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612975565b604051808215151515815260200191505060405180910390f35b34801561070057600080fd5b50610709612c20565b6040518082815260200191505060405180910390f35b34801561072b57600080fd5b50610734612c89565b604051808260ff1660ff16815260200191505060405180910390f35b34801561075c57600080fd5b506108d8600480360381019080803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803561ffff169060200190929190803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612c9c565b6040518082815260200191505060405180910390f35b3480156108fa57600080fd5b50610903613288565b6040518082815260200191505060405180910390f35b34801561092557600080fd5b5061095a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061328e565b005b34801561096857600080fd5b50610a1360048036038101908080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133bc565b6040518082815260200191505060405180910390f35b348015610a3557600080fd5b50610a7460048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061362e565b604051808215151515815260200191505060405180910390f35b348015610a9a57600080fd5b50610aa361390f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610ae6578082015181840152602081019050610acb565b505050509050019250505060405180910390f35b348015610b0657600080fd5b50610b2560048036038101908080359060200190929190505050613a00565b604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018860ff1660ff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018360ff1660ff1681526020018281526020019850505050505050505060405180910390f35b348015610bca57600080fd5b50610bd3613ca1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c2157600080fd5b50610c4060048036038101908080359060200190929190505050613cc7565b6040518082815260200191505060405180910390f35b348015610c6257600080fd5b50610c8160048036038101908080359060200190929190505050613dd6565b005b348015610c8f57600080fd5b50610cc4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140d4565b6040518082815260200191505060405180910390f35b348015610ce657600080fd5b50610cef61411d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d3d57600080fd5b50610d46614143565b005b348015610d5457600080fd5b50610d5d6142e2565b6040518082815260200191505060405180910390f35b348015610d7f57600080fd5b50610d8861434b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dd657600080fd5b50610f5f600480360381019080803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803560ff169060200190929190803561ffff169060200190929190803560ff169060200190929190803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050614370565b6040518082815260200191505060405180910390f35b348015610f8157600080fd5b50610f8a614a55565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610fcd578082015181840152602081019050610fb2565b505050509050019250505060405180910390f35b348015610fed57600080fd5b50610ff6614b46565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561103657808201518184015260208101905061101b565b50505050905090810190601f1680156110635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561107d57600080fd5b506110a66004803603810190808035906020019092919080359060200190929190505050614be4565b6040518082815260200191505060405180910390f35b3480156110c857600080fd5b506110e76004803603810190808035906020019092919050505061562d565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561116557808201518184015260208101905061114a565b50505050905090810190601f1680156111925780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b838110156111cb5780820151818401526020810190506111b0565b50505050905090810190601f1680156111f85780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015611231578082015181840152602081019050611216565b50505050905090810190601f16801561125e5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561129757808201518184015260208101905061127c565b50505050905090810190601f1680156112c45780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156112e557600080fd5b50611304600480360381019080803590602001909291905050506159f4565b005b34801561131257600080fd5b5061131b615cec565b005b34801561132957600080fd5b50611332615eb3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561137557808201518184015260208101905061135a565b505050509050019250505060405180910390f35b34801561139557600080fd5b506113d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050615fa4565b604051808215151515815260200191505060405180910390f35b3480156113fa57600080fd5b506114196004803603810190808035906020019092919050505061613f565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156114af57600080fd5b5061155a60048036038101908080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061633c565b6040518082815260200191505060405180910390f35b34801561157c57600080fd5b50611601600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506165d4565b604051808215151515815260200191505060405180910390f35b34801561162757600080fd5b50611630616823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561167e57600080fd5b5061169d60048036038101908080359060200190929190505050616849565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561171b578082015181840152602081019050611700565b50505050905090810190601f1680156117485780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b83811015611781578082015181840152602081019050611766565b50505050905090810190601f1680156117ae5780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156117e75780820151818401526020810190506117cc565b50505050905090810190601f1680156118145780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561184d578082015181840152602081019050611832565b50505050905090810190601f16801561187a5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b34801561189b57600080fd5b506118da600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050616c7d565b604051808215151515815260200191505060405180910390f35b34801561190057600080fd5b50611955600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050616e70565b6040518082815260200191505060405180910390f35b34801561197757600080fd5b5061199660048036038101908080359060200190929190505050616ef7565b6040518082815260200191505060405180910390f35b3480156119b857600080fd5b506119c1617006565b6040518082815260200191505060405180910390f35b3480156119e357600080fd5b50611a026004803603810190808035906020019092919050505061706f565b604051808215151515815260200191505060405180910390f35b348015611a2857600080fd5b50611a5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050617454565b005b348015611a6b57600080fd5b50611a946004803603810190808035906020019092919080359060200190929190505050617582565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ad8578082015181840152602081019050611abd565b50505050905090810190601f168015611b055780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611b3e578082015181840152602081019050611b23565b50505050905090810190601f168015611b6b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015611b8757600080fd5b50611b906178b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3257600080fd5b60008310158015611c47575060108054905083105b1515611cbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b601083815481101515611cca57fe5b90600052602060002090600c020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c79206f776e65722063616e20726561642074686520726573756c74730081525060200191505060405180910390fd5b60026003811115611dae57fe5b81600b0160009054906101000a900460ff166003811115611dcb57fe5b141515611e66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6f6e6c7920636c6f736564206f7264657273206861766520746865207265737581526020017f6c7400000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806009018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efe5780601f10611ed357610100808354040283529160200191611efe565b820191906000526020600020905b815481529060010190602001808311611ee157829003601f168201915b5050505050915050919050565b600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7357600080fd5b60008910158015611f885750600f8054905089105b1515611ffc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c696420696e6465782070726f76696465642e00000000000000000081525060200191505060405180910390fd5b600f8981548110151561200b57fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750600f8981548110151561204e57fe5b906000526020600020906008020160070160009054906101000a900460ff16600281111561207857fe5b905087600f8a81548110151561208a57fe5b906000526020600020906008020160000160149054906101000a900460ff16600f8b8154811015156120b857fe5b906000526020600020906008020160000160159054906101000a900460ff16600f8c8154811015156120e657fe5b906000526020600020906008020160000160169054906101000a900460ff16600f8d81548110151561211457fe5b906000526020600020906008020160000160179054906101000a900460ff16600f8e81548110151561214257fe5b906000526020600020906008020160000160189054906101000a900461ffff16600f8f81548110151561217157fe5b9060005260206000209060080201600001601a9054906101000a900460ff168797509750975097509750975097509750919395975091939597565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b505050505081565b600081600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561239b57600080fd5b600084101580156123b0575060108054905084105b1515612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108481548110151561243357fe5b90600052602060002090600c020190508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792070726f636573736f722063616e20616464206120726573756c740081525060200191505060405180910390fd5b6001600381111561251757fe5b81600b0160009054906101000a900460ff16600381111561253457fe5b1415156125a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b828160090190805190602001906125c1929190617917565b50600281600b0160006101000a81548160ff021916908360038111156125e357fe5b0217905550600191505092915050565b6000600760008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460065403905090565b606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561269d57600080fd5b600084101580156126b25750600f8054905084105b1515612726576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600083101580156127565750600f8481548110151561274157fe5b90600052602060002090600802016006015483105b15156127ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e76616c6964206d657461646174614974656d20696e64657800000000000081525060200191505060405180910390fd5b600f848154811015156127d957fe5b90600052602060002090600802016005016000848152602001908152602001600020600001600f8581548110151561280d57fe5b90600052602060002090600802016005016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128c75780601f1061289c576101008083540402835291602001916128c7565b820191906000526020600020905b8154815290600101906020018083116128aa57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129635780601f1061293857610100808354040283529160200191612963565b820191906000526020600020905b81548152906001019060200180831161294657829003601f168201915b50505050509050915091509250929050565b60006129c982600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9b82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b6d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178fb90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7e57600080fd5b601080549050905090565b600560009054906101000a900460ff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cfa57600080fd5b60008b60ff16118015612d13575060ff80168b60ff1611155b1515612d87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6370755265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008a60ff16118015612da0575060ff80168a60ff1611155b1515612e14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6d656d5265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008860ff16118015612e2d575060ff80168860ff1611155b1515612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f62616e6477696474685265717565737420697320696e76616c6964000000000081525060200191505060405180910390fd5b60008960ff16118015612eba575060ff80168960ff1611155b1515612f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f73746f726167655265717565737420697320696e76616c69640000000000000081525060200191505060405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600f8054905090806001815401808255809150509060018203906000526020600020016000909192909190915055506001600f6101e0604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b60ff1681526020018a61ffff1681526020018960ff1681526020014263ffffffff168152602001600060ff168152602001888152602001878152602001868152602001858152602001600081526020016000600281111561304257fe5b8152509080600181540180825580915050906001820390600052602060002090600802016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600001601f6101000a81548160ff021916908360ff1602179055506101208201518160010190805190602001906131e5929190617997565b50610140820151816002019080519060200190613203929190617997565b50610160820151816003019080519060200190613221929190617997565b5061018082015181600401908051906020019061323f929190617997565b506101a082015181600601556101c08201518160070160006101000a81548160ff0219169083600281111561327057fe5b021790555050500390509a9950505050505050505050565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561341b57600080fd5b600085101580156134305750600e8054905085105b15156134a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e858154811015156134b357fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792064617461206f776e65722063616e206d6f6469667920746869730081525060200191505060405180910390fd5b600e8581548110151561359657fe5b90600052602060002090600902019050838160060160008360070154815260200190815260200160002060000190805190602001906135d6929190617917565b5082816006016000836007015481526020019081526020016000206001019080519060200190613607929190617917565b50806007016000815480929190600101919050555060018160070154039150509392505050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561368d57600080fd5b600084101580156136a2575060108054905084105b1515613716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108481548110151561372557fe5b90600052602060002090600c020190508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f6f6e6c7920646174612070726f636573736f722063616e20616464206120707281526020017f6f636573736f720000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600381111561382f57fe5b81600b0160009054906101000a900460ff16600381111561384c57fe5b1415156138c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600191505092915050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561396d57600080fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156139f657602002820191906000526020600020905b8154815260200190600101908083116139e2575b5050505050905090565b600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a6857600080fd5b60008910158015613a7d5750600e8054905089105b1515613af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e89815481101515613b0057fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169750600e89815481101515613b4357fe5b906000526020600020906009020160080160009054906101000a900460ff166002811115613b6d57fe5b905087600e8a815481101515613b7f57fe5b906000526020600020906009020160000160149054906101000a900460ff16600e8b815481101515613bad57fe5b906000526020600020906009020160000160159054906101000a900460ff16600e8c815481101515613bdb57fe5b906000526020600020906009020160000160169054906101000a900460ff16600e8d815481101515613c0957fe5b906000526020600020906009020160000160179054906101000a900460ff16600e8e815481101515613c3757fe5b906000526020600020906009020160000160189054906101000a900461ffff16600e8f815481101515613c6657fe5b906000526020600020906009020160010160009054906101000a900460ff168797509750975097509750975097509750919395975091939597565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613d2557600080fd5b60008210158015613d3a5750600e8054905082105b1515613dae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e82815481101515613dbd57fe5b9060005260206000209060090201600701549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e3457600080fd5b60008210158015613e495750600f8054905082105b1515613ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f82815481101515613ecc57fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f6f6e6c792064656c6567617465642070726f636573736f722063616e206d6f6481526020017f696679207468697300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f82815481101515613fd557fe5b9060005260206000209060080201905060006002811115613ff257fe5b8160070160009054906101000a900460ff16600281111561400f57fe5b1415156140aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652063616e81526020017f63656c656400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028160070160006101000a81548160ff021916908360028111156140cb57fe5b02179055505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561419f57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561434057600080fd5b600e80549050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156143ce57600080fd5b60008760ff161180156143e85750600a60ff168760ff1611155b151561445c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e7374616e636520697320696e76616c69640000000000000000000000000081525060200191505060405180910390fd5b60008c60ff16118015614475575060ff80168c60ff1611155b15156144e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6370755265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008b60ff16118015614502575060ff80168b60ff1611155b1515614576576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6d656d5265717565737420697320696e76616c6964000000000000000000000081525060200191505060405180910390fd5b60008960ff1611801561458f575060ff80168960ff1611155b1515614603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f62616e6477696474685265717565737420697320696e76616c6964000000000081525060200191505060405180910390fd5b60008a60ff1611801561461c575060ff80168a60ff1611155b1515614690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f73746f726167655265717565737420697320696e76616c69640000000000000081525060200191505060405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600e8054905090806001815401808255809150509060018203906000526020600020016000909192909190915055506001600e610220604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018f60ff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b61ffff1681526020018a60ff168152602001600060ff1681526020014263ffffffff1681526020018960ff1681526020018b8b8b0260ff160261ffff1663ffffffff16815260200188815260200187815260200186815260200185815260200160008152602001600060028111156147c457fe5b8152509080600181540180825580915050906001820390600052602060002090600902016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548160ff021916908360ff16021790555061010082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160006101000a81548160ff021916908360ff1602179055506101408201518160010160016101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160020190805190602001906149b1929190617997565b506101808201518160030190805190602001906149cf929190617997565b506101a08201518160040190805190602001906149ed929190617997565b506101c0820151816005019080519060200190614a0b929190617997565b506101e082015181600701556102008201518160080160006101000a81548160ff02191690836002811115614a3c57fe5b021790555050500390509b9a5050505050505050505050565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614ab357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015614b3c57602002820191906000526020600020905b815481526020019060010190808311614b28575b5050505050905090565b60038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614bdc5780601f10614bb157610100808354040283529160200191614bdc565b820191906000526020600020905b815481529060010190602001808311614bbf57829003601f168201915b505050505081565b600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614c4657600080fd5b60008610158015614c5b5750600e8054905086105b1515614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c696420646f207265717565737420696e646578000000000000000081525060200191505060405180910390fd5b60008510158015614ce45750600f8054905085105b1515614d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206470207265717565737420696e646578000000000000000081525060200191505060405180910390fd5b600e86815481101515614d6757fe5b9060005260206000209060090201925060006002811115614d8457fe5b8360080160009054906101000a900460ff166002811115614da157fe5b141515614e3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652072657181526020017f756573746564000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f85815481101515614e4b57fe5b9060005260206000209060080201915060006002811115614e6857fe5b8260070160009054906101000a900460ff166002811115614e8557fe5b141515614f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652072657181526020017f756573746564000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480614fcd57503373ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b151561508d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f4f6e6c7920646174612f70726f63657373206f776e6572206f722064656c656781526020017f617465642070726f63657373736f722063616e20706c6163652074686973206f81526020017f726465720000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415615111578160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050615139565b8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600183600001601b9054906101000a900460ff160183600001601b6101000a81548160ff021916908360ff16021790555082600001601a9054906101000a900460ff1660ff1683600001601b9054906101000a900460ff1660ff1614156151c15760018360080160006101000a81548160ff021916908360028111156151bb57fe5b02179055505b60018260070160006101000a81548160ff021916908360028111156151e257fe5b0217905550601360008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206010805490509080600181540180825580915050906001820390600052602060002001600090919290919091505550601360008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206010805490509080600181540180825580915050906001820390600052602060002001600090919290919091505550600160106101806040519081016040528086600001601b9054906101000a900460ff1660ff1681526020018560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018981526020014263ffffffff1681526020016000815260200160206040519081016040528060008152508152602001600081526020016000600381111561543857fe5b8152509080600181540180825580915050906001820390600052602060002090600c02016000909192909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005015560e0820151816006015561010082015181600801556101208201518160090190805190602001906155e9929190617997565b5061014082015181600a015561016082015181600b0160006101000a81548160ff0219169083600381111561561a57fe5b0217905550505003935050505092915050565b60006060806060806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561569357600080fd5b600087101580156156a85750600f8054905087105b151561571c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f8781548110151561572b57fe5b906000526020600020906008020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600101826002018360030184600401838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156158055780601f106157da57610100808354040283529160200191615805565b820191906000526020600020905b8154815290600101906020018083116157e857829003601f168201915b50505050509350828054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156158a15780601f10615876576101008083540402835291602001916158a1565b820191906000526020600020905b81548152906001019060200180831161588457829003601f168201915b50505050509250818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561593d5780601f106159125761010080835404028352916020019161593d565b820191906000526020600020905b81548152906001019060200180831161592057829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156159d95780601f106159ae576101008083540402835291602001916159d9565b820191906000526020600020905b8154815290600101906020018083116159bc57829003601f168201915b50505050509050955095509550955095505091939590929450565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615a5257600080fd5b60008210158015615a675750600e8054905082105b1515615adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e82815481101515615aea57fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f6e6c792064617461206f776e65722063616e206d6f6469667920746869730081525060200191505060405180910390fd5b600e82815481101515615bcd57fe5b9060005260206000209060090201905060006002811115615bea57fe5b8160080160009054906101000a900460ff166002811115615c0757fe5b148015615c285750600081600001601b9054906101000a900460ff1660ff16145b1515615cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f4f6e6c7920617661696c61626c65207374617475732063616e2062652063616e81526020017f63656c656400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028160080160006101000a81548160ff02191690836002811115615ce357fe5b02179055505050565b6040805190810160405280600581526020017f464958454400000000000000000000000000000000000000000000000000000081525060039080519060200190615d37929190617917565b506040805190810160405280601a81526020017f4578616d706c6520466978656420537570706c7920546f6b656e00000000000081525060049080519060200190615d83929190617917565b506012600560006101000a81548160ff021916908360ff160217905550600560009054906101000a900460ff1660ff16600a0a620f424002600681905550600654600760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040518082815260200191505060405180910390a3565b6060600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515615f1157600080fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015615f9a57602002820191906000526020600020905b815481526020019060010190808311615f86575b5050505050905090565b6000615ff882600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178df90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061608d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546178fb90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000806000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156161a357600080fd5b600086101580156161b85750600e8054905086105b151561622c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b60108681548110151561623b57fe5b90600052602060002090600c020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660108781548110151561627c57fe5b90600052602060002090600c020160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166010888154811015156162bd57fe5b90600052602060002090600c0201600501546010898154811015156162de57fe5b90600052602060002090600c02016004015460108a8154811015156162ff57fe5b90600052602060002090600c0201600b0160009054906101000a900460ff16600381111561632957fe5b9450945094509450945091939590929450565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561639b57600080fd5b600085101580156163b05750600f8054905085105b1515616424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f8581548110151561643357fe5b906000526020600020906008020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561652d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f6f6e6c79207468652064656c6567617465642070726f636573736f722063616e81526020017f206d6f646966792074686973000000000000000000000000000000000000000081525060400191505060405180910390fd5b600f8581548110151561653c57fe5b906000526020600020906008020190508381600501600083600601548152602001908152602001600020600001908051906020019061657c929190617917565b50828160050160008360060154815260200190815260200160002060010190805190602001906165ad929190617917565b50806006016000815480929190600101919050555060018160060154039150509392505050565b600082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338530866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156167b1578082015181840152602081019050616796565b50505050905090810190601f1680156167de5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561680057600080fd5b505af1158015616814573d6000803e3d6000fd5b50505050600190509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606080606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156168ad57600080fd5b600086101580156168c25750600e8054905086105b1515616936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600e8681548110151561694557fe5b906000526020600020906009020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16945084600e8781548110151561698957fe5b9060005260206000209060090201600201600e888154811015156169a957fe5b9060005260206000209060090201600301600e898154811015156169c957fe5b9060005260206000209060090201600401600e8a8154811015156169e957fe5b9060005260206000209060090201600501838054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616a8f5780601f10616a6457610100808354040283529160200191616a8f565b820191906000526020600020905b815481529060010190602001808311616a7257829003601f168201915b50505050509350828054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616b2b5780601f10616b0057610100808354040283529160200191616b2b565b820191906000526020600020905b815481529060010190602001808311616b0e57829003601f168201915b50505050509250818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616bc75780601f10616b9c57610100808354040283529160200191616bc7565b820191906000526020600020905b815481529060010190602001808311616baa57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015616c635780601f10616c3857610100808354040283529160200191616c63565b820191906000526020600020905b815481529060010190602001808311616c4657829003601f168201915b505050505090509450945094509450945091939590929450565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515616d69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015616e2d57600080fd5b505af1158015616e41573d6000803e3d6000fd5b505050506040513d6020811015616e5757600080fd5b8101908080519060200190929190505050905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515616f5557600080fd5b60008210158015616f6a5750600f8054905082105b1515616fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b600f82815481101515616fed57fe5b9060005260206000209060080201600601549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561706457600080fd5b600f80549050905090565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156170ce57600080fd5b600083101580156170e3575060108054905083105b1515617157576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f696e76616c6964206f7264657220696e6465780000000000000000000000000081525060200191505060405180910390fd5b60108381548110151561716657fe5b90600052602060002090600c020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061722357508060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156172bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f6f6e6c792064617461206f776e6572206f7220646174612070726f636573736f81526020017f722063616e20617070726f76652074686973000000000000000000000000000081525060400191505060405180910390fd5b8060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515617385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f746865206f746865722070617274792073686f756c6420617070726f7665000081525060200191505060405180910390fd5b6000600381111561739257fe5b81600b0160009054906101000a900460ff1660038111156173af57fe5b141515617424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6f6e6c79206f70656e206f72646572732063616e20626520617070726f76656481525060200191505060405180910390fd5b600181600b0160006101000a81548160ff0219169083600381111561744557fe5b02179055506001915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561753e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f81526020017f6e2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156175e157600080fd5b600084101580156175f65750600e8054905084105b151561766a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e76616c6964207265717565737420696e646578000000000000000000000081525060200191505060405180910390fd5b6000831015801561769a5750600e8481548110151561768557fe5b90600052602060002090600902016007015483105b151561770e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e76616c6964206d657461646174614974656d20696e64657800000000000081525060200191505060405180910390fd5b600e8481548110151561771d57fe5b90600052602060002090600902016006016000848152602001908152602001600020600001600e8581548110151561775157fe5b90600052602060002090600902016006016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561780b5780601f106177e05761010080835404028352916020019161780b565b820191906000526020600020905b8154815290600101906020018083116177ee57829003601f168201915b50505050509150808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156178a75780601f1061787c576101008083540402835291602001916178a7565b820191906000526020600020905b81548152906001019060200180831161788a57829003601f168201915b50505050509050915091509250929050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111515156178f057600080fd5b818303905092915050565b6000818301905082811015151561791157600080fd5b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061795857805160ff1916838001178555617986565b82800160010185558215617986579182015b8281111561798557825182559160200191906001019061796a565b5b5090506179939190617a17565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106179d857805160ff1916838001178555617a06565b82800160010185558215617a06579182015b82811115617a055782518255916020019190600101906179ea565b5b509050617a139190617a17565b5090565b617a3991905b80821115617a35576000816000905550600101617a1d565b5090565b905600a165627a7a72305820c83b839f50fbb3be3d13b774e7febbe3c68cc931ddf606430b3e0bf9963fe4df0029

Opcodes

PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP CALLER PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x45746865726E69747920546F6B656E0000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xD2 SWAP3 SWAP2 SWAP1 PUSH3 0x255 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x45544E5900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x120 SWAP3 SWAP2 SWAP1 PUSH3 0x255 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH4 0x3B9ACA00 MUL PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH3 0x304 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 PUSH3 0x298 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x2C9 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x2C9 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x2C8 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x2AB JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x2D8 SWAP2 SWAP1 PUSH3 0x2DC JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x301 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x2FD JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x2E3 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7A68 DUP1 PUSH3 0x314 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x239 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH3 0x8A81A6 EQ PUSH2 0x23E JUMPI DUP1 PUSH3 0xD74970 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x438 JUMPI DUP1 PUSH4 0x14E9F384 EQ PUSH2 0x49D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x528 JUMPI DUP1 PUSH4 0x2118C02C EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x66F JUMPI DUP1 PUSH4 0x246439E6 EQ PUSH2 0x6F4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0x3701F582 EQ PUSH2 0x750 JUMPI DUP1 PUSH4 0x3EAAF86B EQ PUSH2 0x8EE JUMPI DUP1 PUSH4 0x438787D0 EQ PUSH2 0x919 JUMPI DUP1 PUSH4 0x44CC3C7F EQ PUSH2 0x95C JUMPI DUP1 PUSH4 0x4509B7E0 EQ PUSH2 0xA29 JUMPI DUP1 PUSH4 0x4C1782E5 EQ PUSH2 0xA8E JUMPI DUP1 PUSH4 0x4F74787B EQ PUSH2 0xAFA JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0xBBE JUMPI DUP1 PUSH4 0x5D87B6E6 EQ PUSH2 0xC15 JUMPI DUP1 PUSH4 0x676A96D8 EQ PUSH2 0xC56 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xC83 JUMPI DUP1 PUSH4 0x74ED9AE4 EQ PUSH2 0xCDA JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0xD31 JUMPI DUP1 PUSH4 0x7AED1214 EQ PUSH2 0xD48 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD73 JUMPI DUP1 PUSH4 0x92B93774 EQ PUSH2 0xDCA JUMPI DUP1 PUSH4 0x93132366 EQ PUSH2 0xF75 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xFE1 JUMPI DUP1 PUSH4 0x9818E66C EQ PUSH2 0x1071 JUMPI DUP1 PUSH4 0x98455999 EQ PUSH2 0x10BC JUMPI DUP1 PUSH4 0x9ECBEC41 EQ PUSH2 0x12D9 JUMPI DUP1 PUSH4 0xA1183D50 EQ PUSH2 0x1306 JUMPI DUP1 PUSH4 0xA8203ABB EQ PUSH2 0x131D JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1389 JUMPI DUP1 PUSH4 0xB3BB3DA3 EQ PUSH2 0x13EE JUMPI DUP1 PUSH4 0xB5D11DFA EQ PUSH2 0x14A3 JUMPI DUP1 PUSH4 0xCAE9CA51 EQ PUSH2 0x1570 JUMPI DUP1 PUSH4 0xD4EE1D90 EQ PUSH2 0x161B JUMPI DUP1 PUSH4 0xD9EDC139 EQ PUSH2 0x1672 JUMPI DUP1 PUSH4 0xDC39D06D EQ PUSH2 0x188F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x18F4 JUMPI DUP1 PUSH4 0xE2EEF9C3 EQ PUSH2 0x196B JUMPI DUP1 PUSH4 0xE780ADA1 EQ PUSH2 0x19AC JUMPI DUP1 PUSH4 0xEFA09D85 EQ PUSH2 0x19D7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1A1C JUMPI DUP1 PUSH4 0xF4DE5305 EQ PUSH2 0x1A5F JUMPI DUP1 PUSH4 0xFC9C8D39 EQ PUSH2 0x1B7B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1BD2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2A9 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x28E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2D6 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x30F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1F0B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BD PUSH2 0x21AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3FD JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3E2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x42A 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x444 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x483 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x224A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x50E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x233C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x53D PUSH2 0x25F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x588 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x263E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 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 0x5CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x5F9 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 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 0x632 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x617 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x65F 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 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2975 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x700 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x709 PUSH2 0x2C20 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x734 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x75C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH2 0xFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2C9C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x903 PUSH2 0x3288 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x925 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x328E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x968 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA13 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x33BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA74 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x362E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAA3 PUSH2 0x390F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xAE6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xACB JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB25 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3A00 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD3 PUSH2 0x3CA1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC40 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3CC7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC81 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3DD6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCC4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x40D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCEF PUSH2 0x411D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD46 PUSH2 0x4143 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD5D PUSH2 0x42E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD88 PUSH2 0x434B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH2 0xFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x4370 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF8A PUSH2 0x4A55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xFCD JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xFB2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF6 PUSH2 0x4B46 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1036 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x101B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1063 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 SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x107D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x4BE4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10E7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x562D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP10 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 0x1165 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x114A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1192 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 DUP6 DUP2 SUB DUP5 MSTORE DUP9 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 0x11CB JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x11B0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11F8 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 DUP6 DUP2 SUB DUP4 MSTORE DUP8 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 0x1231 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1216 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x125E 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 DUP6 DUP2 SUB DUP3 MSTORE DUP7 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 0x1297 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x127C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12C4 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 SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1304 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x59F4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x131B PUSH2 0x5CEC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1332 PUSH2 0x5EB3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1375 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x135A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13D4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5FA4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1419 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x613F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x633C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1601 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x65D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1627 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1630 PUSH2 0x6823 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x167E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x169D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6849 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP10 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 0x171B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1700 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1748 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 DUP6 DUP2 SUB DUP5 MSTORE DUP9 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 0x1781 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1766 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17AE 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 DUP6 DUP2 SUB DUP4 MSTORE DUP8 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 0x17E7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x17CC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1814 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 DUP6 DUP2 SUB DUP3 MSTORE DUP7 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 0x184D JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1832 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x187A 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 SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x189B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18DA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6C7D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1955 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6E70 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1977 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1996 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6EF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C1 PUSH2 0x7006 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A02 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x706F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A5D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7454 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A94 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x7582 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 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 0x1AD8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1ABD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B05 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 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 0x1B3E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B23 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B6B 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 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B90 PUSH2 0x78B9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1C32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x1C47 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x1CBB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CCA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1DA1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F776E65722063616E20726561642074686520726573756C747300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1DAE JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1DCB JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x1E66 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C7920636C6F736564206F72646572732068617665207468652072657375 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6C74000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x9 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1EFE JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1ED3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EFE 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 0x1EE1 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1F73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP10 LT ISZERO DUP1 ISZERO PUSH2 0x1F88 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP10 LT JUMPDEST ISZERO ISZERO PUSH2 0x1FFC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E76616C696420696E6465782070726F76696465642E000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x200B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP8 POP PUSH1 0xF DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x204E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2078 JUMPI INVALID JUMPDEST SWAP1 POP DUP8 PUSH1 0xF DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x208A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP12 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20B8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP13 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20E6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP14 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2114 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x17 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xF DUP15 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2142 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH2 0xFFFF AND PUSH1 0xF DUP16 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2171 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x1A SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP8 SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2242 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2217 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2242 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 0x2225 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x8 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x239B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x23B0 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x2424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2433 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x2 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x250A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792070726F636573736F722063616E20616464206120726573756C7400 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2517 JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2534 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x25A9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 DUP2 PUSH1 0x9 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x25C1 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x2 DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x25E3 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x7 PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x6 SLOAD SUB SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x269D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x26B2 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x2726 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x2756 JUMPI POP PUSH1 0xF DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2741 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x6 ADD SLOAD DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x27CA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206D657461646174614974656D20696E646578000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x27D9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x5 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x280D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x5 ADD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x28C7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x289C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x28C7 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 0x28AA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2963 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2938 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2963 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 0x2946 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29C9 DUP3 PUSH1 0x7 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x2A9B DUP3 PUSH1 0x8 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x8 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x2B6D DUP3 PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78FB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2C7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP12 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2D13 JUMPI POP PUSH1 0xFF DUP1 AND DUP12 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2D87 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6370755265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP11 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2DA0 JUMPI POP PUSH1 0xFF DUP1 AND DUP11 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2E14 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6D656D5265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP9 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2E2D JUMPI POP PUSH1 0xFF DUP1 AND DUP9 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2EA1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x62616E6477696474685265717565737420697320696E76616C69640000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP10 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x2EBA JUMPI POP PUSH1 0xFF DUP1 AND DUP10 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x2F2E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73746F726167655265717565737420697320696E76616C696400000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x12 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xF DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0xF PUSH2 0x1E0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP13 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3042 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x16 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x17 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH2 0xFFFF MUL NOT AND SWAP1 DUP4 PUSH2 0xFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1A PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1F PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x31E5 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3203 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3221 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x323F SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x1C0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3270 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP1 POP SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3378 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x341B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x3430 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x34A4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x34B3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3587 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E65722063616E206D6F64696679207468697300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3596 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP1 POP DUP4 DUP2 PUSH1 0x6 ADD PUSH1 0x0 DUP4 PUSH1 0x7 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x35D6 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP3 DUP2 PUSH1 0x6 ADD PUSH1 0x0 DUP4 PUSH1 0x7 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3607 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP1 PUSH1 0x7 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x1 DUP2 PUSH1 0x7 ADD SLOAD SUB SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x368D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x36A2 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x3716 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3725 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3822 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C7920646174612070726F636573736F722063616E206164642061207072 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6F636573736F7200000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x382F JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x384C JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x38C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 DUP2 PUSH1 0x2 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x396D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x12 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x39F6 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 0x39E2 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3A68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP10 LT ISZERO DUP1 ISZERO PUSH2 0x3A7D JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP10 LT JUMPDEST ISZERO ISZERO PUSH2 0x3AF1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B00 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP8 POP PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B43 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3B6D JUMPI INVALID JUMPDEST SWAP1 POP DUP8 PUSH1 0xE DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3B7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP12 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BAD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x15 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP13 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3BDB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP14 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C09 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x17 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xE DUP15 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C37 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH2 0xFFFF AND PUSH1 0xE DUP16 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C66 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP8 SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 POP SWAP2 SWAP4 SWAP6 SWAP8 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3D25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x3D3A JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x3DAE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3DBD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x7 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3E34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x3E49 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x3EBD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3ECC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3FC6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064656C6567617465642070726F636573736F722063616E206D6F64 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6966792074686973000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3FD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x3FF2 JUMPI INVALID JUMPDEST DUP2 PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x400F JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x40AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E2062652063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x63656C6564000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x40CB JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x7 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x419F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x43CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP8 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x43E8 JUMPI POP PUSH1 0xA PUSH1 0xFF AND DUP8 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x445C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E7374616E636520697320696E76616C696400000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP13 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x4475 JUMPI POP PUSH1 0xFF DUP1 AND DUP13 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x44E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6370755265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP12 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x4502 JUMPI POP PUSH1 0xFF DUP1 AND DUP12 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4576 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6D656D5265717565737420697320696E76616C69640000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP10 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x458F JUMPI POP PUSH1 0xFF DUP1 AND DUP10 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4603 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x62616E6477696474685265717565737420697320696E76616C69640000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP11 PUSH1 0xFF AND GT DUP1 ISZERO PUSH2 0x461C JUMPI POP PUSH1 0xFF DUP1 AND DUP11 PUSH1 0xFF AND GT ISZERO JUMPDEST ISZERO ISZERO PUSH2 0x4690 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x73746F726167655265717565737420697320696E76616C696400000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x11 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xE DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0xE PUSH2 0x220 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP16 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP13 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP12 DUP12 MUL PUSH1 0xFF AND MUL PUSH2 0xFFFF AND PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x47C4 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x15 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x16 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x17 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH2 0xFFFF MUL NOT AND SWAP1 DUP4 PUSH2 0xFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1A PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1C PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH4 0xFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH4 0xFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49B1 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49CF SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x49ED SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1C0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x4A0B SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x1E0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE PUSH2 0x200 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4A3C JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP1 POP SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4AB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x11 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x4B3C 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 0x4B28 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x4BDC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4BB1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4BDC 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 0x4BBF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x4C46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x4C5B JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x4CCF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C696420646F207265717565737420696E6465780000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x4CE4 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x4D58 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206470207265717565737420696E6465780000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D67 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP3 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4D84 JUMPI INVALID JUMPDEST DUP4 PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4DA1 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x4E3C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E20626520726571 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7565737465640000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4E4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP2 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4E68 JUMPI INVALID JUMPDEST DUP3 PUSH1 0x7 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x4E85 JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x4F20 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E20626520726571 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7565737465640000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x4FCD JUMPI POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x508D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x44 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920646174612F70726F63657373206F776E6572206F722064656C6567 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x617465642070726F63657373736F722063616E20706C6163652074686973206F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7264657200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x60 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x5111 JUMPI DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x5139 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ADD DUP4 PUSH1 0x0 ADD PUSH1 0x1B PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x0 ADD PUSH1 0x1A SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND DUP4 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND EQ ISZERO PUSH2 0x51C1 JUMPI PUSH1 0x1 DUP4 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x51BB JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x7 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x51E2 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x13 PUSH1 0x0 DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x13 PUSH1 0x0 DUP5 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x10 DUP1 SLOAD SWAP1 POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0x10 PUSH2 0x180 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x5438 JUMPI INVALID JUMPDEST DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD SSTORE PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x9 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x55E9 SWAP3 SWAP2 SWAP1 PUSH2 0x7997 JUMP JUMPDEST POP PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0xA ADD SSTORE PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x561A JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP SUB SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5693 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP8 LT ISZERO DUP1 ISZERO PUSH2 0x56A8 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP8 LT JUMPDEST ISZERO ISZERO PUSH2 0x571C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x572B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 ADD DUP3 PUSH1 0x2 ADD DUP4 PUSH1 0x3 ADD DUP5 PUSH1 0x4 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x5805 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x57DA JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5805 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 0x57E8 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP4 POP DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x58A1 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x5876 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x58A1 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 0x5884 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP3 POP DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x593D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x5912 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x593D 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 0x5920 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x59D9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x59AE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59D9 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 0x59BC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5A52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x5A67 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x5ADB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5AEA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5BBE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E65722063616E206D6F64696679207468697300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5BCD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5BEA JUMPI INVALID JUMPDEST DUP2 PUSH1 0x8 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5C07 JUMPI INVALID JUMPDEST EQ DUP1 ISZERO PUSH2 0x5C28 JUMPI POP PUSH1 0x0 DUP2 PUSH1 0x0 ADD PUSH1 0x1B SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x5CC2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920617661696C61626C65207374617475732063616E2062652063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x63656C6564000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP2 PUSH1 0x8 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5CE3 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4649584544000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5D37 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4578616D706C6520466978656420537570706C7920546F6B656E000000000000 DUP2 MSTORE POP PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x5D83 SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH3 0xF4240 MUL PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x5F11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x13 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x5F9A 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 0x5F86 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5FF8 DUP3 PUSH1 0x7 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78DF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x608D DUP3 PUSH1 0x7 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x78FB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x7 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x61A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x61B8 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x622C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x623B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x10 DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x627C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x10 DUP9 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62BD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x5 ADD SLOAD PUSH1 0x10 DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62DE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0x4 ADD SLOAD PUSH1 0x10 DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62FF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x6329 JUMPI INVALID JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x639B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 LT ISZERO DUP1 ISZERO PUSH2 0x63B0 JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP6 LT JUMPDEST ISZERO ISZERO PUSH2 0x6424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6433 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x652D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79207468652064656C6567617465642070726F636573736F722063616E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x206D6F6469667920746869730000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x653C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD SWAP1 POP DUP4 DUP2 PUSH1 0x5 ADD PUSH1 0x0 DUP4 PUSH1 0x6 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x657C SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP3 DUP2 PUSH1 0x5 ADD PUSH1 0x0 DUP4 PUSH1 0x6 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x65AD SWAP3 SWAP2 SWAP1 PUSH2 0x7917 JUMP JUMPDEST POP DUP1 PUSH1 0x6 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x1 DUP2 PUSH1 0x6 ADD SLOAD SUB SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x8 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x8F4FFCB1 CALLER DUP6 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND 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 0x67B1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6796 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x67DE 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 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6800 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6814 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x68AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 LT ISZERO DUP1 ISZERO PUSH2 0x68C2 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP7 LT JUMPDEST ISZERO ISZERO PUSH2 0x6936 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP7 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6945 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 POP DUP5 PUSH1 0xE DUP8 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6989 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x2 ADD PUSH1 0xE DUP9 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69A9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x3 ADD PUSH1 0xE DUP10 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69C9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x4 ADD PUSH1 0xE DUP11 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x69E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6A8F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6A64 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6A8F 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 0x6A72 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP4 POP DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6B2B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B00 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B2B 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 0x6B0E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP3 POP DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6BC7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B9C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6BC7 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 0x6BAA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6C63 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6C38 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6C63 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 0x6C46 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP2 SWAP4 SWAP6 SWAP1 SWAP3 SWAP5 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x6D69 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND 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 0x6E2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6E41 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 0x6E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x8 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x6F55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 LT ISZERO DUP1 ISZERO PUSH2 0x6F6A JUMPI POP PUSH1 0xF DUP1 SLOAD SWAP1 POP DUP3 LT JUMPDEST ISZERO ISZERO PUSH2 0x6FDE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xF DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6FED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x8 MUL ADD PUSH1 0x6 ADD SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x7064 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xF DUP1 SLOAD SWAP1 POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x70CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x70E3 JUMPI POP PUSH1 0x10 DUP1 SLOAD SWAP1 POP DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x7157 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206F7264657220696E64657800000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x10 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7166 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xC MUL ADD SWAP1 POP DUP1 PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x7223 JUMPI POP DUP1 PUSH1 0x0 ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x72BD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C792064617461206F776E6572206F7220646174612070726F636573736F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x722063616E20617070726F766520746869730000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x7385 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x746865206F746865722070617274792073686F756C6420617070726F76650000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x7392 JUMPI INVALID JUMPDEST DUP2 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x73AF JUMPI INVALID JUMPDEST EQ ISZERO ISZERO PUSH2 0x7424 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x6F6E6C79206F70656E206F72646572732063616E20626520617070726F766564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x7445 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0x1 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x753E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C79206F776E65722063616E2063616C6C20746869732066756E6374696F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6E2E000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x75E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x75F6 JUMPI POP PUSH1 0xE DUP1 SLOAD SWAP1 POP DUP5 LT JUMPDEST ISZERO ISZERO PUSH2 0x766A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964207265717565737420696E6465780000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 LT ISZERO DUP1 ISZERO PUSH2 0x769A JUMPI POP PUSH1 0xE DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7685 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x7 ADD SLOAD DUP4 LT JUMPDEST ISZERO ISZERO PUSH2 0x770E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C6964206D657461646174614974656D20696E646578000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xE DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x771D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x6 ADD PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0xE DUP6 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7751 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x9 MUL ADD PUSH1 0x6 ADD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x780B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x77E0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x780B 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 0x77EE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP DUP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x78A7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x787C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x78A7 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 0x788A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x78F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 ADD SWAP1 POP DUP3 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x7911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP 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 0x7958 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x7986 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x7986 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x7985 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x796A JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x7993 SWAP2 SWAP1 PUSH2 0x7A17 JUMP JUMPDEST POP 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 0x79D8 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x7A06 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x7A06 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x7A05 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x79EA JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x7A13 SWAP2 SWAP1 PUSH2 0x7A17 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x7A39 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x7A35 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x7A1D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc8 EXTCODESIZE DUP4 SWAP16 POP CREATE2 0xb3 0xbe RETURNDATASIZE SGT 0xb7 PUSH21 0xE7FEBBE3C68CC931DDF606430B3E0BF9963FE4DF00 0x29 
```

{% endtab %}

{% tab title="Source Code" %}

```
pragma solidity ^0.4.0;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


import "./EthernityStorage.sol";
import "./Models.sol";

contract EthernityImplementationV1 is EthernityStorage {

    /**
    @notice Adds new Data Processor Request
    @param _cpuRequest The number of cpu cores
    @param _memRequest The amount of ram in GB
    @param _storageRequest The amount of storage in GB
    @param _bandwidthRequest The bandwidth amount
    @param _duration The amount of time the resource can be offered
    @param _minPrice The minimum price accepted for processing request
    @param _metadata1 Metadata to store in request
    @param _metadata2 Metadata to store in request
    @param _metadata3 Metadata to store in request
    @param _metadata4 Metadata to store in request

    @return {
          "_rowNumber": "Data processor request id"
    }
*/
    function _addDPRequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _minPrice,
        string _metadata1,
        string _metadata2,
        string _metadata3,
        string _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {

        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpuRequest is invalid");
        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "memRequest is invalid");
        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bandwidthRequest is invalid");
        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "storageRequest is invalid");


        usersDPRequests[msg.sender].push(dpRequestsList.length);
        return dpRequestsList.push(Models.DPRequest({
            dproc : msg.sender,
            cpuRequest : _cpuRequest,
            memoryRequest : _memRequest,
            storageRequest : _storageRequest,
            bandwidthRequest : _bandwidthRequest,
            duration : _duration,
            minPrice : _minPrice,
            createdAt : uint32(now),
            price : 0,
            metadataSize : 0,
            status : Models.RequestStatus.AVAILABLE,
            Metadata1 : _metadata1,
            Metadata2 : _metadata2,
            Metadata3 : _metadata3,
            Metadata4 : _metadata4
            })) - 1;
    }

    /**
        @notice Gets total count of Data Processor Requests
        @return { "_length": "The counter of dp requests" }
    */
    function _getDPRequestsCount() public constant onlyDelegate returns (uint256 _length) {

        return dpRequestsList.length;
    }

    /**
        @notice Gets details of a specific data processor request
        @param _requestListItem the request id
        @return {
              "dproc": "Data processor address",
              "cpuRequest": "The number of cpu cores[maximum 255]",
              "memoryRequest": "The amount of ram in GB[maximum 255]",
              "storageRequest": "The amount of storage in GB[maximum 255]",
              "bandwidthRequest": "The bandwidth amount[maximum 255]",
              "duration": "The amount of time the resource can be offered",
              "minPrice": "The minimum price accepted for processing request",
              "status": "The request status [values in Available/Booked/Canceled"
        }
    */
    function _getDPRequest(uint256 _requestListItem) public constant onlyDelegate returns (
        address dproc,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 minPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "Invalid index provided."
        );
        dproc = dpRequestsList[_requestListItem].dproc;
        status = uint(dpRequestsList[_requestListItem].status);

        return (
        dproc,
        dpRequestsList[_requestListItem].cpuRequest,
        dpRequestsList[_requestListItem].memoryRequest,
        dpRequestsList[_requestListItem].storageRequest,
        dpRequestsList[_requestListItem].bandwidthRequest,
        dpRequestsList[_requestListItem].duration,
        dpRequestsList[_requestListItem].minPrice,
        status
        );
    }

    /**
    @notice Gets  metadata of a data processor request
    @param _requestListItem the request id
    @return {
          "dpproc": "Data processor address",
          "metadata1": "Metadata field",
          "metadata2": "Metadata field",
          "metadata3": "Metadata field",
          "metadata4": "Metadata field",
    }
*/
    function _getDPRequestMetadata(uint256 _requestListItem) public constant onlyDelegate returns (
        address dproc,
        string metadata1,
        string metadata2,
        string metadata3,
        string metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];

        return (
        request.dproc,
        request.Metadata1,
        request.Metadata2,
        request.Metadata3,
        request.Metadata4
        );
    }


    /**
        @notice Cancels a data processor request
        @param _requestListItem the request id
        */
    function _cancelDPRequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");
        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "only delegated processor can modify this");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be canceled");

        request.status = Models.RequestStatus.CANCELED;
    }

    /**
    @notice Gets all data processor request id list
    @return {
          "req": "An array containing all data processor requests"
    }
    */
    function _getMyDPRequests() public constant onlyDelegate returns (uint256[] req){

        return usersDPRequests[msg.sender];
    }

    /**
    ** metadata storage part
    */
    /**
        @notice Adds an extra metadata to the data processor requests as key-value pair
        @param _requestListItem the request id
        @param _key Extra metadata key
        @param _value Extra metadata value
        @return {
                "_rowNumber": "Extra metadata id from dp order"
        }
        */
    function _addMetadataToDPRequest(uint256 _requestListItem, string _key, string _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "only the delegated processor can modify this");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    /**
    @notice Gets the total metadata for data processor request
    @param _requestListItem the request id
    @return {
          "_length": "The total extra metadata for the data processor request"
    }
    */
    function _getMetadataCountForDPRequest(uint256 _requestListItem) public constant onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");

        return dpRequestsList[_requestListItem].metadataSize;
    }

    /**
    @notice Gets metadata info for a data processor request with metadata id
    @param _requestListItem the request id
    @param _metadataItem the metadata item id
    @return {
          "key": "Metadata key",
          "value": "Metadata value"
    }
    */
    function _getMetadataValueForDPRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public constant returns (
        string key,
        string value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "invalid request index");
        require(
            _metadataItem >= 0 && _metadataItem < dpRequestsList[_requestListItem].metadataSize,
            "invalid metadataItem index");

        return (
        dpRequestsList[_requestListItem].metadata[_metadataItem].key,
        dpRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }

    /**
    * region data owner requests
    */

    /**
        @notice Adds new Data Owner Request
        @param _cpuRequest The number of cpu cores
        @param _memRequest The amount of ram in GB
        @param _storageRequest The amount of storage in GB
        @param _bandwidthRequest The bandwidth amount
        @param _duration The amount of time the resource can be offered
        @param _instances How many instances should be run
        @param _maxPrice The maximum price accepted for processing request
        @param _metadata1 Metadata to store in request
        @param _metadata2 Metadata to store in request
        @param _metadata3 Metadata to store in request
        @param _metadata4 Metadata to store in request

        @return {
              "_rowNumber": "Data owner request id"
        }
        */
    function _addDORequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _instances,
        uint8 _maxPrice,
        string _metadata1,
        string _metadata2,
        string _metadata3,
        string _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {

        require(
            _instances > 0 && _instances <= MAX_INSTANCES,
            "instance is invalid");

        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpuRequest is invalid");

        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "memRequest is invalid");

        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bandwidthRequest is invalid");

        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "storageRequest is invalid");

        usersDORequests[msg.sender].push(doRequestsList.length);
        return doRequestsList.push(Models.DORequest({
            downer : msg.sender,
            cpuRequest : _cpuRequest,
            memoryRequest : _memRequest,
            storageRequest : _storageRequest,
            bandwidthRequest : _bandwidthRequest,
            duration : _duration,
            instances : _instances,
            bookedInstances : 0,
            createdAt : uint32(now),
            maxPrice : _maxPrice,
            tokens : _maxPrice * _instances * _duration,
            metadataSize : 0,
            status : Models.RequestStatus.AVAILABLE,
            Metadata1 : _metadata1,
            Metadata2 : _metadata2,
            Metadata3 : _metadata3,
            Metadata4 : _metadata4
            })) - 1;

    }

    /**
        @notice Gets total count of Data Owner Requests
        @return { "_length": "The counter of do requests" }
        */
    function _getDORequestsCount() public constant onlyDelegate returns (uint256 _length) {

        return doRequestsList.length;
    }

    /**
        @notice Gets details of a specific data owner request
        @param _requestListItem the request id
        @return {
              "downer": "Data owner address",
              "cpuRequest": "The number of cpu cores[maximum 255]",
              "memoryRequest": "The amount of ram in GB[maximum 255]",
              "storageRequest": "The amount of storage in GB[maximum 255]",
              "bandwidthRequest": "The bandwidth amount[maximum 255]",
              "duration": "The amount of time the resource can be offered",
              "maxPrice": "The maximum price accepted for processing request",
              "status": "The request status [values in Available/Booked/Canceled"
        }
    */
    function _getDORequest(uint256 _requestListItem) public constant onlyDelegate returns (
        address downer,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 maxPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        downer = doRequestsList[_requestListItem].downer;
        status = uint(doRequestsList[_requestListItem].status);
        return (
        downer,
        doRequestsList[_requestListItem].cpuRequest,
        doRequestsList[_requestListItem].memoryRequest,
        doRequestsList[_requestListItem].storageRequest,
        doRequestsList[_requestListItem].bandwidthRequest,
        doRequestsList[_requestListItem].duration,
        doRequestsList[_requestListItem].maxPrice,
        status
        );
    }

    /**
        @notice Gets  metadata of a data owner request
        @param _requestListItem the request id
        @return {
              "metadata1": "Metadata field",
              "metadata2": "Metadata field",
              "metadata3": "Metadata field",
              "metadata4": "Metadata field",
        }
        */
    function _getDORequestMetadata(uint256 _requestListItem) public constant onlyDelegate returns (
        address downer,
        string metadata1,
        string metadata2,
        string metadata3,
        string metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        downer = doRequestsList[_requestListItem].downer;
        return (
        downer,
        doRequestsList[_requestListItem].Metadata1,
        doRequestsList[_requestListItem].Metadata2,
        doRequestsList[_requestListItem].Metadata3,
        doRequestsList[_requestListItem].Metadata4
        );
    }

    /**
        @notice Cancels a data owner request
        @param _requestListItem the request id
        */
    function _cancelDORequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");
        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "only data owner can modify this");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE && request.bookedInstances == 0,
            "Only available status can be canceled");

        request.status = Models.RequestStatus.CANCELED;
    }

    /**
        @notice Gets all data owner request id list
        @return {
              "req": "An array containing all data owner requests"
        }
        */
    function _getMyDORequests() public constant onlyDelegate returns (uint256[] req){

        return usersDORequests[msg.sender];
    }

    /**
        @notice Adds an extra metadata to the data owner request as key-value pair
        @param _requestListItem the request id
        @param _key Extra metadata key
        @param _value Extra metadata value
        @return {
              "_rowNumber": "The metadata item id of the data owner request"
        }
        */
    function _addMetadataToRequest(uint256 _requestListItem, string _key, string _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "only data owner can modify this");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    /**
        @notice Gets extra metadata count for order
        @param _requestListItem the request id
        @return {
            "_length": "The extra metadata count"
        }
        */
    function _getMetadataCountForRequest(uint256 _requestListItem) public constant onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");

        return doRequestsList[_requestListItem].metadataSize;
    }

    /**
        @notice Gets metadata info for a data owner request with metadata id
        @param _requestListItem the request id
        @param _metadataItem the metadata item id
        @return {
              "key": "Metadata key",
              "value": "Metadata value"
        }
        */
    function _getMetadataValueForRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public constant returns (
        string key,
        string value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "invalid request index");
        require(
            _metadataItem >= 0 && _metadataItem < doRequestsList[_requestListItem].metadataSize,
            "invalid metadataItem index");

        return (
        doRequestsList[_requestListItem].metadata[_metadataItem].key,
        doRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }


    /**
    * order region
    */

    /**
        @notice Places new order - this can placed by dp/do
        @param _doRequestItem the data owner request id
        @param _dpRequestItem the data processor request id
        @return {
              "_orderNumber": "Order number"
        }
        */
    function _placeOrder(uint256 _doRequestItem, uint256 _dpRequestItem) public onlyDelegate returns (uint _orderNumber){
        require(
            _doRequestItem >= 0 && _doRequestItem < doRequestsList.length,
            "invalid do request index");

        require(
            _dpRequestItem >= 0 && _dpRequestItem < dpRequestsList.length,
            "invalid dp request index");

        Models.DORequest storage doRequest = doRequestsList[_doRequestItem];
        require(
            doRequest.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be requested");
        Models.DPRequest storage dpRequest = dpRequestsList[_dpRequestItem];
        require(
            dpRequest.status == Models.RequestStatus.AVAILABLE,
            "Only available status can be requested");

        require(
            dpRequest.dproc == msg.sender || doRequest.downer == msg.sender,
            "Only data/process owner or delegated processsor can place this order");

        address placedBy;
        if (dpRequest.dproc == msg.sender)
            placedBy = dpRequest.dproc;
        else
            placedBy = doRequest.downer;

        doRequest.bookedInstances = doRequest.bookedInstances + 1;
        if (doRequest.bookedInstances == doRequest.instances)
            doRequest.status = Models.RequestStatus.BOOKED;

        dpRequest.status = Models.RequestStatus.BOOKED;

        usersOrders[dpRequest.dproc].push(orders.length);
        usersOrders[doRequest.downer].push(orders.length);

        return orders.push(Models.Order({
            instance : doRequest.bookedInstances,
            dproc : dpRequest.dproc,
            downer : doRequest.downer,
            placedBy : placedBy,
            processor : address(0),
            dpRequest : _dpRequestItem,
            doRequest : _doRequestItem,
            timeout : uint32(now),
            metadataSize : 0,
            status : Models.OrderStatus.OPEN,
            price : 0,
            result : ''
            })) - 1;

    }

    /**
        @notice Gets order count
        @return {
              "_length": "Order count"
        }
        */
    function _getOrdersCount() public constant onlyDelegate returns (uint256 _length) {

        return orders.length;
    }

    /**
        @notice Gets the list of orders
        @return {
              "req": "Orders list"
        }
        */
    function _getMyDOOrders() public constant onlyDelegate returns (uint256[] req){

        return usersOrders[msg.sender];
    }


    /**
        @notice Gets order info
        @param _orderItem the order id
        @return {
              "downer": "Data owner address",
              "dproc": "Data processor address",
              "doRequest": "Data owner request id",
              "dpRequest": "Data processor request id",
              "status": "Order status"
        }
        */
    function _getOrder(uint256 _orderItem) public onlyDelegate constant returns (
        address downer,
        address dproc,
        uint doRequest,
        uint dpRequest,
        uint status)
    {
        require(
            _orderItem >= 0 && _orderItem < doRequestsList.length,
            "invalid request index");

        return (
        orders[_orderItem].downer,
        orders[_orderItem].dproc,
        orders[_orderItem].doRequest,
        orders[_orderItem].dpRequest,
        uint(orders[_orderItem].status)
        );
    }


    /**
    * orders can be processed only after being approved
    * by other part(do/dp)
    */
    /**
        @notice Approves order - orders can be processed only after being approved by other part(do/dp)
        @param _orderItem the order id
        @return {
              "success": "Status of operation"
        }
        */
    function _approveOrder(uint256 _orderItem) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.downer || msg.sender == order.dproc,
            "only data owner or data processor can approve this");

        require(
            msg.sender != order.placedBy,
            "the other party should approve");

        require(
            order.status == Models.OrderStatus.OPEN,
            "only open orders can be approved"
        );

        order.status = Models.OrderStatus.PROCESSING;
        return true;
    }

    /**
    * add processor address by data processor
    */
    /**
        @notice Adds a processor to order
        @param _orderItem Order number
        @param processor Processor address
        @return {
              "success": "Status of operation"
        }
        */
    function _addProcessorToOrder(uint256 _orderItem, address processor) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.dproc,
            "only data processor can add a processor");

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "only open orders can be approved"
        );

        order.processor = processor;
        return true;
    }

    /**
    * add result to order
    */
    /**
        @notice Adds result to order
        @param _orderItem Order number
        @param _result processor output after processing
        @return {
              "success": "Status of operation"
        }
        */
    function _addResultToOrder(uint256 _orderItem, string _result) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.processor,
            "only processor can add a result");

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "only open orders can be approved"
        );


        order.result = _result;
        order.status = Models.OrderStatus.CLOSED;
        return true;
    }

    /**
    * get result from order
    */
    /**
        @notice Gets result from order
        @param _orderItem Order number
        @return {
              "_Result": "Order Result"
        }
        */
    function _getResultFromOrder(uint256 _orderItem) public constant onlyDelegate returns (string _Result){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "invalid order index");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.downer,
            "only owner can read the results");

        require(
            order.status == Models.OrderStatus.CLOSED,
            "only closed orders have the result"
        );

        return order.result;
    }
}
```

{% endtab %}
{% endtabs %}


# MetaMask

Metamask

Metamask will be used to generate a wallet on the Bloxberg blockchain where funds can be stored. In this example we'll install the Metamask add for the Firefox browser but the same steps can be used for Chrome, Opera or even the Android or IOS apps. Please click [here ](/wallet/installation)to continue.


# Installation

We are describing here a step by step process to install MetaMask

### Firefox

Open the browser of your choice (we'll be using Firefox in this example) and go to <https://metamask.io/>

![Please click on the Download button](/files/-MZ-3MpCav3qrVLhfO3i)

### Install MetaMask for your browser

![Click on "Install MetaMas for your browser"](/files/-MZ-5APUiVWSaSivaDXJ)

### Firefox Addon

After clicking on "Install MetaMask for Firefox"  you'll be redirected to the Addons page for Firefox where you'll have to click on "+ Add to Firefox" button

![Click on "+ Add to Firefox"](/files/-MZ-5tGcjPM-WIIM8eRz)

### Confirm installation

Please click on Add as shown below

![Click on "Add"](/files/-MZ-6UQPsqoKVQtfU5gD)

### Done!

![Click on "Get Started" to start using MetaMask](/files/-MZ-6prutx8VyUZubJvI)


# New Wallet

This section describes the steps to create a New Ethereum wallet

### Yes, let's get set up!

![Click on "Create a Wallet"](/files/-MZFTFnwdcl2tqCcmW2N)

### Improve MetaMask

![Feel free to select either options](/files/-MZFTPnq5bU4ojDN3Xsz)

### Create a Password

This Password will be used to protect your Wallet. It will be required to send funds and to open the wallet.

![Type your Password, Agree to the "Terms of Use" and click "Create"](/files/-MZFTq-IcGasJdCDmKsr)

### Secret Backup Phrase

**SAVE THESE 12 WORDS AND DO NOT LOSE THEM !!!** These words are used to restore the wallet on a different device or different browser.

![Secret Backup Phrase](/files/-MZIYJV60h1Fo4lbt7TL)

### Confirm the Secret Backup Phrase

Please confirm your Secret Backup Phrase. Make sure you type the words in the order from left to right, top to bottom.

![Confirm the Secret Phrase and click "Confirm"](/files/-MZIaPxnWy423_eGKfaA)

### Done!

![Click on "All Done"](/files/-MZFVc1J-pZZpIL5kp_L)

### ETNY on Bloxberg

Please click [here ](/ethernity-node/configuring-the-node/select-the-network/mainnet-on-bloxberg/connect-to-the-bloxberg-blockchain)to continue to add ETNY token to your wallet.


# Restore Wallet

If you're trying to restore an existing wallet please follow the steps below

### Import Wallet

![Click on the "Import wallet" button](/files/-MZ-CfOtU3T9mfbVoN7O)

### Help Us Improve MetaMask

![Please select any of the options](/files/-MZ-Cr-FeHptKEGZbH5X)

### Seed phrase

Please type the 12 word seed phrase and a password which will protect your wallet's funds

![After filling in the seed phrase and password please click on the "Import" button](/files/-MZ-IxnC6iw79cjqLR3j)

### Successful import!

![Click on the "All Done" button](/files/-MZ-J7Jwa3cNA7L08yEq)

### Connect to the Bloxberg blockchain

The next step is to connect the wallet to the Bloxberg blockchain. Please click [here](/ethernity-node/configuring-the-node/select-the-network/mainnet-on-bloxberg/connect-to-the-bloxberg-blockchain)


# Wallet Validation

Step-by-step guide to validate your wallet

## Open Website

![Open https://ethernity.cloud/token.html and click on the "Login "option](/files/ViCNiiXnoke2bmKQCfyV)

## Login

![Login using your username and password](/files/dmoqkjljOJNqn9QqM7Ed)

## Authentication Code

![Paste your Authentication Code received via email](/files/uFYJbnSf6M6WiUC3NlIq)

## My Profile

![Click on the icon and then select the Round you'd like to confirm your wallet for](/files/H31SipnLsmoXe2Kmh5tg)

Login to MetaMask

![Click the "paste" button to connect your MetaMask wallet](/files/Dam4lGiq54g8msT3UAg6)

## Select Wallet

![Select which wallet you would like to use to receive your ETNY tokens and click Next](/files/MMJOvBhe1PLlVyeg43tT)

## Confirm Metamask connection

![Accept that MetaMask would like to view your wallet and click Connect](/files/LEpxEdl3Siq99bXCRn5w)

## Confirm Wallet

![After you visually confirm the wallet address please click on "Confirm Wallet"](/files/WryrpZRcrkzLi4OPjRvW)

![Click on "Sign" button](/files/QY6B9YaTFtyNmnG9mQ8z)

## Done!

Note: If you're performing the Wallet Validation on a smartphone (Android/IOS) please open the MetaMask app first and then go to the Menu and select Browser.&#x20;


# Contract Upgrade

Step by Step guide to upgrade to the new Contract

## Login to your MetaMask wallet

![](/files/MBxr60qZhGYoJCq02cbR)

## Expand View

![Click on Expand View](/files/QM8wqUGYVZTBIxiPNwj2)

Open ETNY Token page

![Open ETNY page](/files/abcvGNOsn8MC1er6gQcH)

## Remove ETNY token from view&#x20;

![Click on "Hide ETNY"](/files/uRu1GctlkekMhsoXAp6z)

**Please note on mobile you have to hold on the ETNY token until the "Remove" option is shown**

## Confirm

![Click on "Hide" button](/files/9uVq4PP6IXiKwLwQEmuR)

## Import new contract

![Click on "Import Tokens"](/files/gNP37FAYhsMHCCqhljLb)

## Contract Address

**New contract address is 0x549A6E06BB2084100148D50F51CF77a3436C3Ae7**

![Add the new contract address and click on "Add Custom Token" button](/files/curBpSbOSlja7aQuBel0)

## Confirm

![Confirm the Import ](/files/GePJwrnEdxKgdyh8982Y)

## Done!

![New Contract has been loaded successfully](/files/wiCpd7KTKbSuC964OwfI)


# Receive ETNY - Optional step

Receiving ETNY is easy !

### Copy to clipboard

Click on "Copy to clipboard" button and then share this string of characters to whoever wants to send you ETNY. In our case the public address is 0x20a6...B903.

That's it! The network block time is 5 seconds, however It could take up to 30 seconds for the transaction to be confirmed.

![](/files/-MZF4YKswGyHS3D2yaKC)


# Send ETNY - Optional step

How to sent ETNY

### Bergs

In order to send ETNY from one wallet to another or to pay for computing tasks you will need bergs from the Bloxberg blockchain to pay the transaction fee. In order to obtain bergs you will need to go to <https://faucet.bloxberg.org/> and request bergs for free. Just put use your public wallet address and your bergs will be added to your wallet in up to 2 minutes.&#x20;

![](/files/iAfyCiM49keNGuX1vG0Q)

### Send ETNY

To send ETNY you have to click on "Send ETNY" button as shown below. Please note the button will be shown when you hover with your mouse next to the arrow.

![Click on "SEND ETNY"](/files/-MZIdUs8FRaejZ3N1RIN)

### Add Recipient

Paste the public wallet address of the person you want to sent ETNY and click Next. In this case from my 2 ETNY I'm going to send 1 ETNY to **0x2a97...1021.** The transaction fee will be paid in **bergs** so make sure you have bergs available!

![Click Next after you've pasted the wallet address](/files/-MZFOPUB5z6oF5VpAK8S)

### Confirm

Please confirm the transfer.

![Click "Confirm"](/files/-MZFOwcvYK4ZByilGrzU)

### Pending

While you wait for the transaction to be completed you can see the Status of the transaction by clicking on the ETNY Token.

![](/files/-MZFPELkgUbayZ9Cn-wj)

### Success

After a short period of time you can see the transaction has been successful.

![](/files/-MZFPTVfIYTrib7-5apt)

### Transaction details

You can also see the transaction details by clicking on the "Send ETNY" button after the transaction has been completed

![](/files/-MZFQDBv9yep0AkCIpJ7)


# Change RPC URL

From core.bloxberg.org to bloxberg.ethernity.cloud

The instructions below show how to change the RPC server from the existing core.bloxberg.org to the new bloxberg.ethernity.cloud. Due to the overwhelming number of MetaMask wallets connected to the Bloxberg network we are changing the RPC URL for a better user experience.&#x20;

1. **Login to MetaMask as shown below.**

<figure><img src="/files/Agda7BQuDhFSXJZHiHHM" alt=""><figcaption><p>Login</p></figcaption></figure>

2. **Open Settings**

<figure><img src="/files/a9uwxd3NoNbSmR9D7qN6" alt=""><figcaption><p>Settings</p></figcaption></figure>

3. **Select Networks**

<figure><img src="/files/56L7zagda1osZeI9FmoO" alt=""><figcaption><p>Networks</p></figcaption></figure>

4. Select Bloxberg

<figure><img src="/files/aiS1d0pX3bL566WMsZXh" alt=""><figcaption><p>Bloxberg</p></figcaption></figure>

5. Change RPC URL details as shown below

<figure><img src="/files/QsqQKrdo7hHdskz7mMRg" alt=""><figcaption><p>New RPC URL</p></figcaption></figure>

That's it! Thank you for continuous support.


# Round 1




---

[Next Page](/llms-full.txt/1)

